From 0a5156b6b45a2fe6302b4047a7fc7f653e63426c Mon Sep 17 00:00:00 2001 From: season Date: Wed, 3 May 2023 14:54:20 -0400 Subject: [PATCH 001/135] headfixed2FC_task --- headfixed2FC_task.py | 28 +++++++--------------------- session_info_headfixed2FC.py | 1 + 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/headfixed2FC_task.py b/headfixed2FC_task.py index 9b28b8a..b819bec 100644 --- a/headfixed2FC_task.py +++ b/headfixed2FC_task.py @@ -205,7 +205,6 @@ def run(self): self.restart() # first detect the lick signal: cue_state = self.current_card[0] - # side_choice = self.current_card[2] side_mice = None if self.event_name == "left_entry": side_mice = 'left' @@ -222,34 +221,32 @@ def run(self): if cue_state == 'all': side_choice = side_mice if side_choice == 'left': - reward_size = self.current_card[2][0] + reward_size = random.uniform(self.current_card[2][0] - self.session_info['reward_deviation'], + self.current_card[2][0] + self.session_info['reward_deviation']) pump_num = self.current_card[3][0] elif side_choice == 'right': - reward_size = self.current_card[2][1] + reward_size = random.uniform(self.current_card[2][1] - self.session_info['reward_deviation'], + self.current_card[2][1] + self.session_info['reward_deviation']) pump_num = self.current_card[3][1] else: side_choice = self.current_card[1] - reward_size = self.current_card[2] + reward_size = random.uniform(self.current_card[2] - self.session_info['reward_deviation'], + self.current_card[2] + self.session_info['reward_deviation']) pump_num = self.current_card[3] if side_mice == side_choice: # if the animal chose correctly print("Number of lick detected: " + str(self.lick_count)) if self.lick_count == 0: # if this is the first lick - # self.side_mice_buffer = side_mice - self.pump.reward(pump_num, self.session_info["reward_size"][reward_size]) + self.pump.reward(pump_num, reward_size) self.total_reward += 1 self.correct_trial_in_block += 1 self.reward_time_start = time.time() print("Reward time start" + str(self.reward_time_start)) self.lick_count += 1 - elif self.side_mice_buffer: if self.lick_count == 0: self.check_cue('sound2') self.wrong_choice_error = True self.restart() - #else: # wrong side - wrong_choice error - # self.multiple_choice_error = True - # self.restart() # look for keystrokes self.box.check_keybd() @@ -331,11 +328,6 @@ def exit_reward_available(self): self.error_repeat = True self.error_list.append('wrong_choice_error') self.wrong_choice_error = False - #elif self.multiple_choice_error: - # logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) - # self.error_repeat = False - # self.error_list.append('multiple_choice_error') - # self.multiple_choice_error = False elif self.lick_count == 0: logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) self.error_repeat = True @@ -361,15 +353,12 @@ def check_cue(self, cue): self.box.cueLED2.on() logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) elif cue =='all': - #self.box.cueLED1.blink(0.2, 0.1) self.box.cueLED1.on() self.box.cueLED2.on() logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) def cue_off(self, cue): if cue == 'all': - #self.box.sound1.off() - #self.box.sound2.off() self.box.cueLED1.off() self.box.cueLED2.off() elif cue == 'sound1': @@ -380,7 +369,6 @@ def cue_off(self, cue): logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) elif cue == 'LED_L': self.box.cueLED1.off() - #self.LED_blink = False logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) elif cue == 'LED_R': self.box.cueLED2.off() @@ -406,8 +394,6 @@ def update_plot_error(self): ticks = range(len(counts)) fig, ax = plt.subplots(1, 1, ) ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) ax = plt.gca() ax.set_xticks(ticks, labels) ax.set_xticklabels(labels=labels, rotation=70) diff --git a/session_info_headfixed2FC.py b/session_info_headfixed2FC.py index 54c165c..96e24d2 100644 --- a/session_info_headfixed2FC.py +++ b/session_info_headfixed2FC.py @@ -55,6 +55,7 @@ session_info['choice'] = ['right', 'left'] # lick port session_info['reward'] = ['small', 'large'] # reward size session_info['reward_size'] = {'small': 5, 'large': 10} +session_info['reward_deviation'] = 1 if session_info['phase'] == 1: session_info['reward_size'] = {'small': 10, 'large': 10} From 3e8f75cd1500664eaf9afa4c9e09f56d8bbc7fe5 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 4 May 2023 11:10:02 -0400 Subject: [PATCH 002/135] headfixed2FC_task --- headfixed2FC_task.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/headfixed2FC_task.py b/headfixed2FC_task.py index b819bec..cd75c57 100644 --- a/headfixed2FC_task.py +++ b/headfixed2FC_task.py @@ -221,17 +221,20 @@ def run(self): if cue_state == 'all': side_choice = side_mice if side_choice == 'left': - reward_size = random.uniform(self.current_card[2][0] - self.session_info['reward_deviation'], - self.current_card[2][0] + self.session_info['reward_deviation']) + left_reward = self.session_info['reward_size'][self.current_card[2][0]] + reward_size = random.uniform(left_reward - self.session_info['reward_deviation'], + left_reward + self.session_info['reward_deviation']) pump_num = self.current_card[3][0] elif side_choice == 'right': - reward_size = random.uniform(self.current_card[2][1] - self.session_info['reward_deviation'], - self.current_card[2][1] + self.session_info['reward_deviation']) + right_reward = self.session_info['reward_size'][self.current_card[2][1]] + reward_size = random.uniform(right_reward - self.session_info['reward_deviation'], + right_reward + self.session_info['reward_deviation']) pump_num = self.current_card[3][1] else: side_choice = self.current_card[1] - reward_size = random.uniform(self.current_card[2] - self.session_info['reward_deviation'], - self.current_card[2] + self.session_info['reward_deviation']) + forced_reward = self.session_info['reward_size'][self.current_card[2]] + reward_size = random.uniform(forced_reward - self.session_info['reward_deviation'], + forced_reward + self.session_info['reward_deviation']) pump_num = self.current_card[3] if side_mice == side_choice: # if the animal chose correctly print("Number of lick detected: " + str(self.lick_count)) From 7d90e4bc7ac3c8f6e1c56562e4a39aec63099a2a Mon Sep 17 00:00:00 2001 From: season Date: Tue, 16 May 2023 12:28:06 -0400 Subject: [PATCH 003/135] new tube_fit after new tubing replacement --- behavbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/behavbox.py b/behavbox.py index caeb719..8305805 100755 --- a/behavbox.py +++ b/behavbox.py @@ -506,7 +506,7 @@ def reward(self, which_pump, reward_size): # coefficient_1 = coefficient_fit[-1] # coefficient_2 = coefficient_fit[-2] # coefficient_3 = coefficient_fit[-3] - reward_size - tube_fit = 0.11609 # ml/s + tube_fit = 0.13 # ml/s # discriminant = coefficient_2 ** 2 - 4 * coefficient_1 * coefficient_3 # # find solution, i.e. duration of pulse, by calculating the solution for the quadratic equation # solution = np.array([(-coefficient_2 + np.sqrt(discriminant)) / (2 * coefficient_1), From 14b5934630cd7c6b7580586b9a265c0d8f86e5ac Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 12:19:09 -0400 Subject: [PATCH 004/135] calibration --- behavbox.py | 166 +++++++++++++++++++++++++++++-------------- headfixed2FC_task.py | 7 +- 2 files changed, 115 insertions(+), 58 deletions(-) diff --git a/behavbox.py b/behavbox.py index caeb719..2b5a8cc 100755 --- a/behavbox.py +++ b/behavbox.py @@ -103,14 +103,34 @@ def __init__(self, session_info): self.DIO5 = LED(11) # there is a DIO6, but that is the same pin as the camera strobe + ############################################################################################### + # IR detection - for nosepoke + ############################################################################################### + self.IR_rx1 = Button(5, None, True) # None, True inverts the signal so poke=True, no-poke=False + self.IR_rx2 = Button(6, None, True) + self.IR_rx3 = Button(12, None, True) + self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use + self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use + + # link nosepoke event detections to callbacks + self.IR_rx1.when_pressed = self.IR_1_entry + self.IR_rx2.when_pressed = self.IR_2_entry + self.IR_rx3.when_pressed = self.IR_3_entry + self.IR_rx4.when_pressed = self.IR_4_entry + self.IR_rx5.when_pressed = self.IR_5_entry + self.IR_rx1.when_released = self.IR_1_exit + self.IR_rx2.when_released = self.IR_2_exit + self.IR_rx3.when_released = self.IR_3_exit + self.IR_rx4.when_released = self.IR_4_exit + self.IR_rx5.when_released = self.IR_5_exit ############################################################################################### # IR detection - for nosepoke detection ############################################################################################### self.lick1 = Button(26, None, True) self.lick2 = Button(27, None, True) self.lick3 = Button(15, None, True) - self.reserved_rx1 = Button(13, None, True) # for mitch - self.reserved_rx2 = Button(16, None, True) # for mitch + #self.reserved_rx1 = Button(13, None, True) # for mitch + #self.reserved_rx2 = Button(16, None, True) # for mitch # # # link nosepoke event detections to callbacks self.lick1.when_pressed = self.left_exit @@ -121,10 +141,10 @@ def __init__(self, session_info): self.lick2.when_released = self.right_entry self.lick3.when_released = self.center_entry - self.reserved_rx1.when_pressed = self.reserved_rx1_pressed - self.reserved_rx2.when_pressed = self.reserved_rx2_pressed - self.reserved_rx1.when_released = self.reserved_rx1_released - self.reserved_rx2.when_released = self.reserved_rx2_released + # self.reserved_rx1.when_pressed = self.reserved_rx1_pressed + # self.reserved_rx2.when_pressed = self.reserved_rx2_pressed + # self.reserved_rx1.when_released = self.reserved_rx1_released + # self.reserved_rx2.when_released = self.reserved_rx2_released ############################################################################################### # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors @@ -142,7 +162,7 @@ def __init__(self, session_info): ############################################################################################### # pump: trigger signal output to a driver board induce the solenoid valve to deliver reward ############################################################################################### - self.pump = Pump() + self.pump = Pump(self.session_info) ############################################################################################### # flipper strobe signal (previously called camera strobe signal) @@ -260,19 +280,22 @@ def check_keybd(self): self.keyboard_active = False elif event.key == pygame.K_1: self.left_entry() + self.left_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") elif event.key == pygame.K_2: self.center_entry() + self.center_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") elif event.key == pygame.K_3: self.right_entry() + self.right_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") - elif event.key == pygame.K_4: - self.reserved_rx1_pressed() - logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") - elif event.key == pygame.K_5: - self.reserved_rx2_pressed() - logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") + # elif event.key == pygame.K_4: + # self.reserved_rx1_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") + # elif event.key == pygame.K_5: + # self.reserved_rx2_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") @@ -455,27 +478,65 @@ def right_exit(self): self.interact_list.append((time.time(), "right_exit")) logging.info(";" + str(time.time()) + ";[action];right_exit") - def reserved_rx1_pressed(self): - self.event_list.append("reserved_rx1_pressed") - self.interact_list.append((time.time(), "reserved_rx1_pressed")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") - - def reserved_rx2_pressed(self): - self.event_list.append("reserved_rx2_pressed") - self.interact_list.append((time.time(), "reserved_rx2_pressed")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") - - def reserved_rx1_released(self): - self.event_list.append("reserved_rx1_released") - self.interact_list.append((time.time(), "reserved_rx1_released")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") - - def reserved_rx2_released(self): - self.event_list.append("reserved_rx2_released") - self.interact_list.append((time.time(), "reserved_rx2_released")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") - - + # def reserved_rx1_pressed(self): + # self.event_list.append("reserved_rx1_pressed") + # self.interact_list.append((time.time(), "reserved_rx1_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") + # + # def reserved_rx2_pressed(self): + # self.event_list.append("reserved_rx2_pressed") + # self.interact_list.append((time.time(), "reserved_rx2_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") + # + # def reserved_rx1_released(self): + # self.event_list.append("reserved_rx1_released") + # self.interact_list.append((time.time(), "reserved_rx1_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") + # + # def reserved_rx2_released(self): + # self.event_list.append("reserved_rx2_released") + # self.interact_list.append((time.time(), "reserved_rx2_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") + def IR_1_entry(self): + self.event_list.append("IR_1_entry") + logging.info(str(time.time()) + ", IR_1_entry") + + def IR_2_entry(self): + self.event_list.append("IR_2_entry") + logging.info(str(time.time()) + ", IR_2_entry") + + def IR_3_entry(self): + self.event_list.append("IR_3_entry") + logging.info(str(time.time()) + ", IR_3_entry") + + def IR_4_entry(self): + self.event_list.append("IR_4_entry") + logging.info(str(time.time()) + ", IR_4_entry") + + def IR_5_entry(self): + self.event_list.append("IR_5_entry") + logging.info(str(time.time()) + ", IR_5_entry") + + def IR_1_exit(self): + self.event_list.append("IR_1_exit") + logging.info(str(time.time()) + ", IR_1_exit") + + def IR_2_exit(self): + self.event_list.append("IR_2_exit") + # self.cueLED2.off() + logging.info(str(time.time()) + ", IR_2_exit") + + def IR_3_exit(self): + self.event_list.append("IR_3_exit") + logging.info(str(time.time()) + ", IR_3_exit") + + def IR_4_exit(self): + self.event_list.append("IR_4_exit") + logging.info(str(time.time()) + ", IR_4_exit") + + def IR_5_exit(self): + self.event_list.append("IR_5_exit") + logging.info(str(time.time()) + ", IR_5_exit") # this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) # currently. BoxLED.set_value is the saved intensity value that determines how bright the @@ -491,7 +552,8 @@ def on( class Pump(object): - def __init__(self): + def __init__(self, session_info): + self.session_info = session_info self.pump1 = LED(19) self.pump2 = LED(20) self.pump3 = LED(21) @@ -502,44 +564,38 @@ def __init__(self): # visualization def reward(self, which_pump, reward_size): - # coefficient_fit = np.array([8.78674242e-04, 7.33609848e-02, 1.47535000e+00]) # further calibration is needed - # coefficient_1 = coefficient_fit[-1] - # coefficient_2 = coefficient_fit[-2] - # coefficient_3 = coefficient_fit[-3] - reward_size - tube_fit = 0.11609 # ml/s - # discriminant = coefficient_2 ** 2 - 4 * coefficient_1 * coefficient_3 - # # find solution, i.e. duration of pulse, by calculating the solution for the quadratic equation - # solution = np.array([(-coefficient_2 + np.sqrt(discriminant)) / (2 * coefficient_1), - # (-coefficient_2 - np.sqrt(discriminant)) / (2 * coefficient_1)]) - - # With two solution, get the positive value - # solution_positive = solution[(solution > 0).nonzero()[0][0]] - # round to the second decimal - # duration = round(solution_positive, 3) * (10**-3) - - duration = round((reward_size/1000)/tube_fit, 3) - duration_vacuum = 0.5 + # import coefficient from the session_information + coefficient_p1 = self.session_info["calibration_coefficient"]['1'] + coefficient_p2 = self.session_info["calibration_coefficient"]['2'] + coefficient_p3 = self.session_info["calibration_coefficient"]['3'] + coefficient_p4 = self.session_info["calibration_coefficient"]['4'] + duration_air = self.session_info['air_duration'] + duration_vac = self.session_info["vacuum_duration"] if which_pump == "1": + duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 3) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) elif which_pump == "2": + duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) elif which_pump == "3": + duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 3) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward_" + str(reward_size)) elif which_pump == "4": + duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 3) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "air_puff": - self.pump_air.blink(duration, 0.1, 1) + self.pump_air.blink(duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": - self.pump_vacuum.blink(duration_vacuum, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum") \ No newline at end of file + self.pump_vacuum.blink(duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) \ No newline at end of file diff --git a/headfixed2FC_task.py b/headfixed2FC_task.py index cd75c57..996b29b 100644 --- a/headfixed2FC_task.py +++ b/headfixed2FC_task.py @@ -123,8 +123,8 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa self.wrong_choice_error = False self.multiple_choice_error = False self.error_repeat = False - self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward self.reward_times_up = False self.block_count = 0 @@ -160,6 +160,7 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa # session_statistics self.total_reward = 0 self.correct_trial_in_block = 0 + ######################################################################## # functions called when state transitions occur ######################################################################## @@ -355,7 +356,7 @@ def check_cue(self, cue): # self.LED_blink = True self.box.cueLED2.on() logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) - elif cue =='all': + elif cue == 'all': self.box.cueLED1.on() self.box.cueLED2.on() logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) From 7da41ca6e7e97b370022ef8ff37d30c2b692b4db Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:04:20 -0400 Subject: [PATCH 005/135] new task with headfixed_independent_reward --- behavbox.py | 8 +- headfixed_independent_reward_task.py | 461 +++++++++++++++++++ reward_distribution.py | 24 + run_headfixed_independent_reward_task.py | 166 +++++++ session_info_headfixed_independent_reward.py | 115 +++++ task_information_independent_reward.py | 26 ++ 6 files changed, 796 insertions(+), 4 deletions(-) create mode 100644 headfixed_independent_reward_task.py create mode 100644 reward_distribution.py create mode 100644 run_headfixed_independent_reward_task.py create mode 100644 session_info_headfixed_independent_reward.py create mode 100644 task_information_independent_reward.py diff --git a/behavbox.py b/behavbox.py index 2b5a8cc..9dcaf73 100755 --- a/behavbox.py +++ b/behavbox.py @@ -573,22 +573,22 @@ def reward(self, which_pump, reward_size): duration_vac = self.session_info["vacuum_duration"] if which_pump == "1": - duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 3) # linear function + duration = round((reward_size / 1000)/(coefficient_p1[0] + coefficient_p1[1]), 3) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) elif which_pump == "2": - duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 3) # linear function + duration = round((reward_size / 1000)/(coefficient_p2[0] + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) elif which_pump == "3": - duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 3) # linear function + duration = round(((reward_size / 1000)/coefficient_p3[0] + coefficient_p3[1]), 3) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward_" + str(reward_size)) elif which_pump == "4": - duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 3) # linear function + duration = round(((reward_size / 1000)/coefficient_p4[0] + coefficient_p4[1]), 3) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py new file mode 100644 index 0000000..5d9d7f7 --- /dev/null +++ b/headfixed_independent_reward_task.py @@ -0,0 +1,461 @@ +# python3: headfixed_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-05-23 +name: headfixed_independent_reward_task.py +goal: model_free reinforcement learning behavioral training task structure +description: + an updated test version of headfixed_task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class HeadfixedIndependentRewardTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = False + self.multiple_choice_error = False + self.error_repeat = False + self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + self.current_reward = None + + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + # print("beeeeeeep") # debug signal + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + # if self.LED_blink: + # self.box.cueLED1.blink(0.2, 0.1) + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + if not self.reward_times_up: + if self.reward_time_start: + if time.time() >= self.reward_time_start + self.reward_time: + self.restart() + # first detect the lick signal: + cue_state = self.current_card[0] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + if cue_state == 'all': + side_choice = side_mice + if side_choice == 'left': + reward_size = self.session_info['reward_size'][self.current_card[2][0]] + # left_reward = self.session_info['reward_size'][self.current_card[2][0]] + # reward_size = random.uniform(left_reward - self.session_info['reward_deviation'], + # left_reward + self.session_info['reward_deviation']) + pump_num = self.current_card[2][0] + elif side_choice == 'right': + reward_size = self.session_info['reward_size'][self.current_card[2][1]] + # right_reward = self.session_info['reward_size'][self.current_card[2][1]] + # reward_size = random.uniform(right_reward - self.session_info['reward_deviation'], + # right_reward + self.session_info['reward_deviation']) + pump_num = self.current_card[2][1] + else: + side_choice = self.current_card[1] + # forced_reward = self.current_reward + reward_size = self.current_reward + # reward_size = random.uniform(forced_reward - self.session_info['reward_deviation'], + # forced_reward + self.session_info['reward_deviation']) + pump_num = self.current_card[2] + if side_mice == side_choice: # if the animal chose correctly + print("Number of lick detected: " + str(self.lick_count)) + if self.lick_count == 0: # if this is the first lick + self.pump.reward(pump_num, reward_size) + self.total_reward += 1 + self.reward_time_start = time.time() + print("Reward time start" + str(self.reward_time_start)) + self.lick_count += 1 + elif self.side_mice_buffer: + if self.lick_count == 0: + self.check_cue('sound2') + self.wrong_choice_error = True + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + self.early_lick_error = False + self.lick_count = 0 + self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + self.cue_off('sound1') + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") + self.cue_off(self.current_card[0]) + self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + self.reward_times_up = True + self.pump.reward("vaccum", 0) + if self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('wrong_choice_error') + self.wrong_choice_error = False + elif self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('no_choice_error') + else: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.error_list.append('correct_trial') + self.lick_count = 0 + self.reward_time_start = None + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1, 0.1, 1) + elif cue == 'LED_L': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) + elif cue == 'LED_R': + # self.LED_blink = True + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) + elif cue == 'all': + self.box.cueLED1.on() + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.cueLED1.off() + self.box.cueLED2.off() + elif cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'LED_L': + self.box.cueLED1.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() diff --git a/reward_distribution.py b/reward_distribution.py new file mode 100644 index 0000000..d757c10 --- /dev/null +++ b/reward_distribution.py @@ -0,0 +1,24 @@ +import numpy as np + +def generate_reward_trajectory(scale==0.5, offset==3.0, change_point==20, ntrials==200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials/change_point)): + temp = np.random.randn(change_point)*scale + rewards_L.append(np.cumsum(temp, axis=-1) + offset) + temp = np.random.randn(change_point)*scale + rewards_R.append(np.cumsum(temp, axis=-1) + offset) + rewards_L=np.hstack(rewards_L) + rewards_R=np.hstack(rewards_R) + #plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials,:] + print(reward_LR) + return reward_LR + +# session_information['reward']['scale'] +# session_information['reward']['offset'] +# session_information['reward']['change_point'] +# session_information['reward']['ntrials'] \ No newline at end of file diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py new file mode 100644 index 0000000..d346d9b --- /dev/null +++ b/run_headfixed_independent_reward_task.py @@ -0,0 +1,166 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed2FC_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: run_headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training run task file +description: + an updated test version of run_headfixed_task.py + +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed_independent_reward_task import HeadfixedIndependentRewardTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/headfixed2FC_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_headfixed2FC import TaskInformation + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + task = Headfixed2FCTask(name="headfixed2FC_task", session_info=session_info) + + from reward_distribution import generate_reward_trajectory + scale = session_info['reward']['scale'] + offset = session_info['reward']['offset'] + change_point = session_info['reward']['change_point'] + ntrials = session_info['reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) ## wll add in the session info + t_end = time.time() + 60 * t_minute + while time.time() < t_end: + first_card = True + task.error_count = 0 + print("Trial " + str(task.trial_number) + " \n") + task.trial_number += 1 + print("*******************************\n") + task.current_card = task_information.draw_card(session_info['phase']) + task.current_reward = reward_distribution_list[task.trial_number] + logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) + print(" - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n") + while first_card or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ + "error_max"]): + if time.time() >= t_end: + print("Times up, finishing up") + break + if task.error_repeat: + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("*error_repeat trial* \n" + + " - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n") + task.trial_number += 1 + first_card = False + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py new file mode 100644 index 0000000..af5327c --- /dev/null +++ b/session_info_headfixed_independent_reward.py @@ -0,0 +1,115 @@ +from datetime import datetime +import os +import pysistence, collections +import socket +import pandas as pd +import numpy as np + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 0.0 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() +session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts + +session_info['config'] = 'headfixed2FC' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 1 +# visual stimulus +session_info["visual_stimulus"] = False + +session_info['config'] = 'headfixed2FC' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +session_info['phase'] = 'forced_choice' + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_cue'] = 5 # cm + session_info['treadmill_setup']['distance_initiation'] = 10 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['LED_L', 'LED_R', 'all'] +# session_info['state'] = ['block1', 'block2'] # +session_info['choice'] = ['right', 'left'] # lick port +session_info['reward'] = ['small', 'large'] # reward size +session_info['reward_size'] = {'small': 5, 'large': 10} +session_info['air_duration'] = 0 +session_info["vacuum_duration"] = 1 + +""" solenoid calibration information configuration """ + +solenoid_coeff = None +def get_coefficient(): + df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") + pump_coefficient = {} + + for pump_num in range(1, 5): + df_pump = df_calibration[df_calibration['pump_number'] == pump_num] + mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) + on_time = df_pump['on_time'] + + fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first + pump_coefficient[str(pump_num)] = fit_calibration + return pump_coefficient + +try: + solenoid_coeff = get_coefficient() +except Exception as e: + print(e) + +session_info["calibration_coefficient"] = {} + +if solenoid_coeff: + session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] + session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] + session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] + session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] +else: + print("No coefficients, generate the default") + # solenoid valve linear fit coefficient for each pump + session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first + session_info["calibration_coefficient"]['2'] = [0.13, 0] + session_info["calibration_coefficient"]['3'] = [0.13, 0.0] + session_info["calibration_coefficient"]['4'] = [0.13, 0.0] + +if session_info['phase'] == 1: + session_info['reward_size'] = {'small': 10, 'large': 10} +# print(session_info["calibration_coefficient"]) + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['reward_timeout'] = 60 +session_info["punishment_timeout"] = 3 + +# define block_duration and initial block to start the session +session_info['block_duration'] = 30 # each block has this amount of repetition +session_info['block_variety'] = 2 +if session_info['block_variety'] > 1: + session_info['initial_block'] = 1 + +session_info['consecutive_control'] = False +if session_info['consecutive_control']: + session_info['consecutive_max'] = 3 \ No newline at end of file diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py new file mode 100644 index 0000000..bdb7296 --- /dev/null +++ b/task_information_independent_reward.py @@ -0,0 +1,26 @@ +import random + + +class TaskInformation(object): + def __init__(self, **kwargs): + self.name = "model_based_reinforcement_learning_task" + self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), ('all', ('left', 'right'), ('1', '2'))] + + def draw_card(self, phase="final"): + row_start = 0 + row_end = 2 + if phase == 'final': + pass + elif phase == 'forced_choice': + row_end = 1 + elif phase == 'free_choice': + row_start = 2 + elif phase == 'forced_choice_left': + row_end = 0 + elif phase == 'forced_choice_right': + row_start = 1 + row_end = 1 + card = self.deck[random.randint(row_start, row_end)] + return card + +# print(TaskInformation().draw_card()) From 4d4dc002d47acf1eeb8e35279884f649e0975fb7 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:11:11 -0400 Subject: [PATCH 006/135] new task with headfixed_independent_reward --- reward_distribution.py | 4 ++-- run_headfixed_independent_reward_task.py | 22 +++++++++++++++++++- session_info_headfixed_independent_reward.py | 13 ++++++++---- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/reward_distribution.py b/reward_distribution.py index d757c10..8a066b2 100644 --- a/reward_distribution.py +++ b/reward_distribution.py @@ -1,6 +1,6 @@ import numpy as np -def generate_reward_trajectory(scale==0.5, offset==3.0, change_point==20, ntrials==200): +def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): # initial reward (need to be random) rewards_L = [1] rewards_R = [1] @@ -17,7 +17,7 @@ def generate_reward_trajectory(scale==0.5, offset==3.0, change_point==20, ntrial reward_LR = reward_LR[0:ntrials,:] print(reward_LR) return reward_LR - +# generate_reward_trajectory() # session_information['reward']['scale'] # session_information['reward']['offset'] # session_information['reward']['change_point'] diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index d346d9b..78859c2 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -10,6 +10,7 @@ """ import random +import numpy as np from transitions import Machine from transitions import State from icecream import ic @@ -92,11 +93,30 @@ # print("Imported task_information_headfixed: " + str(task_information.name)) task = Headfixed2FCTask(name="headfixed2FC_task", session_info=session_info) - from reward_distribution import generate_reward_trajectory + def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials / change_point)): + temp = np.random.randn(change_point) * scale + rewards_L.append(np.cumsum(temp, axis=-1) + offset) + temp = np.random.randn(change_point) * scale + rewards_R.append(np.cumsum(temp, axis=-1) + offset) + rewards_L = np.hstack(rewards_L) + rewards_R = np.hstack(rewards_R) + # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials, :] + print(reward_LR) + return reward_LR + + # from reward_distribution import generate_reward_trajectory scale = session_info['reward']['scale'] offset = session_info['reward']['offset'] change_point = session_info['reward']['change_point'] ntrials = session_info['reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index af5327c..591ced9 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -104,11 +104,16 @@ def get_coefficient(): session_info['reward_timeout'] = 60 session_info["punishment_timeout"] = 3 +session_information['reward']['scale'] = 0.5 +session_information['reward']['offset'] = 3.0 +session_information['reward']['change_point'] = 20 +session_information['reward']['ntrials'] = 1000 + # define block_duration and initial block to start the session -session_info['block_duration'] = 30 # each block has this amount of repetition -session_info['block_variety'] = 2 -if session_info['block_variety'] > 1: - session_info['initial_block'] = 1 +# session_info['block_duration'] = 30 # each block has this amount of repetition +# session_info['block_variety'] = 2 +# if session_info['block_variety'] > 1: +# session_info['initial_block'] = 1 session_info['consecutive_control'] = False if session_info['consecutive_control']: From 15c9b596620ad1d39203b4914db4dcafa24a8c42 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:13:14 -0400 Subject: [PATCH 007/135] new task with headfixed_independent_reward --- run_headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 78859c2..a7fdee6 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -57,7 +57,7 @@ full_module_name = 'session_info_' + datestr import sys - session_info_path = '/home/pi/experiment_info/headfixed2FC_task/session_info' + session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' sys.path.insert(0, session_info_path) tempmod = importlib.import_module(full_module_name) session_info = tempmod.session_info From a8b335515bbf250961a2d7cc4ec45c6b93ce4140 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:16:08 -0400 Subject: [PATCH 008/135] new task with headfixed_independent_reward --- run_headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index a7fdee6..72febe5 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -132,8 +132,8 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # Set a timer t_minute = int(input("Enter the time in minutes: ")) ## wll add in the session info t_end = time.time() + 60 * t_minute + first_card = True while time.time() < t_end: - first_card = True task.error_count = 0 print("Trial " + str(task.trial_number) + " \n") task.trial_number += 1 From 88e9ff5ffaace5442f37d9ce10e5b8796030f6c1 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:31:24 -0400 Subject: [PATCH 009/135] new task with headfixed_independent_reward --- session_info_headfixed_independent_reward.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 591ced9..2c1bef6 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -104,10 +104,10 @@ def get_coefficient(): session_info['reward_timeout'] = 60 session_info["punishment_timeout"] = 3 -session_information['reward']['scale'] = 0.5 -session_information['reward']['offset'] = 3.0 -session_information['reward']['change_point'] = 20 -session_information['reward']['ntrials'] = 1000 +session_info['reward']['scale'] = 0.5 +session_info['reward']['offset'] = 3.0 +session_info['reward']['change_point'] = 20 +session_info['reward']['ntrials'] = 1000 # define block_duration and initial block to start the session # session_info['block_duration'] = 30 # each block has this amount of repetition From 17efbb6b5ca4dece68d476e701f44bf72575f30c Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:33:03 -0400 Subject: [PATCH 010/135] new task with headfixed_independent_reward --- session_info_headfixed_independent_reward.py | 1 + 1 file changed, 1 insertion(+) diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 2c1bef6..bca56a1 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -104,6 +104,7 @@ def get_coefficient(): session_info['reward_timeout'] = 60 session_info["punishment_timeout"] = 3 +session_info['reward'] = {} session_info['reward']['scale'] = 0.5 session_info['reward']['offset'] = 3.0 session_info['reward']['change_point'] = 20 From 52d3c1cb9fac3ea71b043b36b447860eed438ed3 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:35:41 -0400 Subject: [PATCH 011/135] new task with headfixed_independent_reward --- run_headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 72febe5..8cb4bc3 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -91,7 +91,7 @@ from task_information_headfixed2FC import TaskInformation task_information = TaskInformation() # print("Imported task_information_headfixed: " + str(task_information.name)) - task = Headfixed2FCTask(name="headfixed2FC_task", session_info=session_info) + task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): # initial reward (need to be random) From 275615846522999f97cf2cbe6a12af22fa8f4b69 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 15:37:54 -0400 Subject: [PATCH 012/135] new task with headfixed_independent_reward --- run_headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 8cb4bc3..fc1ede9 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -88,7 +88,7 @@ ] ) - from task_information_headfixed2FC import TaskInformation + from task_information_independent_reward import TaskInformation task_information = TaskInformation() # print("Imported task_information_headfixed: " + str(task_information.name)) task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) From cb1bdee76ea7e10adc86c8f6960c89ac7dc26602 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 16:04:05 -0400 Subject: [PATCH 013/135] new task with headfixed_independent_reward --- behavbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/behavbox.py b/behavbox.py index 9dcaf73..439ef66 100755 --- a/behavbox.py +++ b/behavbox.py @@ -578,7 +578,7 @@ def reward(self, which_pump, reward_size): self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) elif which_pump == "2": - duration = round((reward_size / 1000)/(coefficient_p2[0] + coefficient_p2[1]), 3) # linear function + duration = np.round((reward_size / 1000)/(coefficient_p2[0] + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) From 84fd93771b541ef9e7a0f627e1a03fb0d0b4c1ac Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 16:10:45 -0400 Subject: [PATCH 014/135] calibration issue --- behavbox.py | 166 +++++++++++++++++----------------------------------- 1 file changed, 55 insertions(+), 111 deletions(-) diff --git a/behavbox.py b/behavbox.py index 439ef66..8305805 100755 --- a/behavbox.py +++ b/behavbox.py @@ -103,34 +103,14 @@ def __init__(self, session_info): self.DIO5 = LED(11) # there is a DIO6, but that is the same pin as the camera strobe - ############################################################################################### - # IR detection - for nosepoke - ############################################################################################### - self.IR_rx1 = Button(5, None, True) # None, True inverts the signal so poke=True, no-poke=False - self.IR_rx2 = Button(6, None, True) - self.IR_rx3 = Button(12, None, True) - self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use - self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use - - # link nosepoke event detections to callbacks - self.IR_rx1.when_pressed = self.IR_1_entry - self.IR_rx2.when_pressed = self.IR_2_entry - self.IR_rx3.when_pressed = self.IR_3_entry - self.IR_rx4.when_pressed = self.IR_4_entry - self.IR_rx5.when_pressed = self.IR_5_entry - self.IR_rx1.when_released = self.IR_1_exit - self.IR_rx2.when_released = self.IR_2_exit - self.IR_rx3.when_released = self.IR_3_exit - self.IR_rx4.when_released = self.IR_4_exit - self.IR_rx5.when_released = self.IR_5_exit ############################################################################################### # IR detection - for nosepoke detection ############################################################################################### self.lick1 = Button(26, None, True) self.lick2 = Button(27, None, True) self.lick3 = Button(15, None, True) - #self.reserved_rx1 = Button(13, None, True) # for mitch - #self.reserved_rx2 = Button(16, None, True) # for mitch + self.reserved_rx1 = Button(13, None, True) # for mitch + self.reserved_rx2 = Button(16, None, True) # for mitch # # # link nosepoke event detections to callbacks self.lick1.when_pressed = self.left_exit @@ -141,10 +121,10 @@ def __init__(self, session_info): self.lick2.when_released = self.right_entry self.lick3.when_released = self.center_entry - # self.reserved_rx1.when_pressed = self.reserved_rx1_pressed - # self.reserved_rx2.when_pressed = self.reserved_rx2_pressed - # self.reserved_rx1.when_released = self.reserved_rx1_released - # self.reserved_rx2.when_released = self.reserved_rx2_released + self.reserved_rx1.when_pressed = self.reserved_rx1_pressed + self.reserved_rx2.when_pressed = self.reserved_rx2_pressed + self.reserved_rx1.when_released = self.reserved_rx1_released + self.reserved_rx2.when_released = self.reserved_rx2_released ############################################################################################### # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors @@ -162,7 +142,7 @@ def __init__(self, session_info): ############################################################################################### # pump: trigger signal output to a driver board induce the solenoid valve to deliver reward ############################################################################################### - self.pump = Pump(self.session_info) + self.pump = Pump() ############################################################################################### # flipper strobe signal (previously called camera strobe signal) @@ -280,22 +260,19 @@ def check_keybd(self): self.keyboard_active = False elif event.key == pygame.K_1: self.left_entry() - self.left_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") elif event.key == pygame.K_2: self.center_entry() - self.center_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") elif event.key == pygame.K_3: self.right_entry() - self.right_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") - # elif event.key == pygame.K_4: - # self.reserved_rx1_pressed() - # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") - # elif event.key == pygame.K_5: - # self.reserved_rx2_pressed() - # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") + elif event.key == pygame.K_4: + self.reserved_rx1_pressed() + logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") + elif event.key == pygame.K_5: + self.reserved_rx2_pressed() + logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") @@ -478,65 +455,27 @@ def right_exit(self): self.interact_list.append((time.time(), "right_exit")) logging.info(";" + str(time.time()) + ";[action];right_exit") - # def reserved_rx1_pressed(self): - # self.event_list.append("reserved_rx1_pressed") - # self.interact_list.append((time.time(), "reserved_rx1_pressed")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") - # - # def reserved_rx2_pressed(self): - # self.event_list.append("reserved_rx2_pressed") - # self.interact_list.append((time.time(), "reserved_rx2_pressed")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") - # - # def reserved_rx1_released(self): - # self.event_list.append("reserved_rx1_released") - # self.interact_list.append((time.time(), "reserved_rx1_released")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") - # - # def reserved_rx2_released(self): - # self.event_list.append("reserved_rx2_released") - # self.interact_list.append((time.time(), "reserved_rx2_released")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") - def IR_1_entry(self): - self.event_list.append("IR_1_entry") - logging.info(str(time.time()) + ", IR_1_entry") - - def IR_2_entry(self): - self.event_list.append("IR_2_entry") - logging.info(str(time.time()) + ", IR_2_entry") - - def IR_3_entry(self): - self.event_list.append("IR_3_entry") - logging.info(str(time.time()) + ", IR_3_entry") - - def IR_4_entry(self): - self.event_list.append("IR_4_entry") - logging.info(str(time.time()) + ", IR_4_entry") - - def IR_5_entry(self): - self.event_list.append("IR_5_entry") - logging.info(str(time.time()) + ", IR_5_entry") - - def IR_1_exit(self): - self.event_list.append("IR_1_exit") - logging.info(str(time.time()) + ", IR_1_exit") - - def IR_2_exit(self): - self.event_list.append("IR_2_exit") - # self.cueLED2.off() - logging.info(str(time.time()) + ", IR_2_exit") - - def IR_3_exit(self): - self.event_list.append("IR_3_exit") - logging.info(str(time.time()) + ", IR_3_exit") - - def IR_4_exit(self): - self.event_list.append("IR_4_exit") - logging.info(str(time.time()) + ", IR_4_exit") - - def IR_5_exit(self): - self.event_list.append("IR_5_exit") - logging.info(str(time.time()) + ", IR_5_exit") + def reserved_rx1_pressed(self): + self.event_list.append("reserved_rx1_pressed") + self.interact_list.append((time.time(), "reserved_rx1_pressed")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") + + def reserved_rx2_pressed(self): + self.event_list.append("reserved_rx2_pressed") + self.interact_list.append((time.time(), "reserved_rx2_pressed")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") + + def reserved_rx1_released(self): + self.event_list.append("reserved_rx1_released") + self.interact_list.append((time.time(), "reserved_rx1_released")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") + + def reserved_rx2_released(self): + self.event_list.append("reserved_rx2_released") + self.interact_list.append((time.time(), "reserved_rx2_released")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") + + # this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) # currently. BoxLED.set_value is the saved intensity value that determines how bright the @@ -552,8 +491,7 @@ def on( class Pump(object): - def __init__(self, session_info): - self.session_info = session_info + def __init__(self): self.pump1 = LED(19) self.pump2 = LED(20) self.pump3 = LED(21) @@ -564,38 +502,44 @@ def __init__(self, session_info): # visualization def reward(self, which_pump, reward_size): - # import coefficient from the session_information - coefficient_p1 = self.session_info["calibration_coefficient"]['1'] - coefficient_p2 = self.session_info["calibration_coefficient"]['2'] - coefficient_p3 = self.session_info["calibration_coefficient"]['3'] - coefficient_p4 = self.session_info["calibration_coefficient"]['4'] - duration_air = self.session_info['air_duration'] - duration_vac = self.session_info["vacuum_duration"] + # coefficient_fit = np.array([8.78674242e-04, 7.33609848e-02, 1.47535000e+00]) # further calibration is needed + # coefficient_1 = coefficient_fit[-1] + # coefficient_2 = coefficient_fit[-2] + # coefficient_3 = coefficient_fit[-3] - reward_size + tube_fit = 0.13 # ml/s + # discriminant = coefficient_2 ** 2 - 4 * coefficient_1 * coefficient_3 + # # find solution, i.e. duration of pulse, by calculating the solution for the quadratic equation + # solution = np.array([(-coefficient_2 + np.sqrt(discriminant)) / (2 * coefficient_1), + # (-coefficient_2 - np.sqrt(discriminant)) / (2 * coefficient_1)]) + + # With two solution, get the positive value + # solution_positive = solution[(solution > 0).nonzero()[0][0]] + # round to the second decimal + # duration = round(solution_positive, 3) * (10**-3) + + duration = round((reward_size/1000)/tube_fit, 3) + duration_vacuum = 0.5 if which_pump == "1": - duration = round((reward_size / 1000)/(coefficient_p1[0] + coefficient_p1[1]), 3) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) elif which_pump == "2": - duration = np.round((reward_size / 1000)/(coefficient_p2[0] + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) elif which_pump == "3": - duration = round(((reward_size / 1000)/coefficient_p3[0] + coefficient_p3[1]), 3) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward_" + str(reward_size)) elif which_pump == "4": - duration = round(((reward_size / 1000)/coefficient_p4[0] + coefficient_p4[1]), 3) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "air_puff": - self.pump_air.blink(duration_air, 0.1, 1) + self.pump_air.blink(duration, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": - self.pump_vacuum.blink(duration_vac, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) \ No newline at end of file + self.pump_vacuum.blink(duration_vacuum, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum") \ No newline at end of file From b7cde61d497a692c36109eb204d2c09f8f2b456a Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 16:12:10 -0400 Subject: [PATCH 015/135] calibration issue --- behavbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/behavbox.py b/behavbox.py index 8305805..bee93c9 100755 --- a/behavbox.py +++ b/behavbox.py @@ -517,7 +517,7 @@ def reward(self, which_pump, reward_size): # round to the second decimal # duration = round(solution_positive, 3) * (10**-3) - duration = round((reward_size/1000)/tube_fit, 3) + duration = np.round((reward_size/1000)/tube_fit, 3) duration_vacuum = 0.5 if which_pump == "1": From f17c7b08fc4b98db687fe67708c4d295809183fb Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 16:20:46 -0400 Subject: [PATCH 016/135] current_card --- behavbox.py | 166 ++++++++++++++++++--------- headfixed_independent_reward_task.py | 20 ++-- 2 files changed, 119 insertions(+), 67 deletions(-) diff --git a/behavbox.py b/behavbox.py index bee93c9..439ef66 100755 --- a/behavbox.py +++ b/behavbox.py @@ -103,14 +103,34 @@ def __init__(self, session_info): self.DIO5 = LED(11) # there is a DIO6, but that is the same pin as the camera strobe + ############################################################################################### + # IR detection - for nosepoke + ############################################################################################### + self.IR_rx1 = Button(5, None, True) # None, True inverts the signal so poke=True, no-poke=False + self.IR_rx2 = Button(6, None, True) + self.IR_rx3 = Button(12, None, True) + self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use + self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use + + # link nosepoke event detections to callbacks + self.IR_rx1.when_pressed = self.IR_1_entry + self.IR_rx2.when_pressed = self.IR_2_entry + self.IR_rx3.when_pressed = self.IR_3_entry + self.IR_rx4.when_pressed = self.IR_4_entry + self.IR_rx5.when_pressed = self.IR_5_entry + self.IR_rx1.when_released = self.IR_1_exit + self.IR_rx2.when_released = self.IR_2_exit + self.IR_rx3.when_released = self.IR_3_exit + self.IR_rx4.when_released = self.IR_4_exit + self.IR_rx5.when_released = self.IR_5_exit ############################################################################################### # IR detection - for nosepoke detection ############################################################################################### self.lick1 = Button(26, None, True) self.lick2 = Button(27, None, True) self.lick3 = Button(15, None, True) - self.reserved_rx1 = Button(13, None, True) # for mitch - self.reserved_rx2 = Button(16, None, True) # for mitch + #self.reserved_rx1 = Button(13, None, True) # for mitch + #self.reserved_rx2 = Button(16, None, True) # for mitch # # # link nosepoke event detections to callbacks self.lick1.when_pressed = self.left_exit @@ -121,10 +141,10 @@ def __init__(self, session_info): self.lick2.when_released = self.right_entry self.lick3.when_released = self.center_entry - self.reserved_rx1.when_pressed = self.reserved_rx1_pressed - self.reserved_rx2.when_pressed = self.reserved_rx2_pressed - self.reserved_rx1.when_released = self.reserved_rx1_released - self.reserved_rx2.when_released = self.reserved_rx2_released + # self.reserved_rx1.when_pressed = self.reserved_rx1_pressed + # self.reserved_rx2.when_pressed = self.reserved_rx2_pressed + # self.reserved_rx1.when_released = self.reserved_rx1_released + # self.reserved_rx2.when_released = self.reserved_rx2_released ############################################################################################### # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors @@ -142,7 +162,7 @@ def __init__(self, session_info): ############################################################################################### # pump: trigger signal output to a driver board induce the solenoid valve to deliver reward ############################################################################################### - self.pump = Pump() + self.pump = Pump(self.session_info) ############################################################################################### # flipper strobe signal (previously called camera strobe signal) @@ -260,19 +280,22 @@ def check_keybd(self): self.keyboard_active = False elif event.key == pygame.K_1: self.left_entry() + self.left_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") elif event.key == pygame.K_2: self.center_entry() + self.center_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") elif event.key == pygame.K_3: self.right_entry() + self.right_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") - elif event.key == pygame.K_4: - self.reserved_rx1_pressed() - logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") - elif event.key == pygame.K_5: - self.reserved_rx2_pressed() - logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") + # elif event.key == pygame.K_4: + # self.reserved_rx1_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") + # elif event.key == pygame.K_5: + # self.reserved_rx2_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") @@ -455,27 +478,65 @@ def right_exit(self): self.interact_list.append((time.time(), "right_exit")) logging.info(";" + str(time.time()) + ";[action];right_exit") - def reserved_rx1_pressed(self): - self.event_list.append("reserved_rx1_pressed") - self.interact_list.append((time.time(), "reserved_rx1_pressed")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") - - def reserved_rx2_pressed(self): - self.event_list.append("reserved_rx2_pressed") - self.interact_list.append((time.time(), "reserved_rx2_pressed")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") - - def reserved_rx1_released(self): - self.event_list.append("reserved_rx1_released") - self.interact_list.append((time.time(), "reserved_rx1_released")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") - - def reserved_rx2_released(self): - self.event_list.append("reserved_rx2_released") - self.interact_list.append((time.time(), "reserved_rx2_released")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") - - + # def reserved_rx1_pressed(self): + # self.event_list.append("reserved_rx1_pressed") + # self.interact_list.append((time.time(), "reserved_rx1_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") + # + # def reserved_rx2_pressed(self): + # self.event_list.append("reserved_rx2_pressed") + # self.interact_list.append((time.time(), "reserved_rx2_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") + # + # def reserved_rx1_released(self): + # self.event_list.append("reserved_rx1_released") + # self.interact_list.append((time.time(), "reserved_rx1_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") + # + # def reserved_rx2_released(self): + # self.event_list.append("reserved_rx2_released") + # self.interact_list.append((time.time(), "reserved_rx2_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") + def IR_1_entry(self): + self.event_list.append("IR_1_entry") + logging.info(str(time.time()) + ", IR_1_entry") + + def IR_2_entry(self): + self.event_list.append("IR_2_entry") + logging.info(str(time.time()) + ", IR_2_entry") + + def IR_3_entry(self): + self.event_list.append("IR_3_entry") + logging.info(str(time.time()) + ", IR_3_entry") + + def IR_4_entry(self): + self.event_list.append("IR_4_entry") + logging.info(str(time.time()) + ", IR_4_entry") + + def IR_5_entry(self): + self.event_list.append("IR_5_entry") + logging.info(str(time.time()) + ", IR_5_entry") + + def IR_1_exit(self): + self.event_list.append("IR_1_exit") + logging.info(str(time.time()) + ", IR_1_exit") + + def IR_2_exit(self): + self.event_list.append("IR_2_exit") + # self.cueLED2.off() + logging.info(str(time.time()) + ", IR_2_exit") + + def IR_3_exit(self): + self.event_list.append("IR_3_exit") + logging.info(str(time.time()) + ", IR_3_exit") + + def IR_4_exit(self): + self.event_list.append("IR_4_exit") + logging.info(str(time.time()) + ", IR_4_exit") + + def IR_5_exit(self): + self.event_list.append("IR_5_exit") + logging.info(str(time.time()) + ", IR_5_exit") # this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) # currently. BoxLED.set_value is the saved intensity value that determines how bright the @@ -491,7 +552,8 @@ def on( class Pump(object): - def __init__(self): + def __init__(self, session_info): + self.session_info = session_info self.pump1 = LED(19) self.pump2 = LED(20) self.pump3 = LED(21) @@ -502,44 +564,38 @@ def __init__(self): # visualization def reward(self, which_pump, reward_size): - # coefficient_fit = np.array([8.78674242e-04, 7.33609848e-02, 1.47535000e+00]) # further calibration is needed - # coefficient_1 = coefficient_fit[-1] - # coefficient_2 = coefficient_fit[-2] - # coefficient_3 = coefficient_fit[-3] - reward_size - tube_fit = 0.13 # ml/s - # discriminant = coefficient_2 ** 2 - 4 * coefficient_1 * coefficient_3 - # # find solution, i.e. duration of pulse, by calculating the solution for the quadratic equation - # solution = np.array([(-coefficient_2 + np.sqrt(discriminant)) / (2 * coefficient_1), - # (-coefficient_2 - np.sqrt(discriminant)) / (2 * coefficient_1)]) - - # With two solution, get the positive value - # solution_positive = solution[(solution > 0).nonzero()[0][0]] - # round to the second decimal - # duration = round(solution_positive, 3) * (10**-3) - - duration = np.round((reward_size/1000)/tube_fit, 3) - duration_vacuum = 0.5 + # import coefficient from the session_information + coefficient_p1 = self.session_info["calibration_coefficient"]['1'] + coefficient_p2 = self.session_info["calibration_coefficient"]['2'] + coefficient_p3 = self.session_info["calibration_coefficient"]['3'] + coefficient_p4 = self.session_info["calibration_coefficient"]['4'] + duration_air = self.session_info['air_duration'] + duration_vac = self.session_info["vacuum_duration"] if which_pump == "1": + duration = round((reward_size / 1000)/(coefficient_p1[0] + coefficient_p1[1]), 3) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) elif which_pump == "2": + duration = np.round((reward_size / 1000)/(coefficient_p2[0] + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) elif which_pump == "3": + duration = round(((reward_size / 1000)/coefficient_p3[0] + coefficient_p3[1]), 3) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward_" + str(reward_size)) elif which_pump == "4": + duration = round(((reward_size / 1000)/coefficient_p4[0] + coefficient_p4[1]), 3) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "air_puff": - self.pump_air.blink(duration, 0.1, 1) + self.pump_air.blink(duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": - self.pump_vacuum.blink(duration_vacuum, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum") \ No newline at end of file + self.pump_vacuum.blink(duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) \ No newline at end of file diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 5d9d7f7..0eedf83 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -220,24 +220,20 @@ def run(self): if cue_state == 'all': side_choice = side_mice if side_choice == 'left': - reward_size = self.session_info['reward_size'][self.current_card[2][0]] - # left_reward = self.session_info['reward_size'][self.current_card[2][0]] - # reward_size = random.uniform(left_reward - self.session_info['reward_deviation'], - # left_reward + self.session_info['reward_deviation']) + reward_size = self.current_reward[0] pump_num = self.current_card[2][0] elif side_choice == 'right': - reward_size = self.session_info['reward_size'][self.current_card[2][1]] - # right_reward = self.session_info['reward_size'][self.current_card[2][1]] - # reward_size = random.uniform(right_reward - self.session_info['reward_deviation'], - # right_reward + self.session_info['reward_deviation']) + reward_size = self.current_reward[1] pump_num = self.current_card[2][1] else: side_choice = self.current_card[1] - # forced_reward = self.current_reward - reward_size = self.current_reward - # reward_size = random.uniform(forced_reward - self.session_info['reward_deviation'], - # forced_reward + self.session_info['reward_deviation']) pump_num = self.current_card[2] + if side_choice == 'left': + reward_size = self.current_reward[0] + pump_num = self.current_card[2] + elif side_choice == 'right': + reward_size = self.current_reward[1] + pump_num = self.current_card[2] if side_mice == side_choice: # if the animal chose correctly print("Number of lick detected: " + str(self.lick_count)) if self.lick_count == 0: # if this is the first lick From 651fc666a4ad25ee213fd2a2d358fc94af0368b7 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 23 May 2023 16:23:16 -0400 Subject: [PATCH 017/135] current_card --- behavbox.py | 166 +++++++++++++++++----------------------------------- 1 file changed, 55 insertions(+), 111 deletions(-) diff --git a/behavbox.py b/behavbox.py index 439ef66..8305805 100755 --- a/behavbox.py +++ b/behavbox.py @@ -103,34 +103,14 @@ def __init__(self, session_info): self.DIO5 = LED(11) # there is a DIO6, but that is the same pin as the camera strobe - ############################################################################################### - # IR detection - for nosepoke - ############################################################################################### - self.IR_rx1 = Button(5, None, True) # None, True inverts the signal so poke=True, no-poke=False - self.IR_rx2 = Button(6, None, True) - self.IR_rx3 = Button(12, None, True) - self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use - self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use - - # link nosepoke event detections to callbacks - self.IR_rx1.when_pressed = self.IR_1_entry - self.IR_rx2.when_pressed = self.IR_2_entry - self.IR_rx3.when_pressed = self.IR_3_entry - self.IR_rx4.when_pressed = self.IR_4_entry - self.IR_rx5.when_pressed = self.IR_5_entry - self.IR_rx1.when_released = self.IR_1_exit - self.IR_rx2.when_released = self.IR_2_exit - self.IR_rx3.when_released = self.IR_3_exit - self.IR_rx4.when_released = self.IR_4_exit - self.IR_rx5.when_released = self.IR_5_exit ############################################################################################### # IR detection - for nosepoke detection ############################################################################################### self.lick1 = Button(26, None, True) self.lick2 = Button(27, None, True) self.lick3 = Button(15, None, True) - #self.reserved_rx1 = Button(13, None, True) # for mitch - #self.reserved_rx2 = Button(16, None, True) # for mitch + self.reserved_rx1 = Button(13, None, True) # for mitch + self.reserved_rx2 = Button(16, None, True) # for mitch # # # link nosepoke event detections to callbacks self.lick1.when_pressed = self.left_exit @@ -141,10 +121,10 @@ def __init__(self, session_info): self.lick2.when_released = self.right_entry self.lick3.when_released = self.center_entry - # self.reserved_rx1.when_pressed = self.reserved_rx1_pressed - # self.reserved_rx2.when_pressed = self.reserved_rx2_pressed - # self.reserved_rx1.when_released = self.reserved_rx1_released - # self.reserved_rx2.when_released = self.reserved_rx2_released + self.reserved_rx1.when_pressed = self.reserved_rx1_pressed + self.reserved_rx2.when_pressed = self.reserved_rx2_pressed + self.reserved_rx1.when_released = self.reserved_rx1_released + self.reserved_rx2.when_released = self.reserved_rx2_released ############################################################################################### # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors @@ -162,7 +142,7 @@ def __init__(self, session_info): ############################################################################################### # pump: trigger signal output to a driver board induce the solenoid valve to deliver reward ############################################################################################### - self.pump = Pump(self.session_info) + self.pump = Pump() ############################################################################################### # flipper strobe signal (previously called camera strobe signal) @@ -280,22 +260,19 @@ def check_keybd(self): self.keyboard_active = False elif event.key == pygame.K_1: self.left_entry() - self.left_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") elif event.key == pygame.K_2: self.center_entry() - self.center_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") elif event.key == pygame.K_3: self.right_entry() - self.right_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") - # elif event.key == pygame.K_4: - # self.reserved_rx1_pressed() - # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") - # elif event.key == pygame.K_5: - # self.reserved_rx2_pressed() - # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") + elif event.key == pygame.K_4: + self.reserved_rx1_pressed() + logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") + elif event.key == pygame.K_5: + self.reserved_rx2_pressed() + logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") @@ -478,65 +455,27 @@ def right_exit(self): self.interact_list.append((time.time(), "right_exit")) logging.info(";" + str(time.time()) + ";[action];right_exit") - # def reserved_rx1_pressed(self): - # self.event_list.append("reserved_rx1_pressed") - # self.interact_list.append((time.time(), "reserved_rx1_pressed")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") - # - # def reserved_rx2_pressed(self): - # self.event_list.append("reserved_rx2_pressed") - # self.interact_list.append((time.time(), "reserved_rx2_pressed")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") - # - # def reserved_rx1_released(self): - # self.event_list.append("reserved_rx1_released") - # self.interact_list.append((time.time(), "reserved_rx1_released")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") - # - # def reserved_rx2_released(self): - # self.event_list.append("reserved_rx2_released") - # self.interact_list.append((time.time(), "reserved_rx2_released")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") - def IR_1_entry(self): - self.event_list.append("IR_1_entry") - logging.info(str(time.time()) + ", IR_1_entry") - - def IR_2_entry(self): - self.event_list.append("IR_2_entry") - logging.info(str(time.time()) + ", IR_2_entry") - - def IR_3_entry(self): - self.event_list.append("IR_3_entry") - logging.info(str(time.time()) + ", IR_3_entry") - - def IR_4_entry(self): - self.event_list.append("IR_4_entry") - logging.info(str(time.time()) + ", IR_4_entry") - - def IR_5_entry(self): - self.event_list.append("IR_5_entry") - logging.info(str(time.time()) + ", IR_5_entry") - - def IR_1_exit(self): - self.event_list.append("IR_1_exit") - logging.info(str(time.time()) + ", IR_1_exit") - - def IR_2_exit(self): - self.event_list.append("IR_2_exit") - # self.cueLED2.off() - logging.info(str(time.time()) + ", IR_2_exit") - - def IR_3_exit(self): - self.event_list.append("IR_3_exit") - logging.info(str(time.time()) + ", IR_3_exit") - - def IR_4_exit(self): - self.event_list.append("IR_4_exit") - logging.info(str(time.time()) + ", IR_4_exit") - - def IR_5_exit(self): - self.event_list.append("IR_5_exit") - logging.info(str(time.time()) + ", IR_5_exit") + def reserved_rx1_pressed(self): + self.event_list.append("reserved_rx1_pressed") + self.interact_list.append((time.time(), "reserved_rx1_pressed")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") + + def reserved_rx2_pressed(self): + self.event_list.append("reserved_rx2_pressed") + self.interact_list.append((time.time(), "reserved_rx2_pressed")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") + + def reserved_rx1_released(self): + self.event_list.append("reserved_rx1_released") + self.interact_list.append((time.time(), "reserved_rx1_released")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") + + def reserved_rx2_released(self): + self.event_list.append("reserved_rx2_released") + self.interact_list.append((time.time(), "reserved_rx2_released")) + logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") + + # this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) # currently. BoxLED.set_value is the saved intensity value that determines how bright the @@ -552,8 +491,7 @@ def on( class Pump(object): - def __init__(self, session_info): - self.session_info = session_info + def __init__(self): self.pump1 = LED(19) self.pump2 = LED(20) self.pump3 = LED(21) @@ -564,38 +502,44 @@ def __init__(self, session_info): # visualization def reward(self, which_pump, reward_size): - # import coefficient from the session_information - coefficient_p1 = self.session_info["calibration_coefficient"]['1'] - coefficient_p2 = self.session_info["calibration_coefficient"]['2'] - coefficient_p3 = self.session_info["calibration_coefficient"]['3'] - coefficient_p4 = self.session_info["calibration_coefficient"]['4'] - duration_air = self.session_info['air_duration'] - duration_vac = self.session_info["vacuum_duration"] + # coefficient_fit = np.array([8.78674242e-04, 7.33609848e-02, 1.47535000e+00]) # further calibration is needed + # coefficient_1 = coefficient_fit[-1] + # coefficient_2 = coefficient_fit[-2] + # coefficient_3 = coefficient_fit[-3] - reward_size + tube_fit = 0.13 # ml/s + # discriminant = coefficient_2 ** 2 - 4 * coefficient_1 * coefficient_3 + # # find solution, i.e. duration of pulse, by calculating the solution for the quadratic equation + # solution = np.array([(-coefficient_2 + np.sqrt(discriminant)) / (2 * coefficient_1), + # (-coefficient_2 - np.sqrt(discriminant)) / (2 * coefficient_1)]) + + # With two solution, get the positive value + # solution_positive = solution[(solution > 0).nonzero()[0][0]] + # round to the second decimal + # duration = round(solution_positive, 3) * (10**-3) + + duration = round((reward_size/1000)/tube_fit, 3) + duration_vacuum = 0.5 if which_pump == "1": - duration = round((reward_size / 1000)/(coefficient_p1[0] + coefficient_p1[1]), 3) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) elif which_pump == "2": - duration = np.round((reward_size / 1000)/(coefficient_p2[0] + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) elif which_pump == "3": - duration = round(((reward_size / 1000)/coefficient_p3[0] + coefficient_p3[1]), 3) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward_" + str(reward_size)) elif which_pump == "4": - duration = round(((reward_size / 1000)/coefficient_p4[0] + coefficient_p4[1]), 3) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "air_puff": - self.pump_air.blink(duration_air, 0.1, 1) + self.pump_air.blink(duration, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": - self.pump_vacuum.blink(duration_vac, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) \ No newline at end of file + self.pump_vacuum.blink(duration_vacuum, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum") \ No newline at end of file From 1f109f5d64c3e9f57a730f9173bdf844dfd78170 Mon Sep 17 00:00:00 2001 From: season Date: Sun, 28 May 2023 14:24:26 -0400 Subject: [PATCH 018/135] changes related to exit reward --- headfixed_independent_reward_task.py | 97 +++++++++++++++--------- run_headfixed_independent_reward_task.py | 2 +- 2 files changed, 63 insertions(+), 36 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 0eedf83..ab45706 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -1,8 +1,8 @@ # python3: headfixed_task.py """ author: tian qiu & Soyoun Kim -date: 2023-05-23 -name: headfixed_independent_reward_task.py +date: 2023-02-16 +name: headfixed2FC_task.py goal: model_free reinforcement learning behavioral training task structure description: an updated test version of headfixed_task.py @@ -46,7 +46,7 @@ class TimedStateMachine(Machine): pass -class HeadfixedIndependentRewardTask(object): +class Headfixed2FCTask(object): # Define states. States where the animals is waited to make their decision def __init__(self, **kwargs): # name and session_info should be provided as kwargs @@ -125,9 +125,14 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa self.error_repeat = False self.reward_time_start = None # for reward_available state time keeping purpose self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False + # self.reward_times_up = False + self.pump_num = None + self.reward_size = None self.current_reward = None + self.reward_check = False + self.block_count = 0 + self.blocknumber = self.session_info["block_number"] self.current_card = None self.left_poke_count = 0 self.right_poke_count = 0 @@ -139,6 +144,7 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa # initialize behavior box self.box = behavbox.BehavBox(self.session_info) self.pump = self.box.pump + self.treadmill = self.box.treadmill self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] @@ -158,6 +164,7 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa # session_statistics self.total_reward = 0 + self.correct_trial_in_block = 0 ######################################################################## # functions called when state transitions occur @@ -198,10 +205,10 @@ def run(self): else: self.cue_state_error = True elif self.state == "reward_available": - if not self.reward_times_up: - if self.reward_time_start: - if time.time() >= self.reward_time_start + self.reward_time: - self.restart() + # if not self.reward_times_up: + # if self.reward_time_start: + # if time.time() >= self.reward_time_start + self.reward_time: + # self.restart() # first detect the lick signal: cue_state = self.current_card[0] side_mice = None @@ -220,33 +227,26 @@ def run(self): if cue_state == 'all': side_choice = side_mice if side_choice == 'left': - reward_size = self.current_reward[0] - pump_num = self.current_card[2][0] + self.pump_num = self.current_card[3][0] + self.reward_size = self.current_reward[0] elif side_choice == 'right': - reward_size = self.current_reward[1] - pump_num = self.current_card[2][1] + self.pump_num = self.current_card[3][1] + self.reward_size = self.current_reward[1] else: side_choice = self.current_card[1] - pump_num = self.current_card[2] - if side_choice == 'left': - reward_size = self.current_reward[0] - pump_num = self.current_card[2] - elif side_choice == 'right': - reward_size = self.current_reward[1] - pump_num = self.current_card[2] + self.pump_num = self.current_card[3] + self.reward_size = self.current_reward if side_mice == side_choice: # if the animal chose correctly - print("Number of lick detected: " + str(self.lick_count)) - if self.lick_count == 0: # if this is the first lick - self.pump.reward(pump_num, reward_size) - self.total_reward += 1 - self.reward_time_start = time.time() - print("Reward time start" + str(self.reward_time_start)) - self.lick_count += 1 - elif self.side_mice_buffer: - if self.lick_count == 0: - self.check_cue('sound2') - self.wrong_choice_error = True - self.restart() + self.side_mice_buffer = self.side_mice + if self.side_mice == self.side_choice: # if the animal chose correctly + if self.lick_count == 0: # if this is the first lick + self.reward_check = True + self.restart() + elif self.side_mice_buffer: + if self.lick_count == 0: + # self.check_cue('sound2') + self.wrong_choice_error = True + self.restart() # look for keystrokes self.box.check_keybd() @@ -317,17 +317,22 @@ def enter_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") self.cue_off(self.current_card[0]) - self.reward_times_up = False + # self.reward_times_up = False def exit_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - self.reward_times_up = True - self.pump.reward("vaccum", 0) if self.wrong_choice_error: + self.check_cue('sound2') logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) self.error_repeat = True self.error_list.append('wrong_choice_error') self.wrong_choice_error = False + elif self.reward_check: + self.pump.reward(self.pump_num, self.reward_size) + self.total_reward += 1 + self.correct_trial_in_block += 1 + self.reward_time_start = time.time() + print("Reward time start" + str(self.reward_time_start)) elif self.lick_count == 0: logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) self.error_repeat = True @@ -335,8 +340,30 @@ def exit_reward_available(self): else: logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) self.error_list.append('correct_trial') + # self.reward_times_up = True self.lick_count = 0 self.reward_time_start = None + self.pump_num = None + self.reward_size = None + + # def exit_reward_available(self): + # logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + # self.reward_times_up = True + # self.pump.reward("vaccum", 0) + # if self.wrong_choice_error: + # logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + # self.error_repeat = True + # self.error_list.append('wrong_choice_error') + # self.wrong_choice_error = False + # elif self.lick_count == 0: + # logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + # self.error_repeat = True + # self.error_list.append('no_choice_error') + # else: + # logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + # self.error_list.append('correct_trial') + # self.lick_count = 0 + # self.reward_time_start = None def check_cue(self, cue): if cue == 'sound1': @@ -454,4 +481,4 @@ def start_session(self): def end_session(self): ic("TODO: stop video") self.update_plot_choice(save_fig=True) - self.box.video_stop() + self.box.video_stop() \ No newline at end of file diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index fc1ede9..aec53fc 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -183,4 +183,4 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # save dicts to disk scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() + task.end_session() \ No newline at end of file From 631be27e83f0ea2c8a5cc7139daf6edd78ca970d Mon Sep 17 00:00:00 2001 From: season Date: Sun, 28 May 2023 14:56:05 -0400 Subject: [PATCH 019/135] error repeat restructure --- run_headfixed_independent_reward_task.py | 63 ++++++++++++------------ 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index aec53fc..8a4e30c 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -132,38 +132,37 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # Set a timer t_minute = int(input("Enter the time in minutes: ")) ## wll add in the session info t_end = time.time() + 60 * t_minute - first_card = True - while time.time() < t_end: - task.error_count = 0 - print("Trial " + str(task.trial_number) + " \n") - task.trial_number += 1 - print("*******************************\n") - task.current_card = task_information.draw_card(session_info['phase']) - task.current_reward = reward_distribution_list[task.trial_number] - logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) - print(" - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n") - while first_card or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ - "error_max"]): - if time.time() >= t_end: - print("Times up, finishing up") - break - if task.error_repeat: - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - print("*error_repeat trial* \n" + - " - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n") - task.trial_number += 1 - first_card = False - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) + while time.time() < t_end: # time check + if task.error_repeat: # error repeat check + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("Trial " + str(task.trial_number) + " \n") + task.trial_number += 1 + print("*******************************\n") + print("*error_repeat trial* \n" + + " - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n") + task.trial_number += 1 + else: + # setup the beginning of a new trial + task.error_count = 0 # reset the error count if previous trial is correct + print("Trial " + str(task.trial_number) + " \n") + task.trial_number += 1 + print("*******************************\n") + # acquire new reward contingency and cue association + task.current_card = task_information.draw_card(session_info['phase']) + task.current_reward = reward_distribution_list[task.trial_number] + logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) + print(" - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n") + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) raise SystemExit # graceful exit From 6f1bbdaf2428f2c806fb31423aa6031f13276060 Mon Sep 17 00:00:00 2001 From: season Date: Sun, 28 May 2023 15:07:23 -0400 Subject: [PATCH 020/135] first_trial_of_the_session --- run_headfixed_independent_reward_task.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 8a4e30c..6823358 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -118,7 +118,7 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 ntrials = session_info['reward']['ntrials'] reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) - + first_trial_of_the_session = True # # you can change various parameters if you want # task.machine.states['cue'].timeout = 2 @@ -146,6 +146,11 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 "*reward_side: " + str(task.current_card[0]) + "\n") task.trial_number += 1 else: + if not first_trial_of_the_session: + print("reward_time_out: " + str(session_info["reward_timeout"])) + sleep(session_info["reward_timeout"]) + else: + first_trial_of_the_session = False # setup the beginning of a new trial task.error_count = 0 # reset the error count if previous trial is correct print("Trial " + str(task.trial_number) + " \n") From 8eca2e2a011eb2d626db5d8ced0d66c5bfc1ca82 Mon Sep 17 00:00:00 2001 From: season Date: Sun, 28 May 2023 15:10:02 -0400 Subject: [PATCH 021/135] session_info['wait_for_choice'] --- headfixed_independent_reward_task.py | 2 +- session_info_headfixed_independent_reward.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index ab45706..3a347e0 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -95,7 +95,7 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa Timeout(name='reward_available', on_enter=["enter_reward_available"], on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], + timeout=self.session_info["wait_for_choice"], on_timeout=["restart"]) ] self.transitions = [ diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index bca56a1..a114dbb 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -101,7 +101,7 @@ def get_coefficient(): # define timeout during each condition session_info['initiation_timeout'] = 120 # s session_info['cue_timeout'] = 120 -session_info['reward_timeout'] = 60 +session_info['wait_for_choice'] = 60 session_info["punishment_timeout"] = 3 session_info['reward'] = {} From a57f9c393249729ae6fbfb2b50c709ede0b661de Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 15:53:10 -0400 Subject: [PATCH 022/135] HeadfixedIndependentRewardTask --- headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 3a347e0..0846b38 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -46,7 +46,7 @@ class TimedStateMachine(Machine): pass -class Headfixed2FCTask(object): +class HeadfixedIndependentRewardTask(object): # Define states. States where the animals is waited to make their decision def __init__(self, **kwargs): # name and session_info should be provided as kwargs From c3cd6deffe910da2c4542c77fba2108f4b40053c Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 15:56:07 -0400 Subject: [PATCH 023/135] current_card index out of bound --- headfixed_independent_reward_task.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 0846b38..29ed755 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -227,14 +227,14 @@ def run(self): if cue_state == 'all': side_choice = side_mice if side_choice == 'left': - self.pump_num = self.current_card[3][0] + self.pump_num = self.current_card[2][0] self.reward_size = self.current_reward[0] elif side_choice == 'right': - self.pump_num = self.current_card[3][1] + self.pump_num = self.current_card[2][1] self.reward_size = self.current_reward[1] else: side_choice = self.current_card[1] - self.pump_num = self.current_card[3] + self.pump_num = self.current_card[2] self.reward_size = self.current_reward if side_mice == side_choice: # if the animal chose correctly self.side_mice_buffer = self.side_mice From b84968cf8c0714b0d8cd8ff5b4bc3cb3a338d0c0 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:02:04 -0400 Subject: [PATCH 024/135] self.side_mice --- headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 29ed755..c6c0390 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -237,7 +237,7 @@ def run(self): self.pump_num = self.current_card[2] self.reward_size = self.current_reward if side_mice == side_choice: # if the animal chose correctly - self.side_mice_buffer = self.side_mice + self.side_mice_buffer = side_mice if self.side_mice == self.side_choice: # if the animal chose correctly if self.lick_count == 0: # if this is the first lick self.reward_check = True From b14e7b41b9b65ea4b0ac3422fc5b7df7512c0698 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:03:55 -0400 Subject: [PATCH 025/135] self.side_choice --- headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index c6c0390..297b2d4 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -238,7 +238,7 @@ def run(self): self.reward_size = self.current_reward if side_mice == side_choice: # if the animal chose correctly self.side_mice_buffer = side_mice - if self.side_mice == self.side_choice: # if the animal chose correctly + if self.side_mice == side_choice: # if the animal chose correctly if self.lick_count == 0: # if this is the first lick self.reward_check = True self.restart() From 74c2d4703ea5e9157aff287d95b192f6527bb408 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:05:50 -0400 Subject: [PATCH 026/135] self.side_mice --- headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 297b2d4..0badd57 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -238,7 +238,7 @@ def run(self): self.reward_size = self.current_reward if side_mice == side_choice: # if the animal chose correctly self.side_mice_buffer = side_mice - if self.side_mice == side_choice: # if the animal chose correctly + if side_mice == side_choice: # if the animal chose correctly if self.lick_count == 0: # if this is the first lick self.reward_check = True self.restart() From 35d7ba146226a3687f4d95c695bbac21553007a5 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:11:05 -0400 Subject: [PATCH 027/135] reward_size --- run_headfixed_independent_reward_task.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 6823358..88276b6 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -162,7 +162,8 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) print(" - Current card condition: \n" + "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n") + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward) + "\n") logging.info(";" + str(time.time()) + ";[transition];start_trial()") task.start_trial() # initiate the time state machine, start_trial() is a trigger while task.trial_running: From 8c1737221e181e069a6fa986a01839c7e16d45d9 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:14:22 -0400 Subject: [PATCH 028/135] reward_size --- headfixed_independent_reward_task.py | 1 + 1 file changed, 1 insertion(+) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 0badd57..0289ee4 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -328,6 +328,7 @@ def exit_reward_available(self): self.error_list.append('wrong_choice_error') self.wrong_choice_error = False elif self.reward_check: + print("reward amount: " + str(self.pump_num)) self.pump.reward(self.pump_num, self.reward_size) self.total_reward += 1 self.correct_trial_in_block += 1 From b903c598ca53472f11f3815f490a2ba75d3fb71e Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:19:12 -0400 Subject: [PATCH 029/135] reward_size --- headfixed_independent_reward_task.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 0289ee4..dd96bd7 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -232,10 +232,14 @@ def run(self): elif side_choice == 'right': self.pump_num = self.current_card[2][1] self.reward_size = self.current_reward[1] - else: + elif cue_state == 'left': side_choice = self.current_card[1] self.pump_num = self.current_card[2] - self.reward_size = self.current_reward + self.reward_size = self.current_reward[0] + elif cue_state == 'right': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[1] if side_mice == side_choice: # if the animal chose correctly self.side_mice_buffer = side_mice if side_mice == side_choice: # if the animal chose correctly From 0b391f5fa4cd0868a00732d2b23d56d3277f705f Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:24:12 -0400 Subject: [PATCH 030/135] reward_size --- headfixed_independent_reward_task.py | 1 + 1 file changed, 1 insertion(+) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index dd96bd7..9e41bca 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -240,6 +240,7 @@ def run(self): side_choice = self.current_card[1] self.pump_num = self.current_card[2] self.reward_size = self.current_reward[1] + print("!!!!!!!!CUE_STATE" + str(cue_state)) if side_mice == side_choice: # if the animal chose correctly self.side_mice_buffer = side_mice if side_mice == side_choice: # if the animal chose correctly From fbf2ceafc621a79f0030b8413cdee9dc4e60d8f2 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:26:12 -0400 Subject: [PATCH 031/135] cue_state --- headfixed_independent_reward_task.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 9e41bca..d5b6f87 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -226,10 +226,10 @@ def run(self): self.side_mice_buffer = side_mice if cue_state == 'all': side_choice = side_mice - if side_choice == 'left': + if side_choice == 'LED_L': self.pump_num = self.current_card[2][0] self.reward_size = self.current_reward[0] - elif side_choice == 'right': + elif side_choice == 'LED_R': self.pump_num = self.current_card[2][1] self.reward_size = self.current_reward[1] elif cue_state == 'left': @@ -240,7 +240,7 @@ def run(self): side_choice = self.current_card[1] self.pump_num = self.current_card[2] self.reward_size = self.current_reward[1] - print("!!!!!!!!CUE_STATE" + str(cue_state)) + print("!!!!!!!!CUE_STATE: " + str(cue_state)) if side_mice == side_choice: # if the animal chose correctly self.side_mice_buffer = side_mice if side_mice == side_choice: # if the animal chose correctly From f8ae77b5bfc5f57ac14f83594a5ce60bfb45d00f Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:28:18 -0400 Subject: [PATCH 032/135] cue_state --- task_information_independent_reward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index bdb7296..553b9d8 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -4,7 +4,7 @@ class TaskInformation(object): def __init__(self, **kwargs): self.name = "model_based_reinforcement_learning_task" - self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), ('all', ('left', 'right'), ('1', '2'))] + self.deck = [('left', 'left', '1'), ('right', 'right', '2'), ('all', ('left', 'right'), ('1', '2'))] def draw_card(self, phase="final"): row_start = 0 From b190995eb6c62c74d7116278f32abb36f99ef09e Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:29:01 -0400 Subject: [PATCH 033/135] cue_state --- headfixed_independent_reward_task.py | 4 ++-- task_information_independent_reward.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index d5b6f87..65c550c 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -232,11 +232,11 @@ def run(self): elif side_choice == 'LED_R': self.pump_num = self.current_card[2][1] self.reward_size = self.current_reward[1] - elif cue_state == 'left': + elif cue_state == 'LED_L': side_choice = self.current_card[1] self.pump_num = self.current_card[2] self.reward_size = self.current_reward[0] - elif cue_state == 'right': + elif cue_state == 'LED_R': side_choice = self.current_card[1] self.pump_num = self.current_card[2] self.reward_size = self.current_reward[1] diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index 553b9d8..bdb7296 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -4,7 +4,7 @@ class TaskInformation(object): def __init__(self, **kwargs): self.name = "model_based_reinforcement_learning_task" - self.deck = [('left', 'left', '1'), ('right', 'right', '2'), ('all', ('left', 'right'), ('1', '2'))] + self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), ('all', ('left', 'right'), ('1', '2'))] def draw_card(self, phase="final"): row_start = 0 From 81b625d45012b962477ef6fcb6c8b36000fbe726 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:34:48 -0400 Subject: [PATCH 034/135] reward_check print wrong variable reward_size --- headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 65c550c..6a7c418 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -333,7 +333,7 @@ def exit_reward_available(self): self.error_list.append('wrong_choice_error') self.wrong_choice_error = False elif self.reward_check: - print("reward amount: " + str(self.pump_num)) + print("reward amount: " + str(self.reward_size)) self.pump.reward(self.pump_num, self.reward_size) self.total_reward += 1 self.correct_trial_in_block += 1 From 46d54f1250a2c3e539022eccd150f06c9b6d270c Mon Sep 17 00:00:00 2001 From: season Date: Mon, 29 May 2023 16:43:04 -0400 Subject: [PATCH 035/135] reward_check wrong choice error --- headfixed_independent_reward_task.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 6a7c418..c7f081c 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -246,12 +246,13 @@ def run(self): if side_mice == side_choice: # if the animal chose correctly if self.lick_count == 0: # if this is the first lick self.reward_check = True + self.lick_count += 1 self.restart() - elif self.side_mice_buffer: - if self.lick_count == 0: - # self.check_cue('sound2') - self.wrong_choice_error = True - self.restart() + elif self.side_mice_buffer: + if self.lick_count == 0: + self.check_cue('sound2') + self.wrong_choice_error = True + self.restart() # look for keystrokes self.box.check_keybd() @@ -327,7 +328,7 @@ def enter_reward_available(self): def exit_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) if self.wrong_choice_error: - self.check_cue('sound2') + # self.check_cue('sound2') logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) self.error_repeat = True self.error_list.append('wrong_choice_error') From e014bc1c68ed8806ae6dc9cad2dde6cbb7fae0de Mon Sep 17 00:00:00 2001 From: season Date: Tue, 30 May 2023 10:51:47 -0400 Subject: [PATCH 036/135] self.wrong_choice_error --- headfixed_independent_reward_task.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index c7f081c..512231a 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -120,7 +120,7 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa self.early_lick_error = False self.initiate_error = False self.cue_state_error = False - self.wrong_choice_error = False + self.wrong_choice_error = True self.multiple_choice_error = False self.error_repeat = False self.reward_time_start = None # for reward_available state time keeping purpose @@ -245,12 +245,13 @@ def run(self): self.side_mice_buffer = side_mice if side_mice == side_choice: # if the animal chose correctly if self.lick_count == 0: # if this is the first lick + self.wrong_choice_error = False self.reward_check = True self.lick_count += 1 self.restart() elif self.side_mice_buffer: if self.lick_count == 0: - self.check_cue('sound2') + # self.check_cue('sound2') self.wrong_choice_error = True self.restart() @@ -328,17 +329,18 @@ def enter_reward_available(self): def exit_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) if self.wrong_choice_error: - # self.check_cue('sound2') + self.check_cue('sound2') logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) self.error_repeat = True self.error_list.append('wrong_choice_error') - self.wrong_choice_error = False + # self.wrong_choice_error = False elif self.reward_check: print("reward amount: " + str(self.reward_size)) self.pump.reward(self.pump_num, self.reward_size) self.total_reward += 1 self.correct_trial_in_block += 1 self.reward_time_start = time.time() + self.wrong_choice_error = True print("Reward time start" + str(self.reward_time_start)) elif self.lick_count == 0: logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) From 36d245bff45eb336da094f4d614608cb70588bcf Mon Sep 17 00:00:00 2001 From: season Date: Tue, 30 May 2023 11:06:15 -0400 Subject: [PATCH 037/135] no_choice_error --- headfixed_independent_reward_task.py | 35 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 512231a..6610424 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -253,6 +253,7 @@ def run(self): if self.lick_count == 0: # self.check_cue('sound2') self.wrong_choice_error = True + self.lick_count += 1 self.restart() # look for keystrokes @@ -260,6 +261,10 @@ def run(self): def enter_standby(self): logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + if self.wrong_choice_error: + self.error_list.append("no_choice_error") + self.check_cue('sound2') + self.wrong_choice_error = False self.update_plot_choice() # self.update_plot_error() self.trial_running = False @@ -267,14 +272,16 @@ def enter_standby(self): if self.early_lick_error: self.error_list.append("early_lick_error") self.early_lick_error = False - self.lick_count = 0 - self.side_mice_buffer = None + # self.lick_count = 0 + # self.side_mice_buffer = None print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) def exit_standby(self): # self.error_repeat = False logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.lick_count = 0 + self.side_mice_buffer = None self.box.event_list.clear() pass @@ -328,32 +335,30 @@ def enter_reward_available(self): def exit_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - if self.wrong_choice_error: + if self.wrong_choice_error and self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) self.check_cue('sound2') - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) self.error_repeat = True - self.error_list.append('wrong_choice_error') - # self.wrong_choice_error = False + self.error_list.append('no_choice_error') elif self.reward_check: print("reward amount: " + str(self.reward_size)) self.pump.reward(self.pump_num, self.reward_size) + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.error_list.append('correct_trial') self.total_reward += 1 self.correct_trial_in_block += 1 self.reward_time_start = time.time() - self.wrong_choice_error = True print("Reward time start" + str(self.reward_time_start)) - elif self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + elif self.wrong_choice_error and self.lick_count > 0: + self.check_cue('sound2') + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) self.error_repeat = True - self.error_list.append('no_choice_error') - else: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.error_list.append('correct_trial') - # self.reward_times_up = True - self.lick_count = 0 + self.error_list.append('wrong_choice_error') + # self.lick_count = 0 self.reward_time_start = None self.pump_num = None self.reward_size = None + self.wrong_choice_error = False # def exit_reward_available(self): # logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) From 0bade5a0537aa984a6b903a498c778772a5f9738 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 30 May 2023 11:17:36 -0400 Subject: [PATCH 038/135] all reward_size --- headfixed_independent_reward_task.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 6610424..abb293a 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -229,9 +229,11 @@ def run(self): if side_choice == 'LED_L': self.pump_num = self.current_card[2][0] self.reward_size = self.current_reward[0] + print("self.current_reward[0]: " + str(self.current_reward[0])) elif side_choice == 'LED_R': self.pump_num = self.current_card[2][1] self.reward_size = self.current_reward[1] + print("self.current_reward[0]: " + str(self.current_reward[1])) elif cue_state == 'LED_L': side_choice = self.current_card[1] self.pump_num = self.current_card[2] From 0766fe0623b30355c556b9db7187923972aef5b3 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 30 May 2023 11:26:11 -0400 Subject: [PATCH 039/135] all reward_size --- headfixed_independent_reward_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index abb293a..5fd2213 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -226,11 +226,11 @@ def run(self): self.side_mice_buffer = side_mice if cue_state == 'all': side_choice = side_mice - if side_choice == 'LED_L': + if side_choice == 'left': self.pump_num = self.current_card[2][0] self.reward_size = self.current_reward[0] print("self.current_reward[0]: " + str(self.current_reward[0])) - elif side_choice == 'LED_R': + elif side_choice == 'right': self.pump_num = self.current_card[2][1] self.reward_size = self.current_reward[1] print("self.current_reward[0]: " + str(self.current_reward[1])) From 02eeebc0a1bfc5fb9fc4cb08de3a624a4fc3547c Mon Sep 17 00:00:00 2001 From: season Date: Fri, 2 Jun 2023 11:59:44 -0400 Subject: [PATCH 040/135] new calibration branch --- behavbox.py | 166 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 111 insertions(+), 55 deletions(-) diff --git a/behavbox.py b/behavbox.py index 8305805..2b5a8cc 100755 --- a/behavbox.py +++ b/behavbox.py @@ -103,14 +103,34 @@ def __init__(self, session_info): self.DIO5 = LED(11) # there is a DIO6, but that is the same pin as the camera strobe + ############################################################################################### + # IR detection - for nosepoke + ############################################################################################### + self.IR_rx1 = Button(5, None, True) # None, True inverts the signal so poke=True, no-poke=False + self.IR_rx2 = Button(6, None, True) + self.IR_rx3 = Button(12, None, True) + self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use + self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use + + # link nosepoke event detections to callbacks + self.IR_rx1.when_pressed = self.IR_1_entry + self.IR_rx2.when_pressed = self.IR_2_entry + self.IR_rx3.when_pressed = self.IR_3_entry + self.IR_rx4.when_pressed = self.IR_4_entry + self.IR_rx5.when_pressed = self.IR_5_entry + self.IR_rx1.when_released = self.IR_1_exit + self.IR_rx2.when_released = self.IR_2_exit + self.IR_rx3.when_released = self.IR_3_exit + self.IR_rx4.when_released = self.IR_4_exit + self.IR_rx5.when_released = self.IR_5_exit ############################################################################################### # IR detection - for nosepoke detection ############################################################################################### self.lick1 = Button(26, None, True) self.lick2 = Button(27, None, True) self.lick3 = Button(15, None, True) - self.reserved_rx1 = Button(13, None, True) # for mitch - self.reserved_rx2 = Button(16, None, True) # for mitch + #self.reserved_rx1 = Button(13, None, True) # for mitch + #self.reserved_rx2 = Button(16, None, True) # for mitch # # # link nosepoke event detections to callbacks self.lick1.when_pressed = self.left_exit @@ -121,10 +141,10 @@ def __init__(self, session_info): self.lick2.when_released = self.right_entry self.lick3.when_released = self.center_entry - self.reserved_rx1.when_pressed = self.reserved_rx1_pressed - self.reserved_rx2.when_pressed = self.reserved_rx2_pressed - self.reserved_rx1.when_released = self.reserved_rx1_released - self.reserved_rx2.when_released = self.reserved_rx2_released + # self.reserved_rx1.when_pressed = self.reserved_rx1_pressed + # self.reserved_rx2.when_pressed = self.reserved_rx2_pressed + # self.reserved_rx1.when_released = self.reserved_rx1_released + # self.reserved_rx2.when_released = self.reserved_rx2_released ############################################################################################### # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors @@ -142,7 +162,7 @@ def __init__(self, session_info): ############################################################################################### # pump: trigger signal output to a driver board induce the solenoid valve to deliver reward ############################################################################################### - self.pump = Pump() + self.pump = Pump(self.session_info) ############################################################################################### # flipper strobe signal (previously called camera strobe signal) @@ -260,19 +280,22 @@ def check_keybd(self): self.keyboard_active = False elif event.key == pygame.K_1: self.left_entry() + self.left_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") elif event.key == pygame.K_2: self.center_entry() + self.center_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") elif event.key == pygame.K_3: self.right_entry() + self.right_IR_entry() logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") - elif event.key == pygame.K_4: - self.reserved_rx1_pressed() - logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") - elif event.key == pygame.K_5: - self.reserved_rx2_pressed() - logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") + # elif event.key == pygame.K_4: + # self.reserved_rx1_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") + # elif event.key == pygame.K_5: + # self.reserved_rx2_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") @@ -455,27 +478,65 @@ def right_exit(self): self.interact_list.append((time.time(), "right_exit")) logging.info(";" + str(time.time()) + ";[action];right_exit") - def reserved_rx1_pressed(self): - self.event_list.append("reserved_rx1_pressed") - self.interact_list.append((time.time(), "reserved_rx1_pressed")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") - - def reserved_rx2_pressed(self): - self.event_list.append("reserved_rx2_pressed") - self.interact_list.append((time.time(), "reserved_rx2_pressed")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") - - def reserved_rx1_released(self): - self.event_list.append("reserved_rx1_released") - self.interact_list.append((time.time(), "reserved_rx1_released")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") - - def reserved_rx2_released(self): - self.event_list.append("reserved_rx2_released") - self.interact_list.append((time.time(), "reserved_rx2_released")) - logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") - - + # def reserved_rx1_pressed(self): + # self.event_list.append("reserved_rx1_pressed") + # self.interact_list.append((time.time(), "reserved_rx1_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") + # + # def reserved_rx2_pressed(self): + # self.event_list.append("reserved_rx2_pressed") + # self.interact_list.append((time.time(), "reserved_rx2_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") + # + # def reserved_rx1_released(self): + # self.event_list.append("reserved_rx1_released") + # self.interact_list.append((time.time(), "reserved_rx1_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") + # + # def reserved_rx2_released(self): + # self.event_list.append("reserved_rx2_released") + # self.interact_list.append((time.time(), "reserved_rx2_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") + def IR_1_entry(self): + self.event_list.append("IR_1_entry") + logging.info(str(time.time()) + ", IR_1_entry") + + def IR_2_entry(self): + self.event_list.append("IR_2_entry") + logging.info(str(time.time()) + ", IR_2_entry") + + def IR_3_entry(self): + self.event_list.append("IR_3_entry") + logging.info(str(time.time()) + ", IR_3_entry") + + def IR_4_entry(self): + self.event_list.append("IR_4_entry") + logging.info(str(time.time()) + ", IR_4_entry") + + def IR_5_entry(self): + self.event_list.append("IR_5_entry") + logging.info(str(time.time()) + ", IR_5_entry") + + def IR_1_exit(self): + self.event_list.append("IR_1_exit") + logging.info(str(time.time()) + ", IR_1_exit") + + def IR_2_exit(self): + self.event_list.append("IR_2_exit") + # self.cueLED2.off() + logging.info(str(time.time()) + ", IR_2_exit") + + def IR_3_exit(self): + self.event_list.append("IR_3_exit") + logging.info(str(time.time()) + ", IR_3_exit") + + def IR_4_exit(self): + self.event_list.append("IR_4_exit") + logging.info(str(time.time()) + ", IR_4_exit") + + def IR_5_exit(self): + self.event_list.append("IR_5_exit") + logging.info(str(time.time()) + ", IR_5_exit") # this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) # currently. BoxLED.set_value is the saved intensity value that determines how bright the @@ -491,7 +552,8 @@ def on( class Pump(object): - def __init__(self): + def __init__(self, session_info): + self.session_info = session_info self.pump1 = LED(19) self.pump2 = LED(20) self.pump3 = LED(21) @@ -502,44 +564,38 @@ def __init__(self): # visualization def reward(self, which_pump, reward_size): - # coefficient_fit = np.array([8.78674242e-04, 7.33609848e-02, 1.47535000e+00]) # further calibration is needed - # coefficient_1 = coefficient_fit[-1] - # coefficient_2 = coefficient_fit[-2] - # coefficient_3 = coefficient_fit[-3] - reward_size - tube_fit = 0.13 # ml/s - # discriminant = coefficient_2 ** 2 - 4 * coefficient_1 * coefficient_3 - # # find solution, i.e. duration of pulse, by calculating the solution for the quadratic equation - # solution = np.array([(-coefficient_2 + np.sqrt(discriminant)) / (2 * coefficient_1), - # (-coefficient_2 - np.sqrt(discriminant)) / (2 * coefficient_1)]) - - # With two solution, get the positive value - # solution_positive = solution[(solution > 0).nonzero()[0][0]] - # round to the second decimal - # duration = round(solution_positive, 3) * (10**-3) - - duration = round((reward_size/1000)/tube_fit, 3) - duration_vacuum = 0.5 + # import coefficient from the session_information + coefficient_p1 = self.session_info["calibration_coefficient"]['1'] + coefficient_p2 = self.session_info["calibration_coefficient"]['2'] + coefficient_p3 = self.session_info["calibration_coefficient"]['3'] + coefficient_p4 = self.session_info["calibration_coefficient"]['4'] + duration_air = self.session_info['air_duration'] + duration_vac = self.session_info["vacuum_duration"] if which_pump == "1": + duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 3) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) elif which_pump == "2": + duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) elif which_pump == "3": + duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 3) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward_" + str(reward_size)) elif which_pump == "4": + duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 3) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "air_puff": - self.pump_air.blink(duration, 0.1, 1) + self.pump_air.blink(duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": - self.pump_vacuum.blink(duration_vacuum, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum") \ No newline at end of file + self.pump_vacuum.blink(duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) \ No newline at end of file From 56f25bd1fb1c607fe8f5c365d31a59091a0671f2 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 5 Jun 2023 16:16:42 -0400 Subject: [PATCH 041/135] run_headfixed_independent_reward_task: avoid negative value emerge from the brownian motion --- generate_reward_trajectory.py | 45 ++++++++++++++++++++++++ run_headfixed_independent_reward_task.py | 17 +++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 generate_reward_trajectory.py diff --git a/generate_reward_trajectory.py b/generate_reward_trajectory.py new file mode 100644 index 0000000..4d2cbed --- /dev/null +++ b/generate_reward_trajectory.py @@ -0,0 +1,45 @@ +def cumsum_positive(input_list): + for index in range(len(input_list)): + if index == 0 and input_list[index]<0: + input_list[index] = -input_list[index] + elif input_list[index]+input_list[index-1]<0: + input_list[index] = input_list[index] - input_list[index-1] + else: + input_list[index] = input_list[index] + input_list[index-1] + return input_list + +def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials / change_point)): + temp = np.random.randn(change_point) * scale + # temp = np.random.uniform(low=0.0, high=10, size=(change_point,)) + + # print("ay o" + str(temp)) + # while temp < 0: + # temp = np.random.randn(change_point) * scale + rewards_L.append(cumsum_positive(temp) + offset) + temp = np.random.randn(change_point) * scale + # temp = np.random.uniform(low=0.0, high=10, size=(change_point,)) + # while temp < 0: + # temp = np.random.randn(change_point) * scale + rewards_R.append(cumsum_positive(temp) + offset) + rewards_L = np.hstack(rewards_L) + rewards_R = np.hstack(rewards_R) + # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials, :] + # print(reward_LR) + return reward_LR + +# from reward_distribution import generate_reward_trajectory +scale = 0.5 +offset = 3.0 +change_point = 20 +ntrials = 100 + +reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + +print(reward_distribution_list) \ No newline at end of file diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 88276b6..61a6587 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -93,22 +93,33 @@ # print("Imported task_information_headfixed: " + str(task_information.name)) task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) + + def cumsum_positive(input_list): + for index in range(len(input_list)): + if index == 0 and input_list[index] < 0: + input_list[index] = -input_list[index] + elif input_list[index] + input_list[index - 1] < 0: + input_list[index] = input_list[index] - input_list[index - 1] + else: + input_list[index] = input_list[index] + input_list[index - 1] + return input_list + def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): # initial reward (need to be random) rewards_L = [1] rewards_R = [1] for a in np.arange(np.round(ntrials / change_point)): temp = np.random.randn(change_point) * scale - rewards_L.append(np.cumsum(temp, axis=-1) + offset) + rewards_L.append(cumsum_positive(temp) + offset) temp = np.random.randn(change_point) * scale - rewards_R.append(np.cumsum(temp, axis=-1) + offset) + rewards_R.append(cumsum_positive(temp) + offset) rewards_L = np.hstack(rewards_L) rewards_R = np.hstack(rewards_R) # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') reward_LR = [rewards_L, rewards_R] reward_LR = np.transpose(np.array(reward_LR)) reward_LR = reward_LR[0:ntrials, :] - print(reward_LR) + # print(reward_LR) return reward_LR # from reward_distribution import generate_reward_trajectory From 6182782599ceb53555b85336385b100c3aeb5c74 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 6 Jun 2023 12:53:10 -0400 Subject: [PATCH 042/135] add log for reward coefficient --- behavbox.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/behavbox.py b/behavbox.py index 2b5a8cc..7a48d8f 100755 --- a/behavbox.py +++ b/behavbox.py @@ -576,22 +576,26 @@ def reward(self, which_pump, reward_size): duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 3) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump1_reward_" + str(reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient_p1) + + ", reward_amount: " + str(reward_size)) elif which_pump == "2": duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 3) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump2_reward_" + str(reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient_p2) + + ", reward_amount: " + str(reward_size)) elif which_pump == "3": duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 3) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump3_reward_" + str(reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient_p3) + + ", reward_amount: " + str(reward_size)) elif which_pump == "4": duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 3) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient_p4) + + ", reward_amount: " + str(reward_size)) elif which_pump == "air_puff": self.pump_air.blink(duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) From b98d5ae13637676f5e0d83be56a74e568ea8f72c Mon Sep 17 00:00:00 2001 From: season Date: Tue, 6 Jun 2023 12:55:21 -0400 Subject: [PATCH 043/135] show current trial reward condition --- run_headfixed_independent_reward_task.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 61a6587..34898a6 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -170,7 +170,8 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # acquire new reward contingency and cue association task.current_card = task_information.draw_card(session_info['phase']) task.current_reward = reward_distribution_list[task.trial_number] - logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) + logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + + ";current_reward_" + str(task.current_reward)) print(" - Current card condition: \n" + "*******************************\n" + "*reward_side: " + str(task.current_card[0]) + "\n" + From a344719a9161850b529681f6ea43d2f648e85175 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 6 Jun 2023 13:09:01 -0400 Subject: [PATCH 044/135] new round for reward delivery --- behavbox.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/behavbox.py b/behavbox.py index 7a48d8f..8178992 100755 --- a/behavbox.py +++ b/behavbox.py @@ -573,25 +573,25 @@ def reward(self, which_pump, reward_size): duration_vac = self.session_info["vacuum_duration"] if which_pump == "1": - duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 3) # linear function + duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 5) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient_p1) + ", reward_amount: " + str(reward_size)) elif which_pump == "2": - duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 3) # linear function + duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient_p2) + ", reward_amount: " + str(reward_size)) elif which_pump == "3": - duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 3) # linear function + duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient_p3) + ", reward_amount: " + str(reward_size)) elif which_pump == "4": - duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 3) # linear function + duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient_p4) + From 1a98913ec0cbf23e746d27049e7b326490135d16 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 6 Jun 2023 13:11:32 -0400 Subject: [PATCH 045/135] new round for reward delivery --- behavbox.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/behavbox.py b/behavbox.py index 8178992..79c5769 100755 --- a/behavbox.py +++ b/behavbox.py @@ -577,25 +577,25 @@ def reward(self, which_pump, reward_size): self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient_p1) + - ", reward_amount: " + str(reward_size)) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "2": duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient_p2) + - ", reward_amount: " + str(reward_size)) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "3": duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient_p3) + - ", reward_amount: " + str(reward_size)) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "4": duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient_p4) + - ", reward_amount: " + str(reward_size)) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "air_puff": self.pump_air.blink(duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) From a9b817e2c995034a122765e2dce62f95494adb0b Mon Sep 17 00:00:00 2001 From: season Date: Tue, 6 Jun 2023 13:12:43 -0400 Subject: [PATCH 046/135] new round for reward delivery --- behavbox.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/behavbox.py b/behavbox.py index 79c5769..1424d4b 100755 --- a/behavbox.py +++ b/behavbox.py @@ -299,19 +299,19 @@ def check_keybd(self): elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") - self.pump.reward("1", 5) + self.pump.reward("1", 3) elif event.key == pygame.K_w: # print("W down: syringe pump 2 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") - self.pump.reward("2", 5) + self.pump.reward("2", 3) elif event.key == pygame.K_e: # print("E down: syringe pump 3 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") - self.pump.reward("3", 5) + self.pump.reward("3", 3) elif event.key == pygame.K_r: # print("R down: syringe pump 4 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") - self.pump.reward("4", 5) + self.pump.reward("4", 3) elif event.key == pygame.K_t: # print("T down: vacuum on") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") From 72fbd036b2b042da9283a291c4d49922412d31c2 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 6 Jun 2023 14:30:48 -0400 Subject: [PATCH 047/135] session_info reward coeff --- session_info_headfixed2FC.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/session_info_headfixed2FC.py b/session_info_headfixed2FC.py index 96e24d2..a227617 100644 --- a/session_info_headfixed2FC.py +++ b/session_info_headfixed2FC.py @@ -75,3 +75,10 @@ session_info['consecutive_control'] = False if session_info['consecutive_control']: session_info['consecutive_max'] = 3 + +session_info["calibration_coefficient"] = {} + +session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first +session_info["calibration_coefficient"]['2'] = [0.13, 0] +session_info["calibration_coefficient"]['3'] = [0.13, 0.0] +session_info["calibration_coefficient"]['4'] = [0.13, 0.0] \ No newline at end of file From 24a8abefbaed2ae9a99fc10c4887b63ba0d862c8 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 6 Jun 2023 15:02:43 -0400 Subject: [PATCH 048/135] session_info reward coeff --- session_info_headfixed2FC.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/session_info_headfixed2FC.py b/session_info_headfixed2FC.py index a227617..ae8d2e3 100644 --- a/session_info_headfixed2FC.py +++ b/session_info_headfixed2FC.py @@ -81,4 +81,7 @@ session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first session_info["calibration_coefficient"]['2'] = [0.13, 0] session_info["calibration_coefficient"]['3'] = [0.13, 0.0] -session_info["calibration_coefficient"]['4'] = [0.13, 0.0] \ No newline at end of file +session_info["calibration_coefficient"]['4'] = [0.13, 0.0] + +session_info['air_duration'] = 0 +session_info["vacuum_duration"] = 1 \ No newline at end of file From e931730c746ac595b693e9ccb59684c1edab686a Mon Sep 17 00:00:00 2001 From: season Date: Wed, 7 Jun 2023 14:35:51 -0400 Subject: [PATCH 049/135] syringe_pump_debug --- syringe_pump_pygame_debug.py | 52 ++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/syringe_pump_pygame_debug.py b/syringe_pump_pygame_debug.py index a2dfbcc..b23775b 100644 --- a/syringe_pump_pygame_debug.py +++ b/syringe_pump_pygame_debug.py @@ -1,6 +1,58 @@ import pygame from behavbox import Pump import numpy as np + +class Pump(object): + def __init__(self, session_info): + self.pump1 = LED(19) + self.pump2 = LED(20) + self.pump3 = LED(21) + self.pump4 = LED(7) + self.pump_air = LED(8) + self.pump_vacuum = LED(25) + self.reward_list = [] # a list of tuple (pump_x, reward_amount) with information of reward history for data + # visualization + + def reward(self, which_pump, reward_size): + # import coefficient from the session_information + coefficient_p1 = [0.13, 0] + coefficient_p2 = [0.13, 0] + coefficient_p3 = [0.13, 0] + coefficient_p4 = [0.13, 0] + duration_air = 1 + duration_vac = 1 + + if which_pump == "1": + duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 5) # linear function + self.pump1.blink(duration, 0.1, 1) + self.reward_list.append(("pump1_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient_p1) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "2": + duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function + self.pump2.blink(duration, 0.1, 1) + self.reward_list.append(("pump2_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient_p2) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "3": + duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function + self.pump3.blink(duration, 0.1, 1) + self.reward_list.append(("pump3_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient_p3) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "4": + duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function + self.pump4.blink(duration, 0.1, 1) + self.reward_list.append(("pump4_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient_p4) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "air_puff": + self.pump_air.blink(duration_air, 0.1, 1) + self.reward_list.append(("air_puff", reward_size)) + logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) + elif which_pump == "vacuum": + self.pump_vacuum.blink(duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) try: pump = Pump() pygame.init() From 36a5484d3e898ab242b92f614453686700ff5de4 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 8 Jun 2023 17:28:45 -0400 Subject: [PATCH 050/135] self.reward_size_offset --- headfixed_independent_reward_task.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 5fd2213..826d164 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -130,6 +130,7 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa self.reward_size = None self.current_reward = None self.reward_check = False + self.reward_size_offset = self.session_info['reward_size_offset'] self.block_count = 0 self.blocknumber = self.session_info["block_number"] @@ -344,7 +345,7 @@ def exit_reward_available(self): self.error_list.append('no_choice_error') elif self.reward_check: print("reward amount: " + str(self.reward_size)) - self.pump.reward(self.pump_num, self.reward_size) + self.pump.reward(self.pump_num, self.reward_size + self.reward_size_offset) logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) self.error_list.append('correct_trial') self.total_reward += 1 From 3a4df90302f07226c03beae2c3a123c1fe81667a Mon Sep 17 00:00:00 2001 From: season Date: Sun, 11 Jun 2023 12:17:14 -0400 Subject: [PATCH 051/135] reward_check bypass issue correction, please refer to the bug report on 06/09/2023 --- headfixed_independent_reward_task.py | 1 + 1 file changed, 1 insertion(+) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 826d164..17fdf07 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -352,6 +352,7 @@ def exit_reward_available(self): self.correct_trial_in_block += 1 self.reward_time_start = time.time() print("Reward time start" + str(self.reward_time_start)) + self.reward_check = False elif self.wrong_choice_error and self.lick_count > 0: self.check_cue('sound2') logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) From 00ad25d3cd8097f2c37e3051793d893802e5b8a7 Mon Sep 17 00:00:00 2001 From: season Date: Sun, 11 Jun 2023 12:52:21 -0400 Subject: [PATCH 052/135] redundant cue_off --- headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 17fdf07..d002f21 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -333,7 +333,7 @@ def exit_cue_state(self): def enter_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") - self.cue_off(self.current_card[0]) + # self.cue_off(self.current_card[0]) # self.reward_times_up = False def exit_reward_available(self): From e5dc5ed995cfe450ea6679df96e561337f27c012 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 12 Jun 2023 11:33:02 -0400 Subject: [PATCH 053/135] behavbox keypress logging event specification --- behavbox.py | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/behavbox.py b/behavbox.py index 1424d4b..b78bb6a 100755 --- a/behavbox.py +++ b/behavbox.py @@ -299,23 +299,23 @@ def check_keybd(self): elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") - self.pump.reward("1", 3) + self.pump.reward("key_1", 3) elif event.key == pygame.K_w: # print("W down: syringe pump 2 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") - self.pump.reward("2", 3) + self.pump.reward("key_2", 3) elif event.key == pygame.K_e: # print("E down: syringe pump 3 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") - self.pump.reward("3", 3) + self.pump.reward("key_3", 3) elif event.key == pygame.K_r: # print("R down: syringe pump 4 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") - self.pump.reward("4", 3) + self.pump.reward("key_4", 3) elif event.key == pygame.K_t: # print("T down: vacuum on") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") - self.pump.reward("vacuum", 1) + self.pump.reward("key_vacuum", 1) elif event.type == pygame.KEYUP: if event.key == pygame.K_1: self.left_exit() @@ -602,4 +602,35 @@ def reward(self, which_pump, reward_size): logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": self.pump_vacuum.blink(duration_vac, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) \ No newline at end of file + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) + elif which_pump == "key_1": + duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 5) # linear function + self.pump1.blink(duration, 0.1, 1) + self.reward_list.append(("pump1_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[key];pump1_reward(reward_coeff: " + str(coefficient_p1) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_2": + duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function + self.pump2.blink(duration, 0.1, 1) + self.reward_list.append(("pump2_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[key];pump2_reward(reward_coeff: " + str(coefficient_p2) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_3": + duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function + self.pump3.blink(duration, 0.1, 1) + self.reward_list.append(("pump3_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[key];pump3_reward(reward_coeff: " + str(coefficient_p3) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_4": + duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function + self.pump4.blink(duration, 0.1, 1) + self.reward_list.append(("pump4_reward", reward_size)) + logging.info(";" + str(time.time()) + ";[key];pump4_reward(reward_coeff: " + str(coefficient_p4) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_air_puff": + self.pump_air.blink(duration_air, 0.1, 1) + self.reward_list.append(("air_puff", reward_size)) + logging.info(";" + str(time.time()) + ";[key];pump4_reward_" + str(reward_size)) + elif which_pump == "key_vacuum": + self.pump_vacuum.blink(duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[key];pump_vacuum" + str(duration_vac)) \ No newline at end of file From c300623eb37cfc2d2776d656cf5a1917a411aea8 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 12 Jun 2023 11:36:49 -0400 Subject: [PATCH 054/135] including the reward offset in the current_reward logging information --- headfixed_independent_reward_task.py | 2 +- run_headfixed_independent_reward_task.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index d002f21..5d58102 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -345,7 +345,7 @@ def exit_reward_available(self): self.error_list.append('no_choice_error') elif self.reward_check: print("reward amount: " + str(self.reward_size)) - self.pump.reward(self.pump_num, self.reward_size + self.reward_size_offset) + self.pump.reward(self.pump_num, self.reward_size) # + self.reward_size_offset) logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) self.error_list.append('correct_trial') self.total_reward += 1 diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 34898a6..9f4303d 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -169,7 +169,7 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 print("*******************************\n") # acquire new reward contingency and cue association task.current_card = task_information.draw_card(session_info['phase']) - task.current_reward = reward_distribution_list[task.trial_number] + task.current_reward = reward_distribution_list[task.trial_number] + float(task.reward_size_offset) logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)) print(" - Current card condition: \n" + From b985c71f42a290fc150d208af467ba0b1f576750 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 12 Jun 2023 11:40:49 -0400 Subject: [PATCH 055/135] session_info include the key_reward_amount --- behavbox.py | 8 ++++---- session_info_headfixed2FC.py | 3 ++- session_info_headfixed_independent_reward.py | 5 ++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/behavbox.py b/behavbox.py index b78bb6a..f2af206 100755 --- a/behavbox.py +++ b/behavbox.py @@ -299,19 +299,19 @@ def check_keybd(self): elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") - self.pump.reward("key_1", 3) + self.pump.reward("key_1", self.session_info["key_reward_amount"]) elif event.key == pygame.K_w: # print("W down: syringe pump 2 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") - self.pump.reward("key_2", 3) + self.pump.reward("key_2", self.session_info["key_reward_amount"]) elif event.key == pygame.K_e: # print("E down: syringe pump 3 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") - self.pump.reward("key_3", 3) + self.pump.reward("key_3", self.session_info["key_reward_amount"]) elif event.key == pygame.K_r: # print("R down: syringe pump 4 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") - self.pump.reward("key_4", 3) + self.pump.reward("key_4", self.session_info["key_reward_amount"]) elif event.key == pygame.K_t: # print("T down: vacuum on") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") diff --git a/session_info_headfixed2FC.py b/session_info_headfixed2FC.py index ae8d2e3..8136923 100644 --- a/session_info_headfixed2FC.py +++ b/session_info_headfixed2FC.py @@ -84,4 +84,5 @@ session_info["calibration_coefficient"]['4'] = [0.13, 0.0] session_info['air_duration'] = 0 -session_info["vacuum_duration"] = 1 \ No newline at end of file +session_info["vacuum_duration"] = 1 +session_info["key_reward_amount"] = 5 \ No newline at end of file diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index a114dbb..2e4da69 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -57,6 +57,8 @@ session_info['reward_size'] = {'small': 5, 'large': 10} session_info['air_duration'] = 0 session_info["vacuum_duration"] = 1 +session_info["key_reward_amount"] = 5 +session_info['reward_size_offset'] = 5 """ solenoid calibration information configuration """ @@ -118,4 +120,5 @@ def get_coefficient(): session_info['consecutive_control'] = False if session_info['consecutive_control']: - session_info['consecutive_max'] = 3 \ No newline at end of file + session_info['consecutive_max'] = 3 + From fb0f6c5ce9076b86ee8f855b6a88056728e75c41 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 12 Jun 2023 11:51:28 -0400 Subject: [PATCH 056/135] behavbox keypress logging event specification --- behavbox.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/behavbox.py b/behavbox.py index f2af206..13c27ad 100755 --- a/behavbox.py +++ b/behavbox.py @@ -298,23 +298,23 @@ def check_keybd(self): # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") elif event.key == pygame.K_q: # print("Q down: syringe pump 1 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") self.pump.reward("key_1", self.session_info["key_reward_amount"]) elif event.key == pygame.K_w: # print("W down: syringe pump 2 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") self.pump.reward("key_2", self.session_info["key_reward_amount"]) elif event.key == pygame.K_e: # print("E down: syringe pump 3 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") self.pump.reward("key_3", self.session_info["key_reward_amount"]) elif event.key == pygame.K_r: # print("R down: syringe pump 4 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") self.pump.reward("key_4", self.session_info["key_reward_amount"]) elif event.key == pygame.K_t: # print("T down: vacuum on") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") self.pump.reward("key_vacuum", 1) elif event.type == pygame.KEYUP: if event.key == pygame.K_1: From 0793829da1b4f608cd4efe4a12a77e2af3a238df Mon Sep 17 00:00:00 2001 From: season Date: Wed, 14 Jun 2023 10:25:46 -0400 Subject: [PATCH 057/135] eliminating the bracket in reward logging information --- behavbox.py | 2 +- run_headfixed_independent_reward_task.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/behavbox.py b/behavbox.py index 13c27ad..d8aebf2 100755 --- a/behavbox.py +++ b/behavbox.py @@ -124,7 +124,7 @@ def __init__(self, session_info): self.IR_rx4.when_released = self.IR_4_exit self.IR_rx5.when_released = self.IR_5_exit ############################################################################################### - # IR detection - for nosepoke detection + # close circuit detection - for ground pin circuit lick detection ############################################################################################### self.lick1 = Button(26, None, True) self.lick2 = Button(27, None, True) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 9f4303d..257f0dd 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -171,11 +171,11 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 task.current_card = task_information.draw_card(session_info['phase']) task.current_reward = reward_distribution_list[task.trial_number] + float(task.reward_size_offset) logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + - ";current_reward_" + str(task.current_reward)) + ";current_reward_" + str(current_reward)[1:-1]) print(" - Current card condition: \n" + "*******************************\n" + "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward) + "\n") + "*reward_size: " + str(current_reward)[1:-1] + "\n") logging.info(";" + str(time.time()) + ";[transition];start_trial()") task.start_trial() # initiate the time state machine, start_trial() is a trigger while task.trial_running: From 641c6d6dba8ec51bc88ef173388efc0d361d24ef Mon Sep 17 00:00:00 2001 From: season Date: Wed, 14 Jun 2023 12:06:05 -0400 Subject: [PATCH 058/135] eliminating the bracket in reward logging information --- run_headfixed_independent_reward_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 257f0dd..6241898 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -171,11 +171,11 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 task.current_card = task_information.draw_card(session_info['phase']) task.current_reward = reward_distribution_list[task.trial_number] + float(task.reward_size_offset) logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + - ";current_reward_" + str(current_reward)[1:-1]) + ";current_reward_" + str(task.current_reward)[1:-1]) print(" - Current card condition: \n" + "*******************************\n" + "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(current_reward)[1:-1] + "\n") + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") logging.info(";" + str(time.time()) + ";[transition];start_trial()") task.start_trial() # initiate the time state machine, start_trial() is a trigger while task.trial_running: From 83174bce92a7844ecc16ca27312272c3a431b58c Mon Sep 17 00:00:00 2001 From: season Date: Fri, 16 Jun 2023 10:34:56 -0400 Subject: [PATCH 059/135] probability of drawing both side: 75% --- task_information_independent_reward.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index bdb7296..fe09037 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -4,11 +4,14 @@ class TaskInformation(object): def __init__(self, **kwargs): self.name = "model_based_reinforcement_learning_task" - self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), ('all', ('left', 'right'), ('1', '2'))] + self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] def draw_card(self, phase="final"): row_start = 0 - row_end = 2 + row_end = 7 if phase == 'final': pass elif phase == 'forced_choice': From 9e4c64133bcfb3c5e6fd03d6d458e425160600d2 Mon Sep 17 00:00:00 2001 From: season Date: Wed, 21 Jun 2023 14:49:46 -0400 Subject: [PATCH 060/135] redundant task.trial_number += 1 --- run_headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 6241898..37ffe84 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -155,7 +155,7 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 " - Current card condition: \n" + "*******************************\n" + "*reward_side: " + str(task.current_card[0]) + "\n") - task.trial_number += 1 + # task.trial_number += 1 else: if not first_trial_of_the_session: print("reward_time_out: " + str(session_info["reward_timeout"])) From e6fd755a9cb300c5b22ac5c56350215cc34513bc Mon Sep 17 00:00:00 2001 From: season Date: Wed, 21 Jun 2023 14:51:27 -0400 Subject: [PATCH 061/135] current_reward_size print on the error repeat trial --- run_headfixed_independent_reward_task.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 37ffe84..24ce2ff 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -154,7 +154,8 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 print("*error_repeat trial* \n" + " - Current card condition: \n" + "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n") + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") # task.trial_number += 1 else: if not first_trial_of_the_session: From ca1029764a39ee117f666c984a1840ffae32f985 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 22 Jun 2023 10:41:28 -0400 Subject: [PATCH 062/135] self.error_count += 1 --- headfixed_independent_reward_task.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 5d58102..1d3244b 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -341,6 +341,7 @@ def exit_reward_available(self): if self.wrong_choice_error and self.lick_count == 0: logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) self.check_cue('sound2') + self.error_count += 1 self.error_repeat = True self.error_list.append('no_choice_error') elif self.reward_check: @@ -357,6 +358,7 @@ def exit_reward_available(self): self.check_cue('sound2') logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) self.error_repeat = True + self.error_count += 1 self.error_list.append('wrong_choice_error') # self.lick_count = 0 self.reward_time_start = None From e71106350e193e8028fa716c3877a0a7c9721f00 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 22 Jun 2023 10:47:28 -0400 Subject: [PATCH 063/135] early_lick_error --- headfixed_independent_reward_task.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 1d3244b..7d4a5b2 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -266,6 +266,7 @@ def enter_standby(self): logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) if self.wrong_choice_error: self.error_list.append("no_choice_error") + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) self.check_cue('sound2') self.wrong_choice_error = False self.update_plot_choice() @@ -274,6 +275,8 @@ def enter_standby(self): # self.reward_error = False if self.early_lick_error: self.error_list.append("early_lick_error") + logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) + self.check_cue('sound2') self.early_lick_error = False # self.lick_count = 0 # self.side_mice_buffer = None From 903d81a8114adde128524158544979a9f3f4ea22 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 22 Jun 2023 12:02:56 -0400 Subject: [PATCH 064/135] punishment timeout and early_lick_error + cue_state_error conflict --- headfixed_independent_reward_task.py | 85 +++++++--------------------- 1 file changed, 20 insertions(+), 65 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 7d4a5b2..51708dc 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -123,9 +123,7 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa self.wrong_choice_error = True self.multiple_choice_error = False self.error_repeat = False - self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - # self.reward_times_up = False + self.pump_num = None self.reward_size = None self.current_reward = None @@ -165,7 +163,6 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa # session_statistics self.total_reward = 0 - self.correct_trial_in_block = 0 ######################################################################## # functions called when state transitions occur @@ -183,7 +180,6 @@ def run(self): if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": pass else: - # print("beeeeeeep") # debug signal self.early_lick_error = True self.error_repeat = True self.restart() @@ -197,8 +193,6 @@ def run(self): else: self.initiate_error = True elif self.state == "cue_state": - # if self.LED_blink: - # self.box.cueLED1.blink(0.2, 0.1) self.distance_diff = self.get_distance() - self.distance_buffer if self.distance_diff >= self.distance_cue: self.cue_state_error = False @@ -206,11 +200,6 @@ def run(self): else: self.cue_state_error = True elif self.state == "reward_available": - # if not self.reward_times_up: - # if self.reward_time_start: - # if time.time() >= self.reward_time_start + self.reward_time: - # self.restart() - # first detect the lick signal: cue_state = self.current_card[0] side_mice = None if self.event_name == "left_entry": @@ -254,7 +243,6 @@ def run(self): self.restart() elif self.side_mice_buffer: if self.lick_count == 0: - # self.check_cue('sound2') self.wrong_choice_error = True self.lick_count += 1 self.restart() @@ -264,11 +252,6 @@ def run(self): def enter_standby(self): logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - if self.wrong_choice_error: - self.error_list.append("no_choice_error") - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.wrong_choice_error = False self.update_plot_choice() # self.update_plot_error() self.trial_running = False @@ -278,13 +261,10 @@ def enter_standby(self): logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) self.check_cue('sound2') self.early_lick_error = False - # self.lick_count = 0 - # self.side_mice_buffer = None print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) def exit_standby(self): - # self.error_repeat = False logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) self.lick_count = 0 self.side_mice_buffer = None @@ -325,68 +305,44 @@ def enter_cue_state(self): def exit_cue_state(self): logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) self.cue_off(self.current_card[0]) - if self.cue_state_error: - self.check_cue("sound2") - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False + if not self.early_lick_error: + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False def enter_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") - # self.cue_off(self.current_card[0]) - # self.reward_times_up = False def exit_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - if self.wrong_choice_error and self.lick_count == 0: + if self.lick_count == 0: logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) self.check_cue('sound2') - self.error_count += 1 self.error_repeat = True + self.error_count += 1 self.error_list.append('no_choice_error') - elif self.reward_check: - print("reward amount: " + str(self.reward_size)) - self.pump.reward(self.pump_num, self.reward_size) # + self.reward_size_offset) - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.error_list.append('correct_trial') - self.total_reward += 1 - self.correct_trial_in_block += 1 - self.reward_time_start = time.time() - print("Reward time start" + str(self.reward_time_start)) - self.reward_check = False - elif self.wrong_choice_error and self.lick_count > 0: - self.check_cue('sound2') + elif self.wrong_choice_error: logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') self.error_repeat = True self.error_count += 1 self.error_list.append('wrong_choice_error') - # self.lick_count = 0 - self.reward_time_start = None + elif self.reward_check: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.pump.reward(self.pump_num, self.reward_size) + self.error_repeat = False + self.total_reward += 1 + self.reward_check = False + self.error_list.append('correct_trial') self.pump_num = None self.reward_size = None self.wrong_choice_error = False - # def exit_reward_available(self): - # logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - # self.reward_times_up = True - # self.pump.reward("vaccum", 0) - # if self.wrong_choice_error: - # logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - # self.error_repeat = True - # self.error_list.append('wrong_choice_error') - # self.wrong_choice_error = False - # elif self.lick_count == 0: - # logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - # self.error_repeat = True - # self.error_list.append('no_choice_error') - # else: - # logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - # self.error_list.append('correct_trial') - # self.lick_count = 0 - # self.reward_time_start = None def check_cue(self, cue): if cue == 'sound1': @@ -399,7 +355,6 @@ def check_cue(self, cue): self.box.cueLED1.on() logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) elif cue == 'LED_R': - # self.LED_blink = True self.box.cueLED2.on() logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) elif cue == 'all': From fe767b76acb8a93961085c6b93a7f986c5b6c37f Mon Sep 17 00:00:00 2001 From: season Date: Thu, 22 Jun 2023 13:39:56 -0400 Subject: [PATCH 065/135] incooperate the forced choice phase into the headfixed_independent_reward_task --- run_headfixed_independent_reward_task.py | 20 +++++++++++++------- session_info_headfixed_independent_reward.py | 5 ++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 24ce2ff..1eee5a6 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -122,13 +122,16 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # print(reward_LR) return reward_LR - # from reward_distribution import generate_reward_trajectory - scale = session_info['reward']['scale'] - offset = session_info['reward']['offset'] - change_point = session_info['reward']['change_point'] - ntrials = session_info['reward']['ntrials'] + if session_info['phase'] == "independent_reward": + # from reward_distribution import generate_reward_trajectory + scale = session_info['reward']['scale'] + offset = session_info['reward']['offset'] + change_point = session_info['reward']['change_point'] + ntrials = session_info['reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + elif session_info['phase'] == "forced_choice": + reward_size = session_info['reward_size'] - reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) first_trial_of_the_session = True # # you can change various parameters if you want @@ -170,7 +173,10 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 print("*******************************\n") # acquire new reward contingency and cue association task.current_card = task_information.draw_card(session_info['phase']) - task.current_reward = reward_distribution_list[task.trial_number] + float(task.reward_size_offset) + if session_info['phase'] == "independent_reward": + task.current_reward = reward_distribution_list[task.trial_number] + float(task.reward_size_offset) + elif session_info['phase'] == "forced_choice": + task.current_reward = session_info['reward_size'] logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)[1:-1]) print(" - Current card condition: \n" + diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 2e4da69..4fba672 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -29,7 +29,6 @@ # behavior parameters session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters session_info["lick_threshold"] = 1 # visual stimulus session_info["visual_stimulus"] = False @@ -37,7 +36,7 @@ session_info['config'] = 'headfixed2FC' session_info['treadmill_setup'] = {} session_info['treadmill'] = True -session_info['phase'] = 'forced_choice' +session_info['phase'] = 'independent_reward' if session_info['treadmill']: session_info['treadmill_setup']['distance_cue'] = 5 # cm @@ -54,7 +53,7 @@ # session_info['state'] = ['block1', 'block2'] # session_info['choice'] = ['right', 'left'] # lick port session_info['reward'] = ['small', 'large'] # reward size -session_info['reward_size'] = {'small': 5, 'large': 10} +session_info['reward_size'] = [10,10] session_info['air_duration'] = 0 session_info["vacuum_duration"] = 1 session_info["key_reward_amount"] = 5 From 1f3fc93f4c3874dfa630dec791ee96b90e346e06 Mon Sep 17 00:00:00 2001 From: season Date: Fri, 23 Jun 2023 11:18:20 -0400 Subject: [PATCH 066/135] free choice 50% --- task_information_independent_reward.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index fe09037..977d124 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -5,8 +5,6 @@ class TaskInformation(object): def __init__(self, **kwargs): self.name = "model_based_reinforcement_learning_task" self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] def draw_card(self, phase="final"): From 28a9a03e6153679a9e686f2ec353ffb8852c6fcc Mon Sep 17 00:00:00 2001 From: season Date: Fri, 23 Jun 2023 11:23:02 -0400 Subject: [PATCH 067/135] free choice 50% --- task_information_independent_reward.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index 977d124..8aa568e 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -9,8 +9,8 @@ def __init__(self, **kwargs): def draw_card(self, phase="final"): row_start = 0 - row_end = 7 - if phase == 'final': + row_end = len(self.deck) + if phase == 'independent_reward': pass elif phase == 'forced_choice': row_end = 1 From 3921482bab0bd2de019ddd8f7beded29d00ca429 Mon Sep 17 00:00:00 2001 From: season Date: Fri, 23 Jun 2023 11:50:20 -0400 Subject: [PATCH 068/135] task_information_independent_reward list out of bound error --- task_information_independent_reward.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index 8aa568e..1d88dc7 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -7,9 +7,9 @@ def __init__(self, **kwargs): self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] - def draw_card(self, phase="final"): + def draw_card(self, phase="independent_reward"): row_start = 0 - row_end = len(self.deck) + row_end = len(self.deck)-1 if phase == 'independent_reward': pass elif phase == 'forced_choice': From e100cdf3e5317a9424460d304ba7231eecfa3236 Mon Sep 17 00:00:00 2001 From: season Date: Mon, 26 Jun 2023 17:02:52 -0400 Subject: [PATCH 069/135] sine wave reward function incooperation --- run_headfixed_independent_reward_task.py | 40 +++++++++++++++++--- session_info_headfixed_independent_reward.py | 32 +++++++++------- 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 1eee5a6..2d2c816 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -122,16 +122,44 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # print(reward_LR) return reward_LR + def generate_sine_wave(increment, oscillation_width, amplitude_offset, amplitude_scale, deviation): # for training purpose only + session_start = random.uniform(-np.pi / 2, np.pi / 2) + session_length = 1000 + session_end = session_start + session_length + # increment = 1 + # oscillation_width = 0.5 + # amplitude_offset = 2 + # amplitude_scale = 2 + # deviation = 0 + value_input = np.arange(session_start, session_end, increment) + sine_output = (np.sin(value_input * oscillation_width) + amplitude_offset) * amplitude_scale + negative_sine_output = (-np.sin(value_input * oscillation_width) + amplitude_offset) * amplitude_scale + left_side_reward = np.random.normal(sine_output, deviation) + right_side_reward = np.random.normal(negative_sine_output, deviation) + # plt.plot(left_side_reward,'b'); plt.plot(right_side_reward,'r') + # visualize_scale = 10 + # plt.plot(left_side_reward[0:visualize_scale], 'b'); + # plt.plot(right_side_reward[0:visualize_scale], 'r') + reward_list = list(zip(left_side_reward, right_side_reward)) + return reward_list + if session_info['phase'] == "independent_reward": # from reward_distribution import generate_reward_trajectory - scale = session_info['reward']['scale'] - offset = session_info['reward']['offset'] - change_point = session_info['reward']['change_point'] - ntrials = session_info['reward']['ntrials'] + scale = session_info['independent_reward']['scale'] + offset = session_info['independent_reward']['offset'] + change_point = session_info['independent_reward']['change_point'] + ntrials = session_info['independent_reward']['ntrials'] reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) elif session_info['phase'] == "forced_choice": reward_size = session_info['reward_size'] - + elif session_info['phase'] == "sine_reward": + increment = session_info["sine_reward"]["increment"] + oscillation_width = session_info["sine_reward"]["oscillation_width"] + amplitude_offset = session_info["sine_reward"]["amplitude_offset"] + amplitude_scale = session_info["sine_reward"]["amplitude_scale"] + deviation = session_info["sine_reward"]["deviation"] + reward_distribution_list = generate_sine_wave(increment, oscillation_width, amplitude_offset, + amplitude_scale, deviation) first_trial_of_the_session = True # # you can change various parameters if you want @@ -177,6 +205,8 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 task.current_reward = reward_distribution_list[task.trial_number] + float(task.reward_size_offset) elif session_info['phase'] == "forced_choice": task.current_reward = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + task.current_reward = reward_distribution_list[task.trial_number] logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)[1:-1]) print(" - Current card condition: \n" + diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 4fba672..58ad6b8 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -36,7 +36,7 @@ session_info['config'] = 'headfixed2FC' session_info['treadmill_setup'] = {} session_info['treadmill'] = True -session_info['phase'] = 'independent_reward' +session_info['phase'] = 'independent_reward' # 'forced_choice', 'sine_reward' if session_info['treadmill']: session_info['treadmill_setup']['distance_cue'] = 5 # cm @@ -52,12 +52,8 @@ session_info['cue'] = ['LED_L', 'LED_R', 'all'] # session_info['state'] = ['block1', 'block2'] # session_info['choice'] = ['right', 'left'] # lick port -session_info['reward'] = ['small', 'large'] # reward size -session_info['reward_size'] = [10,10] session_info['air_duration'] = 0 session_info["vacuum_duration"] = 1 -session_info["key_reward_amount"] = 5 -session_info['reward_size_offset'] = 5 """ solenoid calibration information configuration """ @@ -95,8 +91,8 @@ def get_coefficient(): session_info["calibration_coefficient"]['3'] = [0.13, 0.0] session_info["calibration_coefficient"]['4'] = [0.13, 0.0] -if session_info['phase'] == 1: - session_info['reward_size'] = {'small': 10, 'large': 10} +if session_info['phase'] == "forced_choice": + session_info['reward_size'] = (10, 10) # print(session_info["calibration_coefficient"]) # define timeout during each condition @@ -105,12 +101,22 @@ def get_coefficient(): session_info['wait_for_choice'] = 60 session_info["punishment_timeout"] = 3 -session_info['reward'] = {} -session_info['reward']['scale'] = 0.5 -session_info['reward']['offset'] = 3.0 -session_info['reward']['change_point'] = 20 -session_info['reward']['ntrials'] = 1000 - +session_info["key_reward_amount"] = 2 +session_info['reward_size_offset'] = 2 +if session_info["phase"] == 'independent_reward': + session_info['independent_reward'] = {} + session_info['independent_reward']['scale'] = 0.5 + session_info['independent_reward']['offset'] = 3.0 + session_info['independent_reward']['change_point'] = 20 + session_info['independent_reward']['ntrials'] = 1000 + +if session_info["phase"] == 'sine_reward': + session_info["sine_reward"] = {} + session_info["sine_reward"]["increment"] = 1 + session_info["sine_reward"]["oscillation_width"] = 0.5 + session_info["sine_reward"]["amplitude_offset"] = 2 + session_info["sine_reward"]["amplitude_scale"] = 2 + session_info["sine_reward"]["deviation"] = 0 # define block_duration and initial block to start the session # session_info['block_duration'] = 30 # each block has this amount of repetition # session_info['block_variety'] = 2 From bc90a41f8f9e1b6dcd9e74d4b68edbad6b5d3aee Mon Sep 17 00:00:00 2001 From: season Date: Tue, 27 Jun 2023 11:04:30 -0400 Subject: [PATCH 070/135] headfixed_independent_reward_task sine wave reward --- run_headfixed_independent_reward_task.py | 19 +++++------------- session_info_headfixed_independent_reward.py | 21 +++++++------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 2d2c816..36f2014 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -122,24 +122,15 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # print(reward_LR) return reward_LR - def generate_sine_wave(increment, oscillation_width, amplitude_offset, amplitude_scale, deviation): # for training purpose only - session_start = random.uniform(-np.pi / 2, np.pi / 2) - session_length = 1000 + def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation): # for training purpose only + session_start = random.uniform(0, period_width) session_end = session_start + session_length - # increment = 1 - # oscillation_width = 0.5 - # amplitude_offset = 2 - # amplitude_scale = 2 - # deviation = 0 value_input = np.arange(session_start, session_end, increment) - sine_output = (np.sin(value_input * oscillation_width) + amplitude_offset) * amplitude_scale - negative_sine_output = (-np.sin(value_input * oscillation_width) + amplitude_offset) * amplitude_scale + + sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale + negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale left_side_reward = np.random.normal(sine_output, deviation) right_side_reward = np.random.normal(negative_sine_output, deviation) - # plt.plot(left_side_reward,'b'); plt.plot(right_side_reward,'r') - # visualize_scale = 10 - # plt.plot(left_side_reward[0:visualize_scale], 'b'); - # plt.plot(right_side_reward[0:visualize_scale], 'r') reward_list = list(zip(left_side_reward, right_side_reward)) return reward_list diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 58ad6b8..fa578f1 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -91,10 +91,6 @@ def get_coefficient(): session_info["calibration_coefficient"]['3'] = [0.13, 0.0] session_info["calibration_coefficient"]['4'] = [0.13, 0.0] -if session_info['phase'] == "forced_choice": - session_info['reward_size'] = (10, 10) -# print(session_info["calibration_coefficient"]) - # define timeout during each condition session_info['initiation_timeout'] = 120 # s session_info['cue_timeout'] = 120 @@ -103,25 +99,22 @@ def get_coefficient(): session_info["key_reward_amount"] = 2 session_info['reward_size_offset'] = 2 -if session_info["phase"] == 'independent_reward': + +if session_info['phase'] == "forced_choice": + session_info['reward_size'] = (10, 10) +elif session_info["phase"] == 'independent_reward': session_info['independent_reward'] = {} session_info['independent_reward']['scale'] = 0.5 session_info['independent_reward']['offset'] = 3.0 session_info['independent_reward']['change_point'] = 20 session_info['independent_reward']['ntrials'] = 1000 - -if session_info["phase"] == 'sine_reward': +elif session_info["phase"] == 'sine_reward': session_info["sine_reward"] = {} session_info["sine_reward"]["increment"] = 1 - session_info["sine_reward"]["oscillation_width"] = 0.5 + session_info["sine_reward"]["period_width"] = 40 session_info["sine_reward"]["amplitude_offset"] = 2 - session_info["sine_reward"]["amplitude_scale"] = 2 + session_info["sine_reward"]["amplitude_scale"] = 3 session_info["sine_reward"]["deviation"] = 0 -# define block_duration and initial block to start the session -# session_info['block_duration'] = 30 # each block has this amount of repetition -# session_info['block_variety'] = 2 -# if session_info['block_variety'] > 1: -# session_info['initial_block'] = 1 session_info['consecutive_control'] = False if session_info['consecutive_control']: From cd3126b3e1a063a7a990e7a3262f6e2c064d783c Mon Sep 17 00:00:00 2001 From: season Date: Tue, 27 Jun 2023 11:21:20 -0400 Subject: [PATCH 071/135] headfixed_independent_reward_task sine wave reward --- run_headfixed_independent_reward_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 36f2014..b29dc19 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -145,11 +145,11 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal reward_size = session_info['reward_size'] elif session_info['phase'] == "sine_reward": increment = session_info["sine_reward"]["increment"] - oscillation_width = session_info["sine_reward"]["oscillation_width"] + period_width = session_info["sine_reward"]["period_width"] amplitude_offset = session_info["sine_reward"]["amplitude_offset"] amplitude_scale = session_info["sine_reward"]["amplitude_scale"] deviation = session_info["sine_reward"]["deviation"] - reward_distribution_list = generate_sine_wave(increment, oscillation_width, amplitude_offset, + reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation) first_trial_of_the_session = True From 37f42abbd6e002d3f478ab863a94eab2c6cc6321 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 27 Jun 2023 11:23:37 -0400 Subject: [PATCH 072/135] headfixed_independent_reward_task sine wave reward --- run_headfixed_independent_reward_task.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index b29dc19..5042812 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -122,7 +122,7 @@ def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=2 # print(reward_LR) return reward_LR - def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation): # for training purpose only + def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only session_start = random.uniform(0, period_width) session_end = session_start + session_length value_input = np.arange(session_start, session_end, increment) @@ -144,13 +144,14 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal elif session_info['phase'] == "forced_choice": reward_size = session_info['reward_size'] elif session_info['phase'] == "sine_reward": + session_length = session_info["sine_reward"]["session_length"] increment = session_info["sine_reward"]["increment"] period_width = session_info["sine_reward"]["period_width"] amplitude_offset = session_info["sine_reward"]["amplitude_offset"] amplitude_scale = session_info["sine_reward"]["amplitude_scale"] deviation = session_info["sine_reward"]["deviation"] reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, - amplitude_scale, deviation) + amplitude_scale, deviation, session_length) first_trial_of_the_session = True # # you can change various parameters if you want From afab49613b726714b947679640edd5560e4d39a8 Mon Sep 17 00:00:00 2001 From: season Date: Wed, 28 Jun 2023 11:08:02 -0400 Subject: [PATCH 073/135] reward_timeout --- session_info_headfixed_independent_reward.py | 1 + 1 file changed, 1 insertion(+) diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index fa578f1..1a1b2aa 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -95,6 +95,7 @@ def get_coefficient(): session_info['initiation_timeout'] = 120 # s session_info['cue_timeout'] = 120 session_info['wait_for_choice'] = 60 +session_info['reward_timeout'] = 1 session_info["punishment_timeout"] = 3 session_info["key_reward_amount"] = 2 From 4db05f96cd0dda5a00e8ff5c11e1f4e3b5035095 Mon Sep 17 00:00:00 2001 From: season Date: Wed, 28 Jun 2023 14:28:57 -0400 Subject: [PATCH 074/135] correct trial number and total trial number differentiation --- headfixed_independent_reward_task.py | 7 ++++--- run_headfixed_independent_reward_task.py | 16 ++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 51708dc..5ddb9c1 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -114,7 +114,8 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa self.trial_running = False # trial statistics - self.trial_number = 0 + self.correct_trial_number = 0 + self.actual_trial_number = 0 self.error_count = 0 self.error_list = [] self.early_lick_error = False @@ -262,7 +263,7 @@ def enter_standby(self): self.check_cue('sound2') self.early_lick_error = False print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) def exit_standby(self): logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) @@ -316,7 +317,7 @@ def exit_cue_state(self): def enter_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") + print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") def exit_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 5042812..ebed007 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -164,22 +164,21 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal sleep(10) # loop over trials # Set a timer - t_minute = int(input("Enter the time in minutes: ")) ## wll add in the session info + t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info t_end = time.time() + 60 * t_minute while time.time() < t_end: # time check if task.error_repeat: # error repeat check task.error_repeat = False print("punishment_time_out: " + str(session_info["punishment_timeout"])) sleep(session_info["punishment_timeout"]) - print("Trial " + str(task.trial_number) + " \n") - task.trial_number += 1 + print("Trial " + str(task.actual_trial_number) + " \n") + task.actual_trial_number += 1 print("*******************************\n") print("*error_repeat trial* \n" + " - Current card condition: \n" + "*******************************\n" + "*reward_side: " + str(task.current_card[0]) + "\n" + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - # task.trial_number += 1 else: if not first_trial_of_the_session: print("reward_time_out: " + str(session_info["reward_timeout"])) @@ -188,17 +187,18 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal first_trial_of_the_session = False # setup the beginning of a new trial task.error_count = 0 # reset the error count if previous trial is correct - print("Trial " + str(task.trial_number) + " \n") - task.trial_number += 1 + print("Trial " + str(task.actual_trial_number) + " \n") + task.correct_trial_number += 1 + task.actual_trial_number += 1 print("*******************************\n") # acquire new reward contingency and cue association task.current_card = task_information.draw_card(session_info['phase']) if session_info['phase'] == "independent_reward": - task.current_reward = reward_distribution_list[task.trial_number] + float(task.reward_size_offset) + task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) elif session_info['phase'] == "forced_choice": task.current_reward = session_info['reward_size'] elif session_info['phase'] == "sine_reward": - task.current_reward = reward_distribution_list[task.trial_number] + task.current_reward = reward_distribution_list[task.correct_trial_number] logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)[1:-1]) print(" - Current card condition: \n" + From 7174b6c23ff05b4a4454ed8114642c9807d17b3e Mon Sep 17 00:00:00 2001 From: season Date: Thu, 29 Jun 2023 14:55:51 -0400 Subject: [PATCH 075/135] organization change --- task_protocol/EFO_task/EFO_task.py | 201 ++++++++ .../headfixed_independent_reward_task.py | 463 ++++++++++++++++++ task_protocol/headfixed_reward | 463 ++++++++++++++++++ task_protocol/kelly_record_task.py | 58 +++ task_protocol/kelly_task.py | 181 +++++++ task_protocol/lick_task.py | 182 +++++++ task_protocol/remi_self_admin_task.py | 372 ++++++++++++++ .../run_headfixed_independent_reward_task.py | 232 +++++++++ task_protocol/run_headfixed_reward | 232 +++++++++ task_protocol/run_kelly_task.py | 126 +++++ task_protocol/run_record_task.py | 100 ++++ task_protocol/run_remi_self_admin_task.py | 134 +++++ task_protocol/run_self_admin_task.py | 134 +++++ task_protocol/self_admin_task.py | 308 ++++++++++++ ...ssion_info_headfixed_independent_reward.py | 123 +++++ task_protocol/session_info_headfixed_task.py | 123 +++++ task_protocol/session_info_self_admin.py | 66 +++ task_protocol/session_info_year-month-date.py | 65 +++ task_protocol/task_information_headfixed.py | 27 + .../task_information_independent_reward.py | 27 + task_protocol/visualization_task.py | 182 +++++++ 21 files changed, 3799 insertions(+) create mode 100644 task_protocol/EFO_task/EFO_task.py create mode 100644 task_protocol/headfixed_independent_reward_task.py create mode 100644 task_protocol/headfixed_reward create mode 100755 task_protocol/kelly_record_task.py create mode 100755 task_protocol/kelly_task.py create mode 100644 task_protocol/lick_task.py create mode 100644 task_protocol/remi_self_admin_task.py create mode 100644 task_protocol/run_headfixed_independent_reward_task.py create mode 100644 task_protocol/run_headfixed_reward create mode 100755 task_protocol/run_kelly_task.py create mode 100755 task_protocol/run_record_task.py create mode 100644 task_protocol/run_remi_self_admin_task.py create mode 100644 task_protocol/run_self_admin_task.py create mode 100644 task_protocol/self_admin_task.py create mode 100644 task_protocol/session_info_headfixed_independent_reward.py create mode 100644 task_protocol/session_info_headfixed_task.py create mode 100644 task_protocol/session_info_self_admin.py create mode 100755 task_protocol/session_info_year-month-date.py create mode 100644 task_protocol/task_information_headfixed.py create mode 100644 task_protocol/task_information_independent_reward.py create mode 100644 task_protocol/visualization_task.py diff --git a/task_protocol/EFO_task/EFO_task.py b/task_protocol/EFO_task/EFO_task.py new file mode 100644 index 0000000..4eaddd7 --- /dev/null +++ b/task_protocol/EFO_task/EFO_task.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Oct 11 18:02:34 2022 +First tentative to do a new 2 AFC task that has 4 pokes, with the 4th poke being +the reward that is delivered to the animal separate from the choices +@author: eliezyer +""" + + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class EFOTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + # Task has the following states: standby, trial_available, cue, choice_available, and reward_available (punishment?) + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="trial_available", + on_enter=["enter_trial_available"], + on_exit=["exit_trial_available"], + ), + Timeout( + name="start_cue", + on_enter=["enter_start_cue"], + on_exit=["exit_start_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + Timeout( + name="choice_available", + on_enter=["enter_choice_available"], + on_exit=["exit_choice_available"], + ), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_available", "standby", "start_cue"], + ["choice_available", "start_cue", "reward_available"], + ["reward_available", "choice_available", "standby"], + ] + # EFO: STOPPED HERE ON 10/11/2022 + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = behavbox.Pump() + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + self.box.sound1.blink(0.5, 0.1, 1) + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + self.box.cueLED4.on() + self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + self.pump.reward("1", self.session_info["reward_size"]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + self.pump.reward("3", self.session_info["reward_size"]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() + self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/headfixed_independent_reward_task.py b/task_protocol/headfixed_independent_reward_task.py new file mode 100644 index 0000000..0953d1b --- /dev/null +++ b/task_protocol/headfixed_independent_reward_task.py @@ -0,0 +1,463 @@ +# python3: headfixed_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training task structure +description: + an updated test version of headfixed_task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class HeadfixedTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["wait_for_choice"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.correct_trial_number = 0 + self.actual_trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = True + self.multiple_choice_error = False + self.error_repeat = False + + self.pump_num = None + self.reward_size = None + self.current_reward = None + self.reward_check = False + self.reward_size_offset = self.session_info['reward_size_offset'] + + self.block_count = 0 + self.blocknumber = self.session_info["block_number"] + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + cue_state = self.current_card[0] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + if cue_state == 'all': + side_choice = side_mice + if side_choice == 'left': + self.pump_num = self.current_card[2][0] + self.reward_size = self.current_reward[0] + print("self.current_reward[0]: " + str(self.current_reward[0])) + elif side_choice == 'right': + self.pump_num = self.current_card[2][1] + self.reward_size = self.current_reward[1] + print("self.current_reward[0]: " + str(self.current_reward[1])) + elif cue_state == 'LED_L': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[0] + elif cue_state == 'LED_R': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[1] + print("!!!!!!!!CUE_STATE: " + str(cue_state)) + if side_mice == side_choice: # if the animal chose correctly + self.side_mice_buffer = side_mice + if side_mice == side_choice: # if the animal chose correctly + if self.lick_count == 0: # if this is the first lick + self.wrong_choice_error = False + self.reward_check = True + self.lick_count += 1 + self.restart() + elif self.side_mice_buffer: + if self.lick_count == 0: + self.wrong_choice_error = True + self.lick_count += 1 + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.early_lick_error = False + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.lick_count = 0 + self.side_mice_buffer = None + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + self.cue_off('sound1') + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if not self.early_lick_error: + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + if self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('no_choice_error') + elif self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('wrong_choice_error') + elif self.reward_check: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.pump.reward(self.pump_num, self.reward_size) + self.error_repeat = False + self.total_reward += 1 + self.reward_check = False + self.error_list.append('correct_trial') + self.pump_num = None + self.reward_size = None + self.wrong_choice_error = False + + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1, 0.1, 1) + elif cue == 'LED_L': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) + elif cue == 'all': + self.box.cueLED1.on() + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.cueLED1.off() + self.box.cueLED2.off() + elif cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'LED_L': + self.box.cueLED1.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/headfixed_reward b/task_protocol/headfixed_reward new file mode 100644 index 0000000..5ddb9c1 --- /dev/null +++ b/task_protocol/headfixed_reward @@ -0,0 +1,463 @@ +# python3: headfixed_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training task structure +description: + an updated test version of headfixed_task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class HeadfixedIndependentRewardTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["wait_for_choice"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.correct_trial_number = 0 + self.actual_trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = True + self.multiple_choice_error = False + self.error_repeat = False + + self.pump_num = None + self.reward_size = None + self.current_reward = None + self.reward_check = False + self.reward_size_offset = self.session_info['reward_size_offset'] + + self.block_count = 0 + self.blocknumber = self.session_info["block_number"] + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + cue_state = self.current_card[0] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + if cue_state == 'all': + side_choice = side_mice + if side_choice == 'left': + self.pump_num = self.current_card[2][0] + self.reward_size = self.current_reward[0] + print("self.current_reward[0]: " + str(self.current_reward[0])) + elif side_choice == 'right': + self.pump_num = self.current_card[2][1] + self.reward_size = self.current_reward[1] + print("self.current_reward[0]: " + str(self.current_reward[1])) + elif cue_state == 'LED_L': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[0] + elif cue_state == 'LED_R': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[1] + print("!!!!!!!!CUE_STATE: " + str(cue_state)) + if side_mice == side_choice: # if the animal chose correctly + self.side_mice_buffer = side_mice + if side_mice == side_choice: # if the animal chose correctly + if self.lick_count == 0: # if this is the first lick + self.wrong_choice_error = False + self.reward_check = True + self.lick_count += 1 + self.restart() + elif self.side_mice_buffer: + if self.lick_count == 0: + self.wrong_choice_error = True + self.lick_count += 1 + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.early_lick_error = False + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.lick_count = 0 + self.side_mice_buffer = None + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + self.cue_off('sound1') + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if not self.early_lick_error: + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + if self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('no_choice_error') + elif self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('wrong_choice_error') + elif self.reward_check: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.pump.reward(self.pump_num, self.reward_size) + self.error_repeat = False + self.total_reward += 1 + self.reward_check = False + self.error_list.append('correct_trial') + self.pump_num = None + self.reward_size = None + self.wrong_choice_error = False + + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1, 0.1, 1) + elif cue == 'LED_L': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) + elif cue == 'all': + self.box.cueLED1.on() + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.cueLED1.off() + self.box.cueLED2.off() + elif cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'LED_L': + self.box.cueLED1.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/kelly_record_task.py b/task_protocol/kelly_record_task.py new file mode 100755 index 0000000..1440cce --- /dev/null +++ b/task_protocol/kelly_record_task.py @@ -0,0 +1,58 @@ +# Kelly recording task +# This task is designed for recording freely moving animal behavioral task + +import logging +from datetime import datetime +import os +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +# import behavbox_test +import behavbox +class KellyRecordTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + print(self.session_info) + + # initialize behavior box + # self.box = behavbox_test.BehavBoxTest(self.session_info) + self.box = behavbox.BehavBox(self.session_info) + def start_session(self): + print("Start recording video") + self.box.video_start() + + def end_session(self): + print("Stop recording video") + self.box.video_stop() diff --git a/task_protocol/kelly_task.py b/task_protocol/kelly_task.py new file mode 100755 index 0000000..73cae35 --- /dev/null +++ b/task_protocol/kelly_task.py @@ -0,0 +1,181 @@ +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class KellyTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + Timeout( + name="cue", + on_enter=["enter_cue"], + on_exit=["exit_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_start", "standby", "reward_available"], + ["active_poke", "reward_available", "cue"], + ["timeup", "cue", "standby"], + ] + + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = behavbox.Pump() + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + self.box.sound1.blink(0.5, 0.1, 1) + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + self.box.cueLED4.on() + self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + self.pump.reward("1", self.session_info["reward_size"]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + self.pump.reward("3", self.session_info["reward_size"]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() + self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/lick_task.py b/task_protocol/lick_task.py new file mode 100644 index 0000000..4f69474 --- /dev/null +++ b/task_protocol/lick_task.py @@ -0,0 +1,182 @@ +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class LickTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + Timeout( + name="cue", + on_enter=["enter_cue"], + on_exit=["exit_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_start", "standby", "reward_available"], + ["active_poke", "reward_available", "cue"], + ["timeup", "cue", "standby"], + ] + + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + # self.box.sound1.blink(0.5, 0.1, 1) + # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + # self.box.cueLED4.on() + # self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + reward_size = "small" + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + self.pump.reward("1", self.session_info["reward_size"][reward_size]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + self.pump.reward("2", self.session_info["reward_size"][reward_size]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() + # self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/remi_self_admin_task.py b/task_protocol/remi_self_admin_task.py new file mode 100644 index 0000000..5b28f8e --- /dev/null +++ b/task_protocol/remi_self_admin_task.py @@ -0,0 +1,372 @@ +#!/usr/bin/env python +# coding: utf-8 + + +# remifentanil self-administration task + +# NOTE: THIS TASK WILL BE NEARLY IDENTICAL TO THE SUCROSE SA TASK, EXCEPT THE MOUSE WILL +# OBTAIN AN INTRAVENOUS INFUSION OF REMIFENTANIL INSTEAD OF SUCROSE +# I MOSTLY NEED ASSISTANCE WITH THE ivsa_syringe_pump class (which will presumably end up in the behavbox code, not this code) + +# python3: headfixed_task.py +""" +author: tian qiu +date: 2023-02-28 +name: remi_self_admin_task.py +goal: self administration task adpated via Mitch's instruction +description: + an updated test version of self_admin_Task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox +# import ivsa_syringe_pump # I will need to add the ivsa_syringe_pump class to the behavbox code + + +#######################ivsa_syringe_pump code below######################### +""" +class ivsa_syringe_pump(object,session_info): # changed this to syringe pump + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + self.syringe_pump = LED(23) + self.reward_list = [] + + # COMMENTS ON REWARD LOGIC# + # Syringe pump will be turned on depending on the weight of the mouse + # For a 30g mouse, the syringe pump will be on for 1 second + # For <30g mouse, the syringe pump will be on for <1s + # For >30g mouse, the syringe pump will be on for >1s + def reward(self): # prototype mouse weight equals 30 + infusion_duration = (self.session_info['mouse_weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial + self.syringe_pump.blink(infusion_duration, 0.1, + 1) # season's edit: this is a shorter implement without having a function + self.reward_list.append(("syringe_pump_reward", infusion_duration)) + logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) + # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration + +""" +# COMMENTS ON INJECT LOGIC# +# this code will turn on the syringe pump, sleep for 'infusion_duration', then turn off the syringe pump with a 2nd pulse +# def inject(self, duration): # season's' edit: a function requires the input - infusion duration +# self.on() +# sleep(duration) # season's' edit: a function requires the input - infusion duration +# self.off() +############################################################################ + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class RemiSelfAdminTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] + ['restart', 'reward_available', 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.lever_pressed_time = 0.0 + self.lever_press_interval = self.session_info["lever_press_interval"] + # self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + self.reward_time_delay = self.session_info["reward_time_delay"] + self.reward_time_recent = time.time() + self.reward_pump = self.session_info["reward_pump"] + self.reward_size = self.session_info["reward_size"] + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + # self.distance_buffer = None + # self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + # for the reward function + self.syringe_pump = LED(23) + self.reward_list = [] + + def reward(self): # prototype mouse weight equals 30 + infusion_duration = (self.session_info['weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial + self.syringe_pump.blink(infusion_duration, 0.1, + 1) # season's edit: this is a shorter implement without having a function + self.reward_list.append(("syringe_pump_reward", infusion_duration)) + logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) + # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + if self.state == "standby": + pass + elif self.state == "reward_available": + if self.event_name == "reserved_rx1_pressed": + lever_pressed_time_temp = time.time() + lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time + if lever_pressed_dt >= self.lever_press_interval and (time.time() - self.reward_time_recent > self.reward_time_delay): + self.reward() + self.lever_pressed_time = lever_pressed_time_temp + self.reward_time_recent = time.time() + self.total_reward += 1 + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + # self.cue_off('all') + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + # if self.early_lick_error: + # self.error_list.append("early_lick_error") + # self.early_lick_error = False + self.lick_count = 0 + self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + # self.cue_off('all') + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + self.trial_running = True + # self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + # self.cue_off('sound2') + # self.reward_times_up = True + self.pump.reward("vaccum", 0) + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/run_headfixed_independent_reward_task.py b/task_protocol/run_headfixed_independent_reward_task.py new file mode 100644 index 0000000..ebed007 --- /dev/null +++ b/task_protocol/run_headfixed_independent_reward_task.py @@ -0,0 +1,232 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed2FC_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: run_headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training run task file +description: + an updated test version of run_headfixed_task.py + +""" +import random +import numpy as np +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed_independent_reward_task import HeadfixedIndependentRewardTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_independent_reward import TaskInformation + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) + + + def cumsum_positive(input_list): + for index in range(len(input_list)): + if index == 0 and input_list[index] < 0: + input_list[index] = -input_list[index] + elif input_list[index] + input_list[index - 1] < 0: + input_list[index] = input_list[index] - input_list[index - 1] + else: + input_list[index] = input_list[index] + input_list[index - 1] + return input_list + + def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials / change_point)): + temp = np.random.randn(change_point) * scale + rewards_L.append(cumsum_positive(temp) + offset) + temp = np.random.randn(change_point) * scale + rewards_R.append(cumsum_positive(temp) + offset) + rewards_L = np.hstack(rewards_L) + rewards_R = np.hstack(rewards_R) + # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials, :] + # print(reward_LR) + return reward_LR + + def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only + session_start = random.uniform(0, period_width) + session_end = session_start + session_length + value_input = np.arange(session_start, session_end, increment) + + sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale + negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale + left_side_reward = np.random.normal(sine_output, deviation) + right_side_reward = np.random.normal(negative_sine_output, deviation) + reward_list = list(zip(left_side_reward, right_side_reward)) + return reward_list + + if session_info['phase'] == "independent_reward": + # from reward_distribution import generate_reward_trajectory + scale = session_info['independent_reward']['scale'] + offset = session_info['independent_reward']['offset'] + change_point = session_info['independent_reward']['change_point'] + ntrials = session_info['independent_reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + elif session_info['phase'] == "forced_choice": + reward_size = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + session_length = session_info["sine_reward"]["session_length"] + increment = session_info["sine_reward"]["increment"] + period_width = session_info["sine_reward"]["period_width"] + amplitude_offset = session_info["sine_reward"]["amplitude_offset"] + amplitude_scale = session_info["sine_reward"]["amplitude_scale"] + deviation = session_info["sine_reward"]["deviation"] + reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, + amplitude_scale, deviation, session_length) + first_trial_of_the_session = True + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info + t_end = time.time() + 60 * t_minute + while time.time() < t_end: # time check + if task.error_repeat: # error repeat check + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("Trial " + str(task.actual_trial_number) + " \n") + task.actual_trial_number += 1 + print("*******************************\n") + print("*error_repeat trial* \n" + + " - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + else: + if not first_trial_of_the_session: + print("reward_time_out: " + str(session_info["reward_timeout"])) + sleep(session_info["reward_timeout"]) + else: + first_trial_of_the_session = False + # setup the beginning of a new trial + task.error_count = 0 # reset the error count if previous trial is correct + print("Trial " + str(task.actual_trial_number) + " \n") + task.correct_trial_number += 1 + task.actual_trial_number += 1 + print("*******************************\n") + # acquire new reward contingency and cue association + task.current_card = task_information.draw_card(session_info['phase']) + if session_info['phase'] == "independent_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) + elif session_info['phase'] == "forced_choice": + task.current_reward = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + + ";current_reward_" + str(task.current_reward)[1:-1]) + print(" - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() \ No newline at end of file diff --git a/task_protocol/run_headfixed_reward b/task_protocol/run_headfixed_reward new file mode 100644 index 0000000..05938ff --- /dev/null +++ b/task_protocol/run_headfixed_reward @@ -0,0 +1,232 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed2FC_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: run_headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training run task file +description: + an updated test version of run_headfixed_task.py + +""" +import random +import numpy as np +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed_task import HeadfixedTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/headfixed_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_independent_reward import TaskInformation + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + task = HeadfixedTask(name="headfixed_task", session_info=session_info) + + + def cumsum_positive(input_list): + for index in range(len(input_list)): + if index == 0 and input_list[index] < 0: + input_list[index] = -input_list[index] + elif input_list[index] + input_list[index - 1] < 0: + input_list[index] = input_list[index] - input_list[index - 1] + else: + input_list[index] = input_list[index] + input_list[index - 1] + return input_list + + def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials / change_point)): + temp = np.random.randn(change_point) * scale + rewards_L.append(cumsum_positive(temp) + offset) + temp = np.random.randn(change_point) * scale + rewards_R.append(cumsum_positive(temp) + offset) + rewards_L = np.hstack(rewards_L) + rewards_R = np.hstack(rewards_R) + # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials, :] + # print(reward_LR) + return reward_LR + + def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only + session_start = random.uniform(0, period_width) + session_end = session_start + session_length + value_input = np.arange(session_start, session_end, increment) + + sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale + negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale + left_side_reward = np.random.normal(sine_output, deviation) + right_side_reward = np.random.normal(negative_sine_output, deviation) + reward_list = list(zip(left_side_reward, right_side_reward)) + return reward_list + + if session_info['phase'] == "independent_reward": + # from reward_distribution import generate_reward_trajectory + scale = session_info['independent_reward']['scale'] + offset = session_info['independent_reward']['offset'] + change_point = session_info['independent_reward']['change_point'] + ntrials = session_info['independent_reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + elif session_info['phase'] == "forced_choice": + reward_size = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + session_length = session_info["sine_reward"]["session_length"] + increment = session_info["sine_reward"]["increment"] + period_width = session_info["sine_reward"]["period_width"] + amplitude_offset = session_info["sine_reward"]["amplitude_offset"] + amplitude_scale = session_info["sine_reward"]["amplitude_scale"] + deviation = session_info["sine_reward"]["deviation"] + reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, + amplitude_scale, deviation, session_length) + first_trial_of_the_session = True + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info + t_end = time.time() + 60 * t_minute + while time.time() < t_end: # time check + if task.error_repeat: # error repeat check + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("Trial " + str(task.actual_trial_number) + " \n") + task.actual_trial_number += 1 + print("*******************************\n") + print("*error_repeat trial* \n" + + " - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + else: + if not first_trial_of_the_session: + print("reward_time_out: " + str(session_info["reward_timeout"])) + sleep(session_info["reward_timeout"]) + else: + first_trial_of_the_session = False + # setup the beginning of a new trial + task.error_count = 0 # reset the error count if previous trial is correct + print("Trial " + str(task.actual_trial_number) + " \n") + task.correct_trial_number += 1 + task.actual_trial_number += 1 + print("*******************************\n") + # acquire new reward contingency and cue association + task.current_card = task_information.draw_card(session_info['phase']) + if session_info['phase'] == "independent_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) + elif session_info['phase'] == "forced_choice": + task.current_reward = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + + ";current_reward_" + str(task.current_reward)[1:-1]) + print(" - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() \ No newline at end of file diff --git a/task_protocol/run_kelly_task.py b/task_protocol/run_kelly_task.py new file mode 100755 index 0000000..2c03e74 --- /dev/null +++ b/task_protocol/run_kelly_task.py @@ -0,0 +1,126 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from kelly_task import KellyTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + task_info_path = '/home/pi/experiment_info/kelly_task/session_info' + sys.path.insert(0, task_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + # initiate task object\ + task = KellyTask(name="fentanyl_task", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + sleep(10) + # loop over trials + for i in range(2): + logging.info(str("##############################\n" + + str(time.time())) + ", starting_trial, " + str(i) + + str("\n##############################")) + + task.trial_start() + + while task.trial_running: + task.run() + + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + pygame.quit() + + +# # exit because of error +# except (RuntimeError) as ex: +# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) +# # save dicts to disk +# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) +# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + + + + diff --git a/task_protocol/run_record_task.py b/task_protocol/run_record_task.py new file mode 100755 index 0000000..66c7e31 --- /dev/null +++ b/task_protocol/run_record_task.py @@ -0,0 +1,100 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +import logging +from datetime import datetime +import os +import logging.config +import socket +import importlib +import colorama +from colorama import Fore, Style +import scipy.io, pickle +from time import sleep + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from kelly_record_task import KellyRecordTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + # There should be a session_info module corresponding to this before running this file + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + task_info_path = '/home/pi/experiment_info/record_task/session_info' + sys.path.insert(0, task_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info[ + 'datetime'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # initiate task object\ + task = KellyRecordTask(name="fentanyl_task", session_info=session_info) + + # start session + print("start_session") + duration_buffer = 10 # it takes 8 seconds for the camera and the video_start function to be set up + duration = int(input("Enter the time in seconds: ")) + duration_buffer + task.start_session() + sleep(duration) + task.end_session() + dir_name = session_info['dir_name'] + basename = session_info['basename'] + file_name = dir_name + "/" + basename + base_dir = '/mnt/hd/' + hd_dir = base_dir + basename + + # Per Kelly's request, remove all the files except the video file from the hard drive +# print("Remove mat - ") +# os.system("rm -r " + hd_dir + "/*.mat") +# print("Remove pkl - ") +# os.system("rm -r " + hd_dir + "/*.pkl") +# print("Remove log -") +# os.system("rm -r " + hd_dir + "/*.log") + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + task.end_session() + # # save dicts to disk + # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + # # pygame.quit() + + +# exit because of error +except (RuntimeError) as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # # save dicts to disk + # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) diff --git a/task_protocol/run_remi_self_admin_task.py b/task_protocol/run_remi_self_admin_task.py new file mode 100644 index 0000000..5825a8e --- /dev/null +++ b/task_protocol/run_remi_self_admin_task.py @@ -0,0 +1,134 @@ +#run_self_admin.task + +#!/usr/bin/env -S ipython3 -i +# run_self_admin_task.py +""" +author: tian qiu +date: 2023-02-28 +name: run_remi_self_admin_task.py +goal: running the self_admin_Task +description: + adapted from Mitch's run_self_admin_task.py + +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from remi_self_admin_task import RemiSelfAdminTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + + task = RemiSelfAdminTask(name="remi_self_admin_task", session_info=session_info) + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + for i in range(session_info['max_trial_number']): + print("Trial " + str(i) + "\n") + if time.time() >= t_end: + print("Times up, finishing up") + break + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() diff --git a/task_protocol/run_self_admin_task.py b/task_protocol/run_self_admin_task.py new file mode 100644 index 0000000..cf52841 --- /dev/null +++ b/task_protocol/run_self_admin_task.py @@ -0,0 +1,134 @@ +#run_self_admin.task + +#!/usr/bin/env -S ipython3 -i +# run_self_admin_task.py +""" +author: tian qiu +date: 2023-01-25 +name: run_self_admin_task.py +goal: running the self_admin_Task +description: + adapted from Mitch's run_self_admin_task.py + +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from self_admin_task import SelfAdminTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + + task = SelfAdminTask(name="self_admin_task", session_info=session_info) + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + for i in range(session_info['max_trial_number']): + print("Trial " + str(i) + "\n") + if time.time() >= t_end: + print("Times up, finishing up") + break + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() diff --git a/task_protocol/self_admin_task.py b/task_protocol/self_admin_task.py new file mode 100644 index 0000000..fec7a43 --- /dev/null +++ b/task_protocol/self_admin_task.py @@ -0,0 +1,308 @@ +# python3: headfixed_task.py +""" +author: tian qiu +date: 2023-01-26 +name: self_admin_Task.py +goal: self administration task adpated via Mitch's instruction +description: + an updated test version of self_admin_Task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class SelfAdminTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] + ['restart', 'reward_available', 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.lever_pressed_time = 0.0 + self.lever_press_interval = self.session_info["lever_press_interval"] + # self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + self.reward_pump = self.session_info["reward_pump"] + self.reward_size = self.session_info["reward_size"] + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + # self.distance_buffer = None + # self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + if self.state == "standby": + pass + elif self.state == "reward_available": + if self.event_name == "reserved_rx1_pressed": + lever_pressed_time_temp = time.time() + lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time + if lever_pressed_dt >= self.lever_press_interval: + self.pump.reward(self.reward_pump, self.reward_size) + self.lever_pressed_time = lever_pressed_time_temp + self.total_reward += 1 + # self.active_press += 1 + # self.active_press_count_list.append(self.left_poke_count) + # self.timeline_active_press.append(time.time()) + # elif self.event_name == "reserved_rx2_pressed": + # + # self.inactive_press += 1 + # self.inactive_press_count_list.append(self.right_poke_count) + # self.timeline_inactive_press.append(time.time()) + + # Lick detection: + # if self.event_name == "left_IR_entry": + # self.left_poke_count += 1 + # self.left_poke_count_list.append(self.left_poke_count) + # self.timeline_left_poke.append(time.time()) + # self.lick_count += 1 + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + # self.cue_off('all') + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + # if self.early_lick_error: + # self.error_list.append("early_lick_error") + # self.early_lick_error = False + # self.lick_count = 0 + # self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + self.trial_running = True + # self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + # self.cue_off('sound2') + # self.reward_times_up = True + self.pump.reward("vaccum", 0) + # if self.multiple_choice_error: + # logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) + # self.error_repeat = False + # self.error_list.append('multiple_choice_error') + # self.multiple_choice_error = False + # elif self.lick_count == 0: + # logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + # self.error_repeat = True + # self.error_list.append('no_choice_error') + # self.lick_count = 0 + # self.reward_time_start = None + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/session_info_headfixed_independent_reward.py b/task_protocol/session_info_headfixed_independent_reward.py new file mode 100644 index 0000000..1a1b2aa --- /dev/null +++ b/task_protocol/session_info_headfixed_independent_reward.py @@ -0,0 +1,123 @@ +from datetime import datetime +import os +import pysistence, collections +import socket +import pandas as pd +import numpy as np + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 0.0 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() +session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts + +session_info['config'] = 'headfixed2FC' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info["lick_threshold"] = 1 +# visual stimulus +session_info["visual_stimulus"] = False + +session_info['config'] = 'headfixed2FC' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +session_info['phase'] = 'independent_reward' # 'forced_choice', 'sine_reward' + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_cue'] = 5 # cm + session_info['treadmill_setup']['distance_initiation'] = 10 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['LED_L', 'LED_R', 'all'] +# session_info['state'] = ['block1', 'block2'] # +session_info['choice'] = ['right', 'left'] # lick port +session_info['air_duration'] = 0 +session_info["vacuum_duration"] = 1 + +""" solenoid calibration information configuration """ + +solenoid_coeff = None +def get_coefficient(): + df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") + pump_coefficient = {} + + for pump_num in range(1, 5): + df_pump = df_calibration[df_calibration['pump_number'] == pump_num] + mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) + on_time = df_pump['on_time'] + + fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first + pump_coefficient[str(pump_num)] = fit_calibration + return pump_coefficient + +try: + solenoid_coeff = get_coefficient() +except Exception as e: + print(e) + +session_info["calibration_coefficient"] = {} + +if solenoid_coeff: + session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] + session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] + session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] + session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] +else: + print("No coefficients, generate the default") + # solenoid valve linear fit coefficient for each pump + session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first + session_info["calibration_coefficient"]['2'] = [0.13, 0] + session_info["calibration_coefficient"]['3'] = [0.13, 0.0] + session_info["calibration_coefficient"]['4'] = [0.13, 0.0] + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['wait_for_choice'] = 60 +session_info['reward_timeout'] = 1 +session_info["punishment_timeout"] = 3 + +session_info["key_reward_amount"] = 2 +session_info['reward_size_offset'] = 2 + +if session_info['phase'] == "forced_choice": + session_info['reward_size'] = (10, 10) +elif session_info["phase"] == 'independent_reward': + session_info['independent_reward'] = {} + session_info['independent_reward']['scale'] = 0.5 + session_info['independent_reward']['offset'] = 3.0 + session_info['independent_reward']['change_point'] = 20 + session_info['independent_reward']['ntrials'] = 1000 +elif session_info["phase"] == 'sine_reward': + session_info["sine_reward"] = {} + session_info["sine_reward"]["increment"] = 1 + session_info["sine_reward"]["period_width"] = 40 + session_info["sine_reward"]["amplitude_offset"] = 2 + session_info["sine_reward"]["amplitude_scale"] = 3 + session_info["sine_reward"]["deviation"] = 0 + +session_info['consecutive_control'] = False +if session_info['consecutive_control']: + session_info['consecutive_max'] = 3 + diff --git a/task_protocol/session_info_headfixed_task.py b/task_protocol/session_info_headfixed_task.py new file mode 100644 index 0000000..1a1b2aa --- /dev/null +++ b/task_protocol/session_info_headfixed_task.py @@ -0,0 +1,123 @@ +from datetime import datetime +import os +import pysistence, collections +import socket +import pandas as pd +import numpy as np + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 0.0 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() +session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts + +session_info['config'] = 'headfixed2FC' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info["lick_threshold"] = 1 +# visual stimulus +session_info["visual_stimulus"] = False + +session_info['config'] = 'headfixed2FC' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +session_info['phase'] = 'independent_reward' # 'forced_choice', 'sine_reward' + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_cue'] = 5 # cm + session_info['treadmill_setup']['distance_initiation'] = 10 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['LED_L', 'LED_R', 'all'] +# session_info['state'] = ['block1', 'block2'] # +session_info['choice'] = ['right', 'left'] # lick port +session_info['air_duration'] = 0 +session_info["vacuum_duration"] = 1 + +""" solenoid calibration information configuration """ + +solenoid_coeff = None +def get_coefficient(): + df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") + pump_coefficient = {} + + for pump_num in range(1, 5): + df_pump = df_calibration[df_calibration['pump_number'] == pump_num] + mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) + on_time = df_pump['on_time'] + + fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first + pump_coefficient[str(pump_num)] = fit_calibration + return pump_coefficient + +try: + solenoid_coeff = get_coefficient() +except Exception as e: + print(e) + +session_info["calibration_coefficient"] = {} + +if solenoid_coeff: + session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] + session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] + session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] + session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] +else: + print("No coefficients, generate the default") + # solenoid valve linear fit coefficient for each pump + session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first + session_info["calibration_coefficient"]['2'] = [0.13, 0] + session_info["calibration_coefficient"]['3'] = [0.13, 0.0] + session_info["calibration_coefficient"]['4'] = [0.13, 0.0] + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['wait_for_choice'] = 60 +session_info['reward_timeout'] = 1 +session_info["punishment_timeout"] = 3 + +session_info["key_reward_amount"] = 2 +session_info['reward_size_offset'] = 2 + +if session_info['phase'] == "forced_choice": + session_info['reward_size'] = (10, 10) +elif session_info["phase"] == 'independent_reward': + session_info['independent_reward'] = {} + session_info['independent_reward']['scale'] = 0.5 + session_info['independent_reward']['offset'] = 3.0 + session_info['independent_reward']['change_point'] = 20 + session_info['independent_reward']['ntrials'] = 1000 +elif session_info["phase"] == 'sine_reward': + session_info["sine_reward"] = {} + session_info["sine_reward"]["increment"] = 1 + session_info["sine_reward"]["period_width"] = 40 + session_info["sine_reward"]["amplitude_offset"] = 2 + session_info["sine_reward"]["amplitude_scale"] = 3 + session_info["sine_reward"]["deviation"] = 0 + +session_info['consecutive_control'] = False +if session_info['consecutive_control']: + session_info['consecutive_max'] = 3 + diff --git a/task_protocol/session_info_self_admin.py b/task_protocol/session_info_self_admin.py new file mode 100644 index 0000000..340fd91 --- /dev/null +++ b/task_protocol/session_info_self_admin.py @@ -0,0 +1,66 @@ +# session_info_self_admin.py + +# put all of your mouse and session info in here + +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' + +session_info['weight'] = 32.18 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +# session_info['config'] = 'freely_moving_v1' +session_info['config'] = 'self_admin' + +session_info['max_trial_number'] = 100 + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 2 +# visual stimulus +session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', +# '/home/pi/second_grating.dat'] +# session_info['vis_raws'] = [] + +# task related information + +session_info['config'] = 'headfixed_walk' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 10 # cm + session_info['treadmill_setup']['distance_cue'] = 25 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info["reward_pump"] = '1' +session_info['reward_size'] = 5 + + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['reward_timeout'] = 60 +# session_info["punishment_timeout"] = 1 diff --git a/task_protocol/session_info_year-month-date.py b/task_protocol/session_info_year-month-date.py new file mode 100755 index 0000000..5abf3e8 --- /dev/null +++ b/task_protocol/session_info_year-month-date.py @@ -0,0 +1,65 @@ +# put all of your mouse and session info in here +import random +from datetime import datetime +import os +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] +# session_info['trainingPhase'] = 4 +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 32.18 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +# session_info['config'] = 'freely_moving_v1' +session_info['experiment_setup'] = 'head_fixed' +session_info['treadmill'] = True +session_info['treadmill_setup'] = {} +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 5 # cm + session_info['treadmill_setup']['distance_short'] = 7 # cm + session_info['treadmill_setup']['distance_long'] = 30 # cm + +# behavior parameters +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['reward_timeout'] = 5 +session_info["reward_wait"] = 5 +session_info["punishment_timeout"] = 0 + +# error repeat +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_repeat_max'] = 3 + +# reward parameters +# session_info['reward_size'] = 10 # in microliters +session_info['reward_size'] = {'small': 5, 'large': 10} # in microliters + +# visual stimulus +session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.dat', +# '/home/pi/gratings/second_grating.dat'] +session_info['vis_gratings'] = [] +session_info['vis_raws'] = [] + +# define block_duration and initial block to start the session +session_info['block_duration'] = 2 # each block has this amount of repetition +session_info['block_variety'] = 2 +if session_info['block_variety'] > 1: + initial_block = 1 diff --git a/task_protocol/task_information_headfixed.py b/task_protocol/task_information_headfixed.py new file mode 100644 index 0000000..1d88dc7 --- /dev/null +++ b/task_protocol/task_information_headfixed.py @@ -0,0 +1,27 @@ +import random + + +class TaskInformation(object): + def __init__(self, **kwargs): + self.name = "model_based_reinforcement_learning_task" + self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] + + def draw_card(self, phase="independent_reward"): + row_start = 0 + row_end = len(self.deck)-1 + if phase == 'independent_reward': + pass + elif phase == 'forced_choice': + row_end = 1 + elif phase == 'free_choice': + row_start = 2 + elif phase == 'forced_choice_left': + row_end = 0 + elif phase == 'forced_choice_right': + row_start = 1 + row_end = 1 + card = self.deck[random.randint(row_start, row_end)] + return card + +# print(TaskInformation().draw_card()) diff --git a/task_protocol/task_information_independent_reward.py b/task_protocol/task_information_independent_reward.py new file mode 100644 index 0000000..1d88dc7 --- /dev/null +++ b/task_protocol/task_information_independent_reward.py @@ -0,0 +1,27 @@ +import random + + +class TaskInformation(object): + def __init__(self, **kwargs): + self.name = "model_based_reinforcement_learning_task" + self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] + + def draw_card(self, phase="independent_reward"): + row_start = 0 + row_end = len(self.deck)-1 + if phase == 'independent_reward': + pass + elif phase == 'forced_choice': + row_end = 1 + elif phase == 'free_choice': + row_start = 2 + elif phase == 'forced_choice_left': + row_end = 0 + elif phase == 'forced_choice_right': + row_start = 1 + row_end = 1 + card = self.deck[random.randint(row_start, row_end)] + return card + +# print(TaskInformation().draw_card()) diff --git a/task_protocol/visualization_task.py b/task_protocol/visualization_task.py new file mode 100644 index 0000000..d22f21a --- /dev/null +++ b/task_protocol/visualization_task.py @@ -0,0 +1,182 @@ +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class VisualizationTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + # if kwargs.get("session_info", None) is None: + # print( + # Fore.RED + # + Style.BRIGHT + # + "Warning: no session_info supplied; making fake one" + # + Style.RESET_ALL + # ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + # else: + # self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + Timeout( + name="cue", + on_enter=["enter_cue"], + on_exit=["exit_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_start", "standby", "reward_available"], + ["active_poke", "reward_available", "cue"], + ["timeup", "cue", "standby"], + ] + + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + # self.pump = behavbox.Pump() + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + self.box.check_plot() + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + # self.box.sound1.blink(0.5, 0.1, 1) + # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + # self.box.cueLED4.on() + # self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + # self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + # self.pump.reward("1", self.session_info["reward_size"]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + # self.pump.reward("3", self.session_info["reward_size"]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + # self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + # self.box.video_stop() + # self.box.visualstim.myscreen.close() \ No newline at end of file From 4318bd76c74cd553e696d0d3feef2429659e9ffc Mon Sep 17 00:00:00 2001 From: season Date: Thu, 29 Jun 2023 15:34:20 -0400 Subject: [PATCH 076/135] reorganization --- task_protocol/headfixed_reward | 463 ------------------ ...ndent_reward_task.py => headfixed_task.py} | 0 .../run_headfixed_independent_reward_task.py | 232 --------- ...headfixed_reward => run_headfixed_task.py} | 0 4 files changed, 695 deletions(-) delete mode 100644 task_protocol/headfixed_reward rename task_protocol/{headfixed_independent_reward_task.py => headfixed_task.py} (100%) delete mode 100644 task_protocol/run_headfixed_independent_reward_task.py rename task_protocol/{run_headfixed_reward => run_headfixed_task.py} (100%) diff --git a/task_protocol/headfixed_reward b/task_protocol/headfixed_reward deleted file mode 100644 index 5ddb9c1..0000000 --- a/task_protocol/headfixed_reward +++ /dev/null @@ -1,463 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training task structure -description: - an updated test version of headfixed_task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class HeadfixedIndependentRewardTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.session_info["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.session_info["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["wait_for_choice"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'initiate'], - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.correct_trial_number = 0 - self.actual_trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.early_lick_error = False - self.initiate_error = False - self.cue_state_error = False - self.wrong_choice_error = True - self.multiple_choice_error = False - self.error_repeat = False - - self.pump_num = None - self.reward_size = None - self.current_reward = None - self.reward_check = False - self.reward_size_offset = self.session_info['reward_size_offset'] - - self.block_count = 0 - self.blocknumber = self.session_info["block_number"] - self.current_card = None - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - - self.treadmill = self.box.treadmill - - self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - self.distance_buffer = None - self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - # there can only be lick during the reward available state - # if lick detected prior to reward available state - # the trial will restart and transition to standby - if self.event_name is "left_entry" or self.event_name == "right_entry": - # print("EVENT NAME !!!!!! " + self.event_name) - if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": - pass - else: - self.early_lick_error = True - self.error_repeat = True - self.restart() - if self.state == "standby": - pass - elif self.state == "initiate": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.initiate_error = False - self.start_cue() - else: - self.initiate_error = True - elif self.state == "cue_state": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_cue: - self.cue_state_error = False - self.evaluate_reward() - else: - self.cue_state_error = True - elif self.state == "reward_available": - cue_state = self.current_card[0] - side_mice = None - if self.event_name == "left_entry": - side_mice = 'left' - self.left_poke_count += 1 - self.left_poke_count_list.append(self.left_poke_count) - self.timeline_left_poke.append(time.time()) - elif self.event_name == "right_entry": - side_mice = 'right' - self.right_poke_count += 1 - self.right_poke_count_list.append(self.right_poke_count) - self.timeline_right_poke.append(time.time()) - if side_mice: - self.side_mice_buffer = side_mice - if cue_state == 'all': - side_choice = side_mice - if side_choice == 'left': - self.pump_num = self.current_card[2][0] - self.reward_size = self.current_reward[0] - print("self.current_reward[0]: " + str(self.current_reward[0])) - elif side_choice == 'right': - self.pump_num = self.current_card[2][1] - self.reward_size = self.current_reward[1] - print("self.current_reward[0]: " + str(self.current_reward[1])) - elif cue_state == 'LED_L': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[0] - elif cue_state == 'LED_R': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[1] - print("!!!!!!!!CUE_STATE: " + str(cue_state)) - if side_mice == side_choice: # if the animal chose correctly - self.side_mice_buffer = side_mice - if side_mice == side_choice: # if the animal chose correctly - if self.lick_count == 0: # if this is the first lick - self.wrong_choice_error = False - self.reward_check = True - self.lick_count += 1 - self.restart() - elif self.side_mice_buffer: - if self.lick_count == 0: - self.wrong_choice_error = True - self.lick_count += 1 - self.restart() - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - if self.early_lick_error: - self.error_list.append("early_lick_error") - logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.early_lick_error = False - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.lick_count = 0 - self.side_mice_buffer = None - self.box.event_list.clear() - pass - - def enter_initiate(self): - # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes - # check error_repeat - logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) - self.check_cue('sound1') - self.trial_running = True - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) - print("EVENT NAME: " + str(self.box.event_list)) - self.cue_off('sound1') - if self.initiate_error: - self.error_list.append('initiate_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) - self.error_count += 1 - - def enter_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) - # turn on the cue according to the current card - self.check_cue(self.current_card[0]) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) - self.cue_off(self.current_card[0]) - if not self.early_lick_error: - if self.cue_state_error: - self.check_cue("sound2") - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - if self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('no_choice_error') - elif self.wrong_choice_error: - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('wrong_choice_error') - elif self.reward_check: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.pump.reward(self.pump_num, self.reward_size) - self.error_repeat = False - self.total_reward += 1 - self.reward_check = False - self.error_list.append('correct_trial') - self.pump_num = None - self.reward_size = None - self.wrong_choice_error = False - - - def check_cue(self, cue): - if cue == 'sound1': - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) - self.box.sound1.on() - if cue == 'sound2': - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) - self.box.sound2.blink(1, 0.1, 1) - elif cue == 'LED_L': - self.box.cueLED1.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) - elif cue == 'all': - self.box.cueLED1.on() - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) - - def cue_off(self, cue): - if cue == 'all': - self.box.cueLED1.off() - self.box.cueLED2.off() - elif cue == 'sound1': - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) - elif cue == 'sound2': - self.box.sound2.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) - elif cue == 'LED_L': - self.box.cueLED1.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) - - def get_distance(self): - try: - distance = self.treadmill.distance_cm - except Exception as e: - logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) - self.treadmill = self.box.treadmill - distance = self.treadmill.distance_cm - return distance - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - print(type(fig)) - - ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/headfixed_independent_reward_task.py b/task_protocol/headfixed_task.py similarity index 100% rename from task_protocol/headfixed_independent_reward_task.py rename to task_protocol/headfixed_task.py diff --git a/task_protocol/run_headfixed_independent_reward_task.py b/task_protocol/run_headfixed_independent_reward_task.py deleted file mode 100644 index ebed007..0000000 --- a/task_protocol/run_headfixed_independent_reward_task.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env -S ipython3 -i -# run_headfixed2FC_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: run_headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training run task file -description: - an updated test version of run_headfixed_task.py - -""" -import random -import numpy as np -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from headfixed_independent_reward_task import HeadfixedIndependentRewardTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - from task_information_independent_reward import TaskInformation - task_information = TaskInformation() - # print("Imported task_information_headfixed: " + str(task_information.name)) - task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) - - - def cumsum_positive(input_list): - for index in range(len(input_list)): - if index == 0 and input_list[index] < 0: - input_list[index] = -input_list[index] - elif input_list[index] + input_list[index - 1] < 0: - input_list[index] = input_list[index] - input_list[index - 1] - else: - input_list[index] = input_list[index] + input_list[index - 1] - return input_list - - def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): - # initial reward (need to be random) - rewards_L = [1] - rewards_R = [1] - for a in np.arange(np.round(ntrials / change_point)): - temp = np.random.randn(change_point) * scale - rewards_L.append(cumsum_positive(temp) + offset) - temp = np.random.randn(change_point) * scale - rewards_R.append(cumsum_positive(temp) + offset) - rewards_L = np.hstack(rewards_L) - rewards_R = np.hstack(rewards_R) - # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') - reward_LR = [rewards_L, rewards_R] - reward_LR = np.transpose(np.array(reward_LR)) - reward_LR = reward_LR[0:ntrials, :] - # print(reward_LR) - return reward_LR - - def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only - session_start = random.uniform(0, period_width) - session_end = session_start + session_length - value_input = np.arange(session_start, session_end, increment) - - sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale - negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale - left_side_reward = np.random.normal(sine_output, deviation) - right_side_reward = np.random.normal(negative_sine_output, deviation) - reward_list = list(zip(left_side_reward, right_side_reward)) - return reward_list - - if session_info['phase'] == "independent_reward": - # from reward_distribution import generate_reward_trajectory - scale = session_info['independent_reward']['scale'] - offset = session_info['independent_reward']['offset'] - change_point = session_info['independent_reward']['change_point'] - ntrials = session_info['independent_reward']['ntrials'] - reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) - elif session_info['phase'] == "forced_choice": - reward_size = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - session_length = session_info["sine_reward"]["session_length"] - increment = session_info["sine_reward"]["increment"] - period_width = session_info["sine_reward"]["period_width"] - amplitude_offset = session_info["sine_reward"]["amplitude_offset"] - amplitude_scale = session_info["sine_reward"]["amplitude_scale"] - deviation = session_info["sine_reward"]["deviation"] - reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, - amplitude_scale, deviation, session_length) - first_trial_of_the_session = True - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info - t_end = time.time() + 60 * t_minute - while time.time() < t_end: # time check - if task.error_repeat: # error repeat check - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - print("Trial " + str(task.actual_trial_number) + " \n") - task.actual_trial_number += 1 - print("*******************************\n") - print("*error_repeat trial* \n" + - " - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - else: - if not first_trial_of_the_session: - print("reward_time_out: " + str(session_info["reward_timeout"])) - sleep(session_info["reward_timeout"]) - else: - first_trial_of_the_session = False - # setup the beginning of a new trial - task.error_count = 0 # reset the error count if previous trial is correct - print("Trial " + str(task.actual_trial_number) + " \n") - task.correct_trial_number += 1 - task.actual_trial_number += 1 - print("*******************************\n") - # acquire new reward contingency and cue association - task.current_card = task_information.draw_card(session_info['phase']) - if session_info['phase'] == "independent_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) - elif session_info['phase'] == "forced_choice": - task.current_reward = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] - logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + - ";current_reward_" + str(task.current_reward)[1:-1]) - print(" - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() \ No newline at end of file diff --git a/task_protocol/run_headfixed_reward b/task_protocol/run_headfixed_task.py similarity index 100% rename from task_protocol/run_headfixed_reward rename to task_protocol/run_headfixed_task.py From 54fa7dfad540ac056fcaeab662110622b9f0e181 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 29 Jun 2023 15:39:13 -0400 Subject: [PATCH 077/135] reorganization --- EFO_task/EFO_task.py | 201 -------- calibrate.py => debug/calibrate.py | 0 camera_test.py => debug/camera_test.py | 0 .../control_preview.py | 0 .../generate_reward_trajectory.py | 0 .../mounting_hard_drive.txt | 0 press_button.py => debug/press_button.py | 0 pump_debug.py => debug/pump_debug.py | 0 pygame_debug.py => debug/pygame_debug.py | 0 .../record_treadmill.py | 0 record_video.py => debug/record_video.py | 0 .../reward_distribution.py | 0 .../syringe_pump_pygame_debug.py | 0 .../treadmill_debug.py | 0 ADS1x15.py => essential/ADC/ADS1x15.py | 0 {ADC => essential/ADC}/readme.md | 0 .../FlipperOutput.py | 0 {RTC => essential/RTC}/readme.md | 0 Treadmill.py => essential/Treadmill.py | 0 behavbox.py => essential/behavbox.py | 0 .../camera}/Video-Capture-Behavior.py | 0 .../camera}/camera_sync,record | 0 .../camera}/camera_sync,record.py | 0 {camera => essential/camera}/readme.md | 0 .../picamera_library_modified}/LICENSE.txt | 0 .../picamera_library_modified}/MANIFEST.in | 0 .../picamera_library_modified}/Makefile | 0 .../picamera_library_modified}/README.rst | 0 .../build/lib/picamera/__init__.py | 0 .../build/lib/picamera/array.py | 0 .../build/lib/picamera/bcm_host.py | 0 .../build/lib/picamera/camera.py | 0 .../build/lib/picamera/color.py | 0 .../build/lib/picamera/display.py | 0 .../build/lib/picamera/encoders.py | 0 .../build/lib/picamera/exc.py | 0 .../build/lib/picamera/frames.py | 0 .../build/lib/picamera/mmal.py | 0 .../build/lib/picamera/mmalobj.py | 0 .../build/lib/picamera/renderers.py | 0 .../build/lib/picamera/streams.py | 0 .../picamera_library_modified}/coverage.cfg | 0 .../debian/changelog | 0 .../picamera_library_modified}/debian/clean | 0 .../picamera_library_modified}/debian/compat | 0 .../picamera_library_modified}/debian/control | 0 .../debian/copyright | 0 .../picamera_library_modified}/debian/docs | 0 .../debian/python-picamera-docs.doc-base | 0 .../debian/python-picamera-docs.docs | 0 .../picamera_library_modified}/debian/rules | 0 .../debian/source/format | 0 .../debian/source/options | 0 .../dist/picamera-1.13-py3.7.egg | Bin .../picamera_library_modified}/docs/Makefile | 0 .../docs/_static/style_override.css | 0 .../docs/api_array.rst | 0 .../docs/api_camera.rst | 0 .../docs/api_color.rst | 0 .../docs/api_encoders.rst | 0 .../docs/api_exc.rst | 0 .../docs/api_mmalobj.rst | 0 .../docs/api_renderers.rst | 0 .../docs/api_streams.rst | 0 .../docs/changelog.rst | 0 .../picamera_library_modified}/docs/conf.py | 0 .../docs/deprecated.rst | 0 .../docs/development.rst | 0 .../docs/encoder_classes.dot | 0 .../docs/examples/array_capture_py2.py | 0 .../docs/examples/array_capture_py3.py | 0 .../docs/examples/bayer_array.py | 0 .../docs/examples/bayer_data.py | 0 .../docs/examples/capture_client.py | 0 .../docs/examples/capture_server.py | 0 .../docs/examples/circular_record1.py | 0 .../docs/examples/circular_record2.py | 0 .../docs/examples/color_detect.py | 0 .../docs/examples/consistent_capture.py | 0 .../docs/examples/custom_encoders.py | 0 .../docs/examples/custom_outputs_count.py | 0 .../custom_outputs_motion_analysis.py | 0 .../custom_outputs_motion_detector.py | 0 .../docs/examples/file_capture.py | 0 .../docs/examples/file_record.py | 0 .../docs/examples/gesture_detect.py | 0 .../docs/examples/image_overlay_array.py | 0 .../docs/examples/image_overlay_file.py | 0 .../docs/examples/led_control.py | 0 .../docs/examples/mmal_clock_splitter.py | 0 .../docs/examples/mmal_crosshair.py | 0 .../docs/examples/motion_data1.py | 0 .../docs/examples/motion_data2.py | 0 .../docs/examples/motion_data3.py | 0 .../docs/examples/motion_data4.py | 0 .../docs/examples/multi_res_record.py | 0 .../docs/examples/multiproc_camera.py | 0 .../docs/examples/night_capture.py | 0 .../docs/examples/opencv_capture.py | 0 .../docs/examples/pil_capture.py | 0 .../docs/examples/rapid_capture_generator.py | 0 .../docs/examples/rapid_capture_mjpeg.py | 0 .../docs/examples/rapid_capture_sequence.py | 0 .../docs/examples/rapid_capture_threading.py | 0 .../docs/examples/rapid_capture_yield.py | 0 .../docs/examples/rapid_streaming.py | 0 .../docs/examples/rapid_streaming_mjpeg.py | 0 .../docs/examples/record_and_capture.py | 0 .../docs/examples/record_client.py | 0 .../docs/examples/record_sequence.py | 0 .../docs/examples/record_server.py | 0 .../docs/examples/record_server_pi.py | 0 .../docs/examples/resize_capture.py | 0 .../docs/examples/rgb_capture1.py | 0 .../docs/examples/rgb_capture2.py | 0 .../docs/examples/split_record.py | 0 .../docs/examples/stream_capture.py | 0 .../docs/examples/stream_capture_close.py | 0 .../docs/examples/stream_record.py | 0 .../docs/examples/text_overlay.py | 0 .../docs/examples/text_overlay_scroll.py | 0 .../docs/examples/text_overlay_timestamp.py | 0 .../docs/examples/timelapse1.py | 0 .../docs/examples/timelapse2.py | 0 .../docs/examples/web_streaming.py | 0 .../docs/examples/weird_outputs.py | 0 .../docs/examples/yuv_capture1.py | 0 .../docs/examples/yuv_capture2.py | 0 .../docs/examples/yuv_capture3.py | 0 .../docs/examples/yuv_capture4.py | 0 .../picamera_library_modified}/docs/faq.rst | 0 .../picamera_library_modified}/docs/fov.rst | 0 .../docs/images/bayer_bytes.pdf | Bin .../docs/images/bayer_bytes.png | Bin .../docs/images/bayer_bytes.svg | 0 .../docs/images/bayer_pattern.pdf | Bin .../docs/images/bayer_pattern.png | Bin .../docs/images/bayer_pattern.svg | 0 .../docs/images/camera_architecture.pdf | Bin .../docs/images/camera_architecture.png | Bin .../docs/images/camera_architecture.svg | 0 .../docs/images/camera_layout.pdf | Bin .../docs/images/camera_layout.png | Bin .../docs/images/camera_layout.svg | 0 .../docs/images/enable_camera.png | Bin .../docs/images/encoder_classes.pdf | Bin .../docs/images/encoder_classes.png | Bin .../docs/images/encoder_classes.svg | 0 .../docs/images/good_connection.jpg | Bin .../docs/images/good_connection.xcf | Bin .../docs/images/gpu_architecture.pdf | Bin .../docs/images/gpu_architecture.png | Bin .../docs/images/gpu_architecture.svg | 0 .../docs/images/image_protocol.pdf | Bin .../docs/images/image_protocol.png | Bin .../docs/images/image_protocol.svg | 0 .../docs/images/jpeg_capture_pipeline.dot | 0 .../docs/images/jpeg_capture_pipeline.pdf | Bin .../docs/images/jpeg_capture_pipeline.png | Bin .../docs/images/jpeg_capture_pipeline.svg | 0 .../docs/images/jpeg_encode_pipeline.dot | 0 .../docs/images/jpeg_encode_pipeline.pdf | Bin .../docs/images/jpeg_encode_pipeline.png | Bin .../docs/images/jpeg_encode_pipeline.svg | 0 .../docs/images/pi_zero_assembled.jpg | Bin .../docs/images/pi_zero_pieces.jpg | Bin .../docs/images/picamera_pipeline.dot | 0 .../docs/images/picamera_pipeline.pdf | Bin .../docs/images/picamera_pipeline.png | Bin .../docs/images/picamera_pipeline.svg | 0 .../docs/images/preview_pipeline.dot | 0 .../docs/images/preview_pipeline.pdf | Bin .../docs/images/preview_pipeline.png | Bin .../docs/images/preview_pipeline.svg | 0 .../docs/images/rgb_capture_pipeline.dot | 0 .../docs/images/rgb_capture_pipeline.pdf | Bin .../docs/images/rgb_capture_pipeline.png | Bin .../docs/images/rgb_capture_pipeline.svg | 0 .../docs/images/sensor_area_1.png | Bin .../docs/images/sensor_area_1.xcf | Bin .../docs/images/sensor_area_2.png | Bin .../docs/images/sensor_area_2.xcf | Bin .../docs/images/still_port_capture.pdf | Bin .../docs/images/still_port_capture.png | Bin .../docs/images/still_port_capture.svg | 0 .../docs/images/still_raw_capture.pdf | Bin .../docs/images/still_raw_capture.png | Bin .../docs/images/still_raw_capture.svg | 0 .../docs/images/versions.pdf | Bin .../docs/images/versions.png | Bin .../docs/images/versions.svg | 0 .../docs/images/video_fullfov_record.pdf | Bin .../docs/images/video_fullfov_record.png | Bin .../docs/images/video_fullfov_record.svg | 0 .../docs/images/video_port_capture.pdf | Bin .../docs/images/video_port_capture.png | Bin .../docs/images/video_port_capture.svg | 0 .../docs/images/video_port_record.pdf | Bin .../docs/images/video_port_record.png | Bin .../docs/images/video_port_record.svg | 0 .../docs/images/yuv420.pdf | Bin .../docs/images/yuv420.png | Bin .../docs/images/yuv420.svg | 0 .../picamera_library_modified}/docs/index.rst | 0 .../docs/install.rst | 0 .../docs/license.rst | 0 .../docs/quickstart.rst | 0 .../docs/recipes1.rst | 0 .../docs/recipes2.rst | 0 .../picamera.egg-info/PKG-INFO | 0 .../picamera.egg-info/SOURCES.txt | 0 .../picamera.egg-info/dependency_links.txt | 0 .../picamera.egg-info/requires.txt | 0 .../picamera.egg-info/top_level.txt | 0 .../picamera/__init__.py | 0 .../picamera/array.py | 0 .../picamera/bcm_host.py | 0 .../picamera/camera.py | 0 .../picamera/color.py | 0 .../picamera/display.py | 0 .../picamera/encoders.py | 0 .../picamera/exc.py | 0 .../picamera/frames.py | 0 .../picamera/mmal.py | 0 .../picamera/mmalobj.py | 0 .../picamera/renderers.py | 0 .../picamera/streams.py | 0 .../py32dev_requirements.txt | 0 .../rtd_requirements.txt | 0 .../picamera_library_modified}/setup.py | 0 .../tests/conftest.py | 0 .../tests/test_array.py | 0 .../tests/test_attr.py | 0 .../tests/test_capture.py | 0 .../tests/test_exc.py | 0 .../tests/test_misc.py | 0 .../tests/test_record.py | 0 .../tests/test_streams.py | 0 .../tests/verify.py | 0 .../pygame_matplotlib}/__init__.py | 0 .../pygame_matplotlib}/backend_pygame.py | 0 .../pygame_matplotlib}/gui_window.py | 0 .../scripts}/root_crontab.sh | 0 .../scripts}/user_crontab.sh | 0 .../syringe_pump_c_code}/main.c | 0 .../syringe_pump_c_code}/main.py | 0 .../syringe_pump_c_code}/main.so | Bin .../syringe_pump_c_code}/readme.md | 0 .../treadmill}/Bounce2-master (1).zip | Bin .../treadmill}/Treadmill.ino | 0 .../treadmill}/Treadmill_20200302.ino | 0 .../treadmill}/Treadmill_20211112.ino | 0 .../digitalWriteFast-master (1).zip | Bin {treadmill => essential/treadmill}/readme.md | 0 .../treadmill}/treadmill_current.ino | 0 .../treadmill/treadmill_distance.ino | 0 .../treadmill/treadmill_i2c.py | 0 .../video_acquisition}/README.md | 0 .../StartAcquisition_gpio.py | 0 .../video_acquisition}/VideoCapture.py | 0 .../video_acquisition}/control_acquisition.py | 0 .../video_acquisition}/killrecording.py | 0 .../video_acquisition}/start_acquisition.py | 0 .../start_acquisition_old.py | 0 .../video_acquisition/start_preview.py | 0 .../video_acquisition}/stop_acquisition.sh | 0 .../video_acquisition/stop_preview.sh | 0 .../video_acquisition/stop_video | 0 .../visual_stimuli}/readme.md | 0 .../visual_stimuli}/vstest.py | 0 visualstim.py => essential/visualstim.py | 0 headfixed_independent_reward_task.py | 463 ------------------ behavbox_v2.py => obsolete/behavbox_v2.py | 0 .../fake_session_info.py | 0 .../headfixed2FC_task_old.py | 0 .../headfixed_task_old.py | 0 lick_task.py => obsolete/lick_task.py | 0 pump_task.py => obsolete/pump_task.py | 0 .../record_run_test.py | 0 run_flip_task.py => obsolete/run_flip_task.py | 0 .../run_headfixed2FC_task.py | 0 .../run_headfixed_task.py | 0 run_lick_task.py => obsolete/run_lick_task.py | 0 .../run_season_task.py | 0 .../run_soyoun_task.py | 0 .../run_visualization_task.py | 0 run_walk_task.py => obsolete/run_walk_task.py | 0 .../session_info_headfixed.py | 0 .../session_info_headfixed2FC.py | 0 .../session_info_walk.py | 0 soyoun_task.py => obsolete/soyoun_task.py | 0 .../task_information_headfixed.py | 0 .../task_information_headfixed2FC.py | 0 .../task_information_lick.py | 0 .../task_information_phase_1.py | 0 .../test_session_info.py | 0 .../testing_visualstim.py | 0 .../visualization_task.py | 0 walk_task.py => obsolete/walk_task.py | 0 run_headfixed_independent_reward_task.py | 232 --------- .../{ => headfixed_task}/headfixed_task.py | 0 .../run_headfixed_task.py | 0 ...ssion_info_headfixed_independent_reward.py | 0 .../session_info_headfixed_task.py | 0 .../task_information_headfixed.py | 0 .../task_information_independent_reward.py | 0 task_protocol/kelly_record_task.py | 58 --- task_protocol/kelly_task.py | 181 ------- .../kelly_task/kelly_record_task.py | 0 .../kelly_task/kelly_task.py | 0 .../kelly_task/run_kelly_task.py | 0 .../kelly_task/run_record_task.py | 0 .../session_info_year-month-date.py | 0 task_protocol/lick_task.py | 182 ------- task_protocol/remi_self_admin_task.py | 372 -------------- task_protocol/run_kelly_task.py | 126 ----- task_protocol/run_record_task.py | 100 ---- task_protocol/run_remi_self_admin_task.py | 134 ----- task_protocol/run_self_admin_task.py | 134 ----- task_protocol/self_admin_task.py | 308 ------------ .../self_admin_task/remi_self_admin_task.py | 0 .../run_remi_self_admin_task.py | 0 .../self_admin_task/run_self_admin_task.py | 0 .../self_admin_task/self_admin_task.py | 0 .../session_info_self_admin.py | 0 ...ssion_info_headfixed_independent_reward.py | 123 ----- task_protocol/session_info_self_admin.py | 66 --- task_protocol/session_info_year-month-date.py | 65 --- .../task_information_independent_reward.py | 27 - treadmill_20211115.ino | 145 ------ visualization_task.py | 182 ------- 331 files changed, 3099 deletions(-) delete mode 100644 EFO_task/EFO_task.py rename calibrate.py => debug/calibrate.py (100%) rename camera_test.py => debug/camera_test.py (100%) rename control_preview.py => debug/control_preview.py (100%) rename generate_reward_trajectory.py => debug/generate_reward_trajectory.py (100%) rename mounting_hard_drive.txt => debug/mounting_hard_drive.txt (100%) rename press_button.py => debug/press_button.py (100%) rename pump_debug.py => debug/pump_debug.py (100%) rename pygame_debug.py => debug/pygame_debug.py (100%) rename record_treadmill.py => debug/record_treadmill.py (100%) rename record_video.py => debug/record_video.py (100%) rename reward_distribution.py => debug/reward_distribution.py (100%) rename syringe_pump_pygame_debug.py => debug/syringe_pump_pygame_debug.py (100%) rename treadmill_debug.py => debug/treadmill_debug.py (100%) rename ADS1x15.py => essential/ADC/ADS1x15.py (100%) rename {ADC => essential/ADC}/readme.md (100%) rename FlipperOutput.py => essential/FlipperOutput.py (100%) rename {RTC => essential/RTC}/readme.md (100%) rename Treadmill.py => essential/Treadmill.py (100%) rename behavbox.py => essential/behavbox.py (100%) rename {camera => essential/camera}/Video-Capture-Behavior.py (100%) rename {camera => essential/camera}/camera_sync,record (100%) rename {camera => essential/camera}/camera_sync,record.py (100%) rename {camera => essential/camera}/readme.md (100%) rename {picamera_library_modified => essential/picamera_library_modified}/LICENSE.txt (100%) rename {picamera_library_modified => essential/picamera_library_modified}/MANIFEST.in (100%) rename {picamera_library_modified => essential/picamera_library_modified}/Makefile (100%) rename {picamera_library_modified => essential/picamera_library_modified}/README.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/__init__.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/array.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/bcm_host.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/camera.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/color.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/display.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/encoders.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/exc.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/frames.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/mmal.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/mmalobj.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/renderers.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/build/lib/picamera/streams.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/coverage.cfg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/changelog (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/clean (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/compat (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/control (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/copyright (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/docs (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/python-picamera-docs.doc-base (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/python-picamera-docs.docs (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/rules (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/source/format (100%) rename {picamera_library_modified => essential/picamera_library_modified}/debian/source/options (100%) rename {picamera_library_modified => essential/picamera_library_modified}/dist/picamera-1.13-py3.7.egg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/Makefile (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/_static/style_override.css (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_array.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_camera.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_color.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_encoders.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_exc.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_mmalobj.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_renderers.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/api_streams.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/changelog.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/conf.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/deprecated.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/development.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/encoder_classes.dot (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/array_capture_py2.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/array_capture_py3.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/bayer_array.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/bayer_data.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/capture_client.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/capture_server.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/circular_record1.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/circular_record2.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/color_detect.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/consistent_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/custom_encoders.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/custom_outputs_count.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/custom_outputs_motion_analysis.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/custom_outputs_motion_detector.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/file_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/file_record.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/gesture_detect.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/image_overlay_array.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/image_overlay_file.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/led_control.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/mmal_clock_splitter.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/mmal_crosshair.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/motion_data1.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/motion_data2.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/motion_data3.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/motion_data4.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/multi_res_record.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/multiproc_camera.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/night_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/opencv_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/pil_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rapid_capture_generator.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rapid_capture_mjpeg.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rapid_capture_sequence.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rapid_capture_threading.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rapid_capture_yield.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rapid_streaming.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rapid_streaming_mjpeg.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/record_and_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/record_client.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/record_sequence.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/record_server.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/record_server_pi.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/resize_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rgb_capture1.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/rgb_capture2.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/split_record.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/stream_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/stream_capture_close.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/stream_record.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/text_overlay.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/text_overlay_scroll.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/text_overlay_timestamp.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/timelapse1.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/timelapse2.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/web_streaming.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/weird_outputs.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/yuv_capture1.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/yuv_capture2.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/yuv_capture3.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/examples/yuv_capture4.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/faq.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/fov.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/bayer_bytes.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/bayer_bytes.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/bayer_bytes.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/bayer_pattern.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/bayer_pattern.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/bayer_pattern.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/camera_architecture.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/camera_architecture.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/camera_architecture.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/camera_layout.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/camera_layout.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/camera_layout.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/enable_camera.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/encoder_classes.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/encoder_classes.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/encoder_classes.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/good_connection.jpg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/good_connection.xcf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/gpu_architecture.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/gpu_architecture.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/gpu_architecture.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/image_protocol.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/image_protocol.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/image_protocol.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_capture_pipeline.dot (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_capture_pipeline.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_capture_pipeline.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_capture_pipeline.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_encode_pipeline.dot (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_encode_pipeline.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_encode_pipeline.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/jpeg_encode_pipeline.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/pi_zero_assembled.jpg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/pi_zero_pieces.jpg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/picamera_pipeline.dot (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/picamera_pipeline.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/picamera_pipeline.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/picamera_pipeline.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/preview_pipeline.dot (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/preview_pipeline.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/preview_pipeline.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/preview_pipeline.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/rgb_capture_pipeline.dot (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/rgb_capture_pipeline.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/rgb_capture_pipeline.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/rgb_capture_pipeline.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/sensor_area_1.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/sensor_area_1.xcf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/sensor_area_2.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/sensor_area_2.xcf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/still_port_capture.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/still_port_capture.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/still_port_capture.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/still_raw_capture.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/still_raw_capture.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/still_raw_capture.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/versions.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/versions.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/versions.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_fullfov_record.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_fullfov_record.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_fullfov_record.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_port_capture.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_port_capture.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_port_capture.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_port_record.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_port_record.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/video_port_record.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/yuv420.pdf (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/yuv420.png (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/images/yuv420.svg (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/index.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/install.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/license.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/quickstart.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/recipes1.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/docs/recipes2.rst (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera.egg-info/PKG-INFO (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera.egg-info/SOURCES.txt (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera.egg-info/dependency_links.txt (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera.egg-info/requires.txt (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera.egg-info/top_level.txt (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/__init__.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/array.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/bcm_host.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/camera.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/color.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/display.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/encoders.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/exc.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/frames.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/mmal.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/mmalobj.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/renderers.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/picamera/streams.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/py32dev_requirements.txt (100%) rename {picamera_library_modified => essential/picamera_library_modified}/rtd_requirements.txt (100%) rename {picamera_library_modified => essential/picamera_library_modified}/setup.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/conftest.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/test_array.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/test_attr.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/test_capture.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/test_exc.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/test_misc.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/test_record.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/test_streams.py (100%) rename {picamera_library_modified => essential/picamera_library_modified}/tests/verify.py (100%) rename {pygame_matplotlib => essential/pygame_matplotlib}/__init__.py (100%) rename {pygame_matplotlib => essential/pygame_matplotlib}/backend_pygame.py (100%) rename {pygame_matplotlib => essential/pygame_matplotlib}/gui_window.py (100%) rename {scripts => essential/scripts}/root_crontab.sh (100%) rename {scripts => essential/scripts}/user_crontab.sh (100%) rename {syringe_pump_c_code => essential/syringe_pump_c_code}/main.c (100%) rename {syringe_pump_c_code => essential/syringe_pump_c_code}/main.py (100%) rename {syringe_pump_c_code => essential/syringe_pump_c_code}/main.so (100%) rename {syringe_pump_c_code => essential/syringe_pump_c_code}/readme.md (100%) rename {treadmill => essential/treadmill}/Bounce2-master (1).zip (100%) rename {treadmill => essential/treadmill}/Treadmill.ino (100%) rename {treadmill => essential/treadmill}/Treadmill_20200302.ino (100%) rename {treadmill => essential/treadmill}/Treadmill_20211112.ino (100%) rename {treadmill => essential/treadmill}/digitalWriteFast-master (1).zip (100%) rename {treadmill => essential/treadmill}/readme.md (100%) rename {treadmill => essential/treadmill}/treadmill_current.ino (100%) rename treadmill_distance.ino => essential/treadmill/treadmill_distance.ino (100%) rename treadmill_i2c.py => essential/treadmill/treadmill_i2c.py (100%) rename {video_acquisition => essential/video_acquisition}/README.md (100%) rename {video_acquisition => essential/video_acquisition}/StartAcquisition_gpio.py (100%) rename {video_acquisition => essential/video_acquisition}/VideoCapture.py (100%) rename {video_acquisition => essential/video_acquisition}/control_acquisition.py (100%) rename {video_acquisition => essential/video_acquisition}/killrecording.py (100%) rename {video_acquisition => essential/video_acquisition}/start_acquisition.py (100%) rename {video_acquisition => essential/video_acquisition}/start_acquisition_old.py (100%) rename start_preview.py => essential/video_acquisition/start_preview.py (100%) rename {video_acquisition => essential/video_acquisition}/stop_acquisition.sh (100%) rename stop_preview.sh => essential/video_acquisition/stop_preview.sh (100%) rename stop_video => essential/video_acquisition/stop_video (100%) rename {visual_stimuli => essential/visual_stimuli}/readme.md (100%) rename {visual_stimuli => essential/visual_stimuli}/vstest.py (100%) rename visualstim.py => essential/visualstim.py (100%) delete mode 100644 headfixed_independent_reward_task.py rename behavbox_v2.py => obsolete/behavbox_v2.py (100%) rename fake_session_info.py => obsolete/fake_session_info.py (100%) rename headfixed2FC_task.py => obsolete/headfixed2FC_task_old.py (100%) rename headfixed_task.py => obsolete/headfixed_task_old.py (100%) rename lick_task.py => obsolete/lick_task.py (100%) rename pump_task.py => obsolete/pump_task.py (100%) rename record_run_test.py => obsolete/record_run_test.py (100%) rename run_flip_task.py => obsolete/run_flip_task.py (100%) rename run_headfixed2FC_task.py => obsolete/run_headfixed2FC_task.py (100%) rename run_headfixed_task.py => obsolete/run_headfixed_task.py (100%) rename run_lick_task.py => obsolete/run_lick_task.py (100%) rename run_season_task.py => obsolete/run_season_task.py (100%) rename run_soyoun_task.py => obsolete/run_soyoun_task.py (100%) rename run_visualization_task.py => obsolete/run_visualization_task.py (100%) rename run_walk_task.py => obsolete/run_walk_task.py (100%) rename session_info_headfixed.py => obsolete/session_info_headfixed.py (100%) rename session_info_headfixed2FC.py => obsolete/session_info_headfixed2FC.py (100%) rename session_info_walk.py => obsolete/session_info_walk.py (100%) rename soyoun_task.py => obsolete/soyoun_task.py (100%) rename task_information_headfixed.py => obsolete/task_information_headfixed.py (100%) rename task_information_headfixed2FC.py => obsolete/task_information_headfixed2FC.py (100%) rename task_information_lick.py => obsolete/task_information_lick.py (100%) rename task_information_phase_1.py => obsolete/task_information_phase_1.py (100%) rename test_session_info.py => obsolete/test_session_info.py (100%) rename testing_visualstim.py => obsolete/testing_visualstim.py (100%) rename {task_protocol => obsolete}/visualization_task.py (100%) rename walk_task.py => obsolete/walk_task.py (100%) delete mode 100644 run_headfixed_independent_reward_task.py rename task_protocol/{ => headfixed_task}/headfixed_task.py (100%) rename task_protocol/{ => headfixed_task}/run_headfixed_task.py (100%) rename session_info_headfixed_independent_reward.py => task_protocol/headfixed_task/session_info_headfixed_independent_reward.py (100%) rename task_protocol/{ => headfixed_task}/session_info_headfixed_task.py (100%) rename task_protocol/{ => headfixed_task}/task_information_headfixed.py (100%) rename task_information_independent_reward.py => task_protocol/headfixed_task/task_information_independent_reward.py (100%) delete mode 100755 task_protocol/kelly_record_task.py delete mode 100755 task_protocol/kelly_task.py rename kelly_record_task.py => task_protocol/kelly_task/kelly_record_task.py (100%) rename kelly_task.py => task_protocol/kelly_task/kelly_task.py (100%) rename run_kelly_task.py => task_protocol/kelly_task/run_kelly_task.py (100%) rename run_record_task.py => task_protocol/kelly_task/run_record_task.py (100%) rename session_info_year-month-date.py => task_protocol/kelly_task/session_info_year-month-date.py (100%) delete mode 100644 task_protocol/lick_task.py delete mode 100644 task_protocol/remi_self_admin_task.py delete mode 100755 task_protocol/run_kelly_task.py delete mode 100755 task_protocol/run_record_task.py delete mode 100644 task_protocol/run_remi_self_admin_task.py delete mode 100644 task_protocol/run_self_admin_task.py delete mode 100644 task_protocol/self_admin_task.py rename remi_self_admin_task.py => task_protocol/self_admin_task/remi_self_admin_task.py (100%) rename run_remi_self_admin_task.py => task_protocol/self_admin_task/run_remi_self_admin_task.py (100%) rename run_self_admin_task.py => task_protocol/self_admin_task/run_self_admin_task.py (100%) rename self_admin_task.py => task_protocol/self_admin_task/self_admin_task.py (100%) rename session_info_self_admin.py => task_protocol/self_admin_task/session_info_self_admin.py (100%) delete mode 100644 task_protocol/session_info_headfixed_independent_reward.py delete mode 100644 task_protocol/session_info_self_admin.py delete mode 100755 task_protocol/session_info_year-month-date.py delete mode 100644 task_protocol/task_information_independent_reward.py delete mode 100644 treadmill_20211115.ino delete mode 100644 visualization_task.py diff --git a/EFO_task/EFO_task.py b/EFO_task/EFO_task.py deleted file mode 100644 index 4eaddd7..0000000 --- a/EFO_task/EFO_task.py +++ /dev/null @@ -1,201 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Tue Oct 11 18:02:34 2022 -First tentative to do a new 2 AFC task that has 4 pokes, with the 4th poke being -the reward that is delivered to the animal separate from the choices -@author: eliezyer -""" - - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class EFOTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - # Task has the following states: standby, trial_available, cue, choice_available, and reward_available (punishment?) - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="trial_available", - on_enter=["enter_trial_available"], - on_exit=["exit_trial_available"], - ), - Timeout( - name="start_cue", - on_enter=["enter_start_cue"], - on_exit=["exit_start_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - Timeout( - name="choice_available", - on_enter=["enter_choice_available"], - on_exit=["exit_choice_available"], - ), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_available", "standby", "start_cue"], - ["choice_available", "start_cue", "reward_available"], - ["reward_available", "choice_available", "standby"], - ] - # EFO: STOPPED HERE ON 10/11/2022 - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = behavbox.Pump() - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - self.box.sound1.blink(0.5, 0.1, 1) - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - self.box.cueLED4.on() - self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - self.pump.reward("1", self.session_info["reward_size"]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - self.pump.reward("3", self.session_info["reward_size"]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() - self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/calibrate.py b/debug/calibrate.py similarity index 100% rename from calibrate.py rename to debug/calibrate.py diff --git a/camera_test.py b/debug/camera_test.py similarity index 100% rename from camera_test.py rename to debug/camera_test.py diff --git a/control_preview.py b/debug/control_preview.py similarity index 100% rename from control_preview.py rename to debug/control_preview.py diff --git a/generate_reward_trajectory.py b/debug/generate_reward_trajectory.py similarity index 100% rename from generate_reward_trajectory.py rename to debug/generate_reward_trajectory.py diff --git a/mounting_hard_drive.txt b/debug/mounting_hard_drive.txt similarity index 100% rename from mounting_hard_drive.txt rename to debug/mounting_hard_drive.txt diff --git a/press_button.py b/debug/press_button.py similarity index 100% rename from press_button.py rename to debug/press_button.py diff --git a/pump_debug.py b/debug/pump_debug.py similarity index 100% rename from pump_debug.py rename to debug/pump_debug.py diff --git a/pygame_debug.py b/debug/pygame_debug.py similarity index 100% rename from pygame_debug.py rename to debug/pygame_debug.py diff --git a/record_treadmill.py b/debug/record_treadmill.py similarity index 100% rename from record_treadmill.py rename to debug/record_treadmill.py diff --git a/record_video.py b/debug/record_video.py similarity index 100% rename from record_video.py rename to debug/record_video.py diff --git a/reward_distribution.py b/debug/reward_distribution.py similarity index 100% rename from reward_distribution.py rename to debug/reward_distribution.py diff --git a/syringe_pump_pygame_debug.py b/debug/syringe_pump_pygame_debug.py similarity index 100% rename from syringe_pump_pygame_debug.py rename to debug/syringe_pump_pygame_debug.py diff --git a/treadmill_debug.py b/debug/treadmill_debug.py similarity index 100% rename from treadmill_debug.py rename to debug/treadmill_debug.py diff --git a/ADS1x15.py b/essential/ADC/ADS1x15.py similarity index 100% rename from ADS1x15.py rename to essential/ADC/ADS1x15.py diff --git a/ADC/readme.md b/essential/ADC/readme.md similarity index 100% rename from ADC/readme.md rename to essential/ADC/readme.md diff --git a/FlipperOutput.py b/essential/FlipperOutput.py similarity index 100% rename from FlipperOutput.py rename to essential/FlipperOutput.py diff --git a/RTC/readme.md b/essential/RTC/readme.md similarity index 100% rename from RTC/readme.md rename to essential/RTC/readme.md diff --git a/Treadmill.py b/essential/Treadmill.py similarity index 100% rename from Treadmill.py rename to essential/Treadmill.py diff --git a/behavbox.py b/essential/behavbox.py similarity index 100% rename from behavbox.py rename to essential/behavbox.py diff --git a/camera/Video-Capture-Behavior.py b/essential/camera/Video-Capture-Behavior.py similarity index 100% rename from camera/Video-Capture-Behavior.py rename to essential/camera/Video-Capture-Behavior.py diff --git a/camera/camera_sync,record b/essential/camera/camera_sync,record similarity index 100% rename from camera/camera_sync,record rename to essential/camera/camera_sync,record diff --git a/camera/camera_sync,record.py b/essential/camera/camera_sync,record.py similarity index 100% rename from camera/camera_sync,record.py rename to essential/camera/camera_sync,record.py diff --git a/camera/readme.md b/essential/camera/readme.md similarity index 100% rename from camera/readme.md rename to essential/camera/readme.md diff --git a/picamera_library_modified/LICENSE.txt b/essential/picamera_library_modified/LICENSE.txt similarity index 100% rename from picamera_library_modified/LICENSE.txt rename to essential/picamera_library_modified/LICENSE.txt diff --git a/picamera_library_modified/MANIFEST.in b/essential/picamera_library_modified/MANIFEST.in similarity index 100% rename from picamera_library_modified/MANIFEST.in rename to essential/picamera_library_modified/MANIFEST.in diff --git a/picamera_library_modified/Makefile b/essential/picamera_library_modified/Makefile similarity index 100% rename from picamera_library_modified/Makefile rename to essential/picamera_library_modified/Makefile diff --git a/picamera_library_modified/README.rst b/essential/picamera_library_modified/README.rst similarity index 100% rename from picamera_library_modified/README.rst rename to essential/picamera_library_modified/README.rst diff --git a/picamera_library_modified/build/lib/picamera/__init__.py b/essential/picamera_library_modified/build/lib/picamera/__init__.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/__init__.py rename to essential/picamera_library_modified/build/lib/picamera/__init__.py diff --git a/picamera_library_modified/build/lib/picamera/array.py b/essential/picamera_library_modified/build/lib/picamera/array.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/array.py rename to essential/picamera_library_modified/build/lib/picamera/array.py diff --git a/picamera_library_modified/build/lib/picamera/bcm_host.py b/essential/picamera_library_modified/build/lib/picamera/bcm_host.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/bcm_host.py rename to essential/picamera_library_modified/build/lib/picamera/bcm_host.py diff --git a/picamera_library_modified/build/lib/picamera/camera.py b/essential/picamera_library_modified/build/lib/picamera/camera.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/camera.py rename to essential/picamera_library_modified/build/lib/picamera/camera.py diff --git a/picamera_library_modified/build/lib/picamera/color.py b/essential/picamera_library_modified/build/lib/picamera/color.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/color.py rename to essential/picamera_library_modified/build/lib/picamera/color.py diff --git a/picamera_library_modified/build/lib/picamera/display.py b/essential/picamera_library_modified/build/lib/picamera/display.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/display.py rename to essential/picamera_library_modified/build/lib/picamera/display.py diff --git a/picamera_library_modified/build/lib/picamera/encoders.py b/essential/picamera_library_modified/build/lib/picamera/encoders.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/encoders.py rename to essential/picamera_library_modified/build/lib/picamera/encoders.py diff --git a/picamera_library_modified/build/lib/picamera/exc.py b/essential/picamera_library_modified/build/lib/picamera/exc.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/exc.py rename to essential/picamera_library_modified/build/lib/picamera/exc.py diff --git a/picamera_library_modified/build/lib/picamera/frames.py b/essential/picamera_library_modified/build/lib/picamera/frames.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/frames.py rename to essential/picamera_library_modified/build/lib/picamera/frames.py diff --git a/picamera_library_modified/build/lib/picamera/mmal.py b/essential/picamera_library_modified/build/lib/picamera/mmal.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/mmal.py rename to essential/picamera_library_modified/build/lib/picamera/mmal.py diff --git a/picamera_library_modified/build/lib/picamera/mmalobj.py b/essential/picamera_library_modified/build/lib/picamera/mmalobj.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/mmalobj.py rename to essential/picamera_library_modified/build/lib/picamera/mmalobj.py diff --git a/picamera_library_modified/build/lib/picamera/renderers.py b/essential/picamera_library_modified/build/lib/picamera/renderers.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/renderers.py rename to essential/picamera_library_modified/build/lib/picamera/renderers.py diff --git a/picamera_library_modified/build/lib/picamera/streams.py b/essential/picamera_library_modified/build/lib/picamera/streams.py similarity index 100% rename from picamera_library_modified/build/lib/picamera/streams.py rename to essential/picamera_library_modified/build/lib/picamera/streams.py diff --git a/picamera_library_modified/coverage.cfg b/essential/picamera_library_modified/coverage.cfg similarity index 100% rename from picamera_library_modified/coverage.cfg rename to essential/picamera_library_modified/coverage.cfg diff --git a/picamera_library_modified/debian/changelog b/essential/picamera_library_modified/debian/changelog similarity index 100% rename from picamera_library_modified/debian/changelog rename to essential/picamera_library_modified/debian/changelog diff --git a/picamera_library_modified/debian/clean b/essential/picamera_library_modified/debian/clean similarity index 100% rename from picamera_library_modified/debian/clean rename to essential/picamera_library_modified/debian/clean diff --git a/picamera_library_modified/debian/compat b/essential/picamera_library_modified/debian/compat similarity index 100% rename from picamera_library_modified/debian/compat rename to essential/picamera_library_modified/debian/compat diff --git a/picamera_library_modified/debian/control b/essential/picamera_library_modified/debian/control similarity index 100% rename from picamera_library_modified/debian/control rename to essential/picamera_library_modified/debian/control diff --git a/picamera_library_modified/debian/copyright b/essential/picamera_library_modified/debian/copyright similarity index 100% rename from picamera_library_modified/debian/copyright rename to essential/picamera_library_modified/debian/copyright diff --git a/picamera_library_modified/debian/docs b/essential/picamera_library_modified/debian/docs similarity index 100% rename from picamera_library_modified/debian/docs rename to essential/picamera_library_modified/debian/docs diff --git a/picamera_library_modified/debian/python-picamera-docs.doc-base b/essential/picamera_library_modified/debian/python-picamera-docs.doc-base similarity index 100% rename from picamera_library_modified/debian/python-picamera-docs.doc-base rename to essential/picamera_library_modified/debian/python-picamera-docs.doc-base diff --git a/picamera_library_modified/debian/python-picamera-docs.docs b/essential/picamera_library_modified/debian/python-picamera-docs.docs similarity index 100% rename from picamera_library_modified/debian/python-picamera-docs.docs rename to essential/picamera_library_modified/debian/python-picamera-docs.docs diff --git a/picamera_library_modified/debian/rules b/essential/picamera_library_modified/debian/rules similarity index 100% rename from picamera_library_modified/debian/rules rename to essential/picamera_library_modified/debian/rules diff --git a/picamera_library_modified/debian/source/format b/essential/picamera_library_modified/debian/source/format similarity index 100% rename from picamera_library_modified/debian/source/format rename to essential/picamera_library_modified/debian/source/format diff --git a/picamera_library_modified/debian/source/options b/essential/picamera_library_modified/debian/source/options similarity index 100% rename from picamera_library_modified/debian/source/options rename to essential/picamera_library_modified/debian/source/options diff --git a/picamera_library_modified/dist/picamera-1.13-py3.7.egg b/essential/picamera_library_modified/dist/picamera-1.13-py3.7.egg similarity index 100% rename from picamera_library_modified/dist/picamera-1.13-py3.7.egg rename to essential/picamera_library_modified/dist/picamera-1.13-py3.7.egg diff --git a/picamera_library_modified/docs/Makefile b/essential/picamera_library_modified/docs/Makefile similarity index 100% rename from picamera_library_modified/docs/Makefile rename to essential/picamera_library_modified/docs/Makefile diff --git a/picamera_library_modified/docs/_static/style_override.css b/essential/picamera_library_modified/docs/_static/style_override.css similarity index 100% rename from picamera_library_modified/docs/_static/style_override.css rename to essential/picamera_library_modified/docs/_static/style_override.css diff --git a/picamera_library_modified/docs/api_array.rst b/essential/picamera_library_modified/docs/api_array.rst similarity index 100% rename from picamera_library_modified/docs/api_array.rst rename to essential/picamera_library_modified/docs/api_array.rst diff --git a/picamera_library_modified/docs/api_camera.rst b/essential/picamera_library_modified/docs/api_camera.rst similarity index 100% rename from picamera_library_modified/docs/api_camera.rst rename to essential/picamera_library_modified/docs/api_camera.rst diff --git a/picamera_library_modified/docs/api_color.rst b/essential/picamera_library_modified/docs/api_color.rst similarity index 100% rename from picamera_library_modified/docs/api_color.rst rename to essential/picamera_library_modified/docs/api_color.rst diff --git a/picamera_library_modified/docs/api_encoders.rst b/essential/picamera_library_modified/docs/api_encoders.rst similarity index 100% rename from picamera_library_modified/docs/api_encoders.rst rename to essential/picamera_library_modified/docs/api_encoders.rst diff --git a/picamera_library_modified/docs/api_exc.rst b/essential/picamera_library_modified/docs/api_exc.rst similarity index 100% rename from picamera_library_modified/docs/api_exc.rst rename to essential/picamera_library_modified/docs/api_exc.rst diff --git a/picamera_library_modified/docs/api_mmalobj.rst b/essential/picamera_library_modified/docs/api_mmalobj.rst similarity index 100% rename from picamera_library_modified/docs/api_mmalobj.rst rename to essential/picamera_library_modified/docs/api_mmalobj.rst diff --git a/picamera_library_modified/docs/api_renderers.rst b/essential/picamera_library_modified/docs/api_renderers.rst similarity index 100% rename from picamera_library_modified/docs/api_renderers.rst rename to essential/picamera_library_modified/docs/api_renderers.rst diff --git a/picamera_library_modified/docs/api_streams.rst b/essential/picamera_library_modified/docs/api_streams.rst similarity index 100% rename from picamera_library_modified/docs/api_streams.rst rename to essential/picamera_library_modified/docs/api_streams.rst diff --git a/picamera_library_modified/docs/changelog.rst b/essential/picamera_library_modified/docs/changelog.rst similarity index 100% rename from picamera_library_modified/docs/changelog.rst rename to essential/picamera_library_modified/docs/changelog.rst diff --git a/picamera_library_modified/docs/conf.py b/essential/picamera_library_modified/docs/conf.py similarity index 100% rename from picamera_library_modified/docs/conf.py rename to essential/picamera_library_modified/docs/conf.py diff --git a/picamera_library_modified/docs/deprecated.rst b/essential/picamera_library_modified/docs/deprecated.rst similarity index 100% rename from picamera_library_modified/docs/deprecated.rst rename to essential/picamera_library_modified/docs/deprecated.rst diff --git a/picamera_library_modified/docs/development.rst b/essential/picamera_library_modified/docs/development.rst similarity index 100% rename from picamera_library_modified/docs/development.rst rename to essential/picamera_library_modified/docs/development.rst diff --git a/picamera_library_modified/docs/encoder_classes.dot b/essential/picamera_library_modified/docs/encoder_classes.dot similarity index 100% rename from picamera_library_modified/docs/encoder_classes.dot rename to essential/picamera_library_modified/docs/encoder_classes.dot diff --git a/picamera_library_modified/docs/examples/array_capture_py2.py b/essential/picamera_library_modified/docs/examples/array_capture_py2.py similarity index 100% rename from picamera_library_modified/docs/examples/array_capture_py2.py rename to essential/picamera_library_modified/docs/examples/array_capture_py2.py diff --git a/picamera_library_modified/docs/examples/array_capture_py3.py b/essential/picamera_library_modified/docs/examples/array_capture_py3.py similarity index 100% rename from picamera_library_modified/docs/examples/array_capture_py3.py rename to essential/picamera_library_modified/docs/examples/array_capture_py3.py diff --git a/picamera_library_modified/docs/examples/bayer_array.py b/essential/picamera_library_modified/docs/examples/bayer_array.py similarity index 100% rename from picamera_library_modified/docs/examples/bayer_array.py rename to essential/picamera_library_modified/docs/examples/bayer_array.py diff --git a/picamera_library_modified/docs/examples/bayer_data.py b/essential/picamera_library_modified/docs/examples/bayer_data.py similarity index 100% rename from picamera_library_modified/docs/examples/bayer_data.py rename to essential/picamera_library_modified/docs/examples/bayer_data.py diff --git a/picamera_library_modified/docs/examples/capture_client.py b/essential/picamera_library_modified/docs/examples/capture_client.py similarity index 100% rename from picamera_library_modified/docs/examples/capture_client.py rename to essential/picamera_library_modified/docs/examples/capture_client.py diff --git a/picamera_library_modified/docs/examples/capture_server.py b/essential/picamera_library_modified/docs/examples/capture_server.py similarity index 100% rename from picamera_library_modified/docs/examples/capture_server.py rename to essential/picamera_library_modified/docs/examples/capture_server.py diff --git a/picamera_library_modified/docs/examples/circular_record1.py b/essential/picamera_library_modified/docs/examples/circular_record1.py similarity index 100% rename from picamera_library_modified/docs/examples/circular_record1.py rename to essential/picamera_library_modified/docs/examples/circular_record1.py diff --git a/picamera_library_modified/docs/examples/circular_record2.py b/essential/picamera_library_modified/docs/examples/circular_record2.py similarity index 100% rename from picamera_library_modified/docs/examples/circular_record2.py rename to essential/picamera_library_modified/docs/examples/circular_record2.py diff --git a/picamera_library_modified/docs/examples/color_detect.py b/essential/picamera_library_modified/docs/examples/color_detect.py similarity index 100% rename from picamera_library_modified/docs/examples/color_detect.py rename to essential/picamera_library_modified/docs/examples/color_detect.py diff --git a/picamera_library_modified/docs/examples/consistent_capture.py b/essential/picamera_library_modified/docs/examples/consistent_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/consistent_capture.py rename to essential/picamera_library_modified/docs/examples/consistent_capture.py diff --git a/picamera_library_modified/docs/examples/custom_encoders.py b/essential/picamera_library_modified/docs/examples/custom_encoders.py similarity index 100% rename from picamera_library_modified/docs/examples/custom_encoders.py rename to essential/picamera_library_modified/docs/examples/custom_encoders.py diff --git a/picamera_library_modified/docs/examples/custom_outputs_count.py b/essential/picamera_library_modified/docs/examples/custom_outputs_count.py similarity index 100% rename from picamera_library_modified/docs/examples/custom_outputs_count.py rename to essential/picamera_library_modified/docs/examples/custom_outputs_count.py diff --git a/picamera_library_modified/docs/examples/custom_outputs_motion_analysis.py b/essential/picamera_library_modified/docs/examples/custom_outputs_motion_analysis.py similarity index 100% rename from picamera_library_modified/docs/examples/custom_outputs_motion_analysis.py rename to essential/picamera_library_modified/docs/examples/custom_outputs_motion_analysis.py diff --git a/picamera_library_modified/docs/examples/custom_outputs_motion_detector.py b/essential/picamera_library_modified/docs/examples/custom_outputs_motion_detector.py similarity index 100% rename from picamera_library_modified/docs/examples/custom_outputs_motion_detector.py rename to essential/picamera_library_modified/docs/examples/custom_outputs_motion_detector.py diff --git a/picamera_library_modified/docs/examples/file_capture.py b/essential/picamera_library_modified/docs/examples/file_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/file_capture.py rename to essential/picamera_library_modified/docs/examples/file_capture.py diff --git a/picamera_library_modified/docs/examples/file_record.py b/essential/picamera_library_modified/docs/examples/file_record.py similarity index 100% rename from picamera_library_modified/docs/examples/file_record.py rename to essential/picamera_library_modified/docs/examples/file_record.py diff --git a/picamera_library_modified/docs/examples/gesture_detect.py b/essential/picamera_library_modified/docs/examples/gesture_detect.py similarity index 100% rename from picamera_library_modified/docs/examples/gesture_detect.py rename to essential/picamera_library_modified/docs/examples/gesture_detect.py diff --git a/picamera_library_modified/docs/examples/image_overlay_array.py b/essential/picamera_library_modified/docs/examples/image_overlay_array.py similarity index 100% rename from picamera_library_modified/docs/examples/image_overlay_array.py rename to essential/picamera_library_modified/docs/examples/image_overlay_array.py diff --git a/picamera_library_modified/docs/examples/image_overlay_file.py b/essential/picamera_library_modified/docs/examples/image_overlay_file.py similarity index 100% rename from picamera_library_modified/docs/examples/image_overlay_file.py rename to essential/picamera_library_modified/docs/examples/image_overlay_file.py diff --git a/picamera_library_modified/docs/examples/led_control.py b/essential/picamera_library_modified/docs/examples/led_control.py similarity index 100% rename from picamera_library_modified/docs/examples/led_control.py rename to essential/picamera_library_modified/docs/examples/led_control.py diff --git a/picamera_library_modified/docs/examples/mmal_clock_splitter.py b/essential/picamera_library_modified/docs/examples/mmal_clock_splitter.py similarity index 100% rename from picamera_library_modified/docs/examples/mmal_clock_splitter.py rename to essential/picamera_library_modified/docs/examples/mmal_clock_splitter.py diff --git a/picamera_library_modified/docs/examples/mmal_crosshair.py b/essential/picamera_library_modified/docs/examples/mmal_crosshair.py similarity index 100% rename from picamera_library_modified/docs/examples/mmal_crosshair.py rename to essential/picamera_library_modified/docs/examples/mmal_crosshair.py diff --git a/picamera_library_modified/docs/examples/motion_data1.py b/essential/picamera_library_modified/docs/examples/motion_data1.py similarity index 100% rename from picamera_library_modified/docs/examples/motion_data1.py rename to essential/picamera_library_modified/docs/examples/motion_data1.py diff --git a/picamera_library_modified/docs/examples/motion_data2.py b/essential/picamera_library_modified/docs/examples/motion_data2.py similarity index 100% rename from picamera_library_modified/docs/examples/motion_data2.py rename to essential/picamera_library_modified/docs/examples/motion_data2.py diff --git a/picamera_library_modified/docs/examples/motion_data3.py b/essential/picamera_library_modified/docs/examples/motion_data3.py similarity index 100% rename from picamera_library_modified/docs/examples/motion_data3.py rename to essential/picamera_library_modified/docs/examples/motion_data3.py diff --git a/picamera_library_modified/docs/examples/motion_data4.py b/essential/picamera_library_modified/docs/examples/motion_data4.py similarity index 100% rename from picamera_library_modified/docs/examples/motion_data4.py rename to essential/picamera_library_modified/docs/examples/motion_data4.py diff --git a/picamera_library_modified/docs/examples/multi_res_record.py b/essential/picamera_library_modified/docs/examples/multi_res_record.py similarity index 100% rename from picamera_library_modified/docs/examples/multi_res_record.py rename to essential/picamera_library_modified/docs/examples/multi_res_record.py diff --git a/picamera_library_modified/docs/examples/multiproc_camera.py b/essential/picamera_library_modified/docs/examples/multiproc_camera.py similarity index 100% rename from picamera_library_modified/docs/examples/multiproc_camera.py rename to essential/picamera_library_modified/docs/examples/multiproc_camera.py diff --git a/picamera_library_modified/docs/examples/night_capture.py b/essential/picamera_library_modified/docs/examples/night_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/night_capture.py rename to essential/picamera_library_modified/docs/examples/night_capture.py diff --git a/picamera_library_modified/docs/examples/opencv_capture.py b/essential/picamera_library_modified/docs/examples/opencv_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/opencv_capture.py rename to essential/picamera_library_modified/docs/examples/opencv_capture.py diff --git a/picamera_library_modified/docs/examples/pil_capture.py b/essential/picamera_library_modified/docs/examples/pil_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/pil_capture.py rename to essential/picamera_library_modified/docs/examples/pil_capture.py diff --git a/picamera_library_modified/docs/examples/rapid_capture_generator.py b/essential/picamera_library_modified/docs/examples/rapid_capture_generator.py similarity index 100% rename from picamera_library_modified/docs/examples/rapid_capture_generator.py rename to essential/picamera_library_modified/docs/examples/rapid_capture_generator.py diff --git a/picamera_library_modified/docs/examples/rapid_capture_mjpeg.py b/essential/picamera_library_modified/docs/examples/rapid_capture_mjpeg.py similarity index 100% rename from picamera_library_modified/docs/examples/rapid_capture_mjpeg.py rename to essential/picamera_library_modified/docs/examples/rapid_capture_mjpeg.py diff --git a/picamera_library_modified/docs/examples/rapid_capture_sequence.py b/essential/picamera_library_modified/docs/examples/rapid_capture_sequence.py similarity index 100% rename from picamera_library_modified/docs/examples/rapid_capture_sequence.py rename to essential/picamera_library_modified/docs/examples/rapid_capture_sequence.py diff --git a/picamera_library_modified/docs/examples/rapid_capture_threading.py b/essential/picamera_library_modified/docs/examples/rapid_capture_threading.py similarity index 100% rename from picamera_library_modified/docs/examples/rapid_capture_threading.py rename to essential/picamera_library_modified/docs/examples/rapid_capture_threading.py diff --git a/picamera_library_modified/docs/examples/rapid_capture_yield.py b/essential/picamera_library_modified/docs/examples/rapid_capture_yield.py similarity index 100% rename from picamera_library_modified/docs/examples/rapid_capture_yield.py rename to essential/picamera_library_modified/docs/examples/rapid_capture_yield.py diff --git a/picamera_library_modified/docs/examples/rapid_streaming.py b/essential/picamera_library_modified/docs/examples/rapid_streaming.py similarity index 100% rename from picamera_library_modified/docs/examples/rapid_streaming.py rename to essential/picamera_library_modified/docs/examples/rapid_streaming.py diff --git a/picamera_library_modified/docs/examples/rapid_streaming_mjpeg.py b/essential/picamera_library_modified/docs/examples/rapid_streaming_mjpeg.py similarity index 100% rename from picamera_library_modified/docs/examples/rapid_streaming_mjpeg.py rename to essential/picamera_library_modified/docs/examples/rapid_streaming_mjpeg.py diff --git a/picamera_library_modified/docs/examples/record_and_capture.py b/essential/picamera_library_modified/docs/examples/record_and_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/record_and_capture.py rename to essential/picamera_library_modified/docs/examples/record_and_capture.py diff --git a/picamera_library_modified/docs/examples/record_client.py b/essential/picamera_library_modified/docs/examples/record_client.py similarity index 100% rename from picamera_library_modified/docs/examples/record_client.py rename to essential/picamera_library_modified/docs/examples/record_client.py diff --git a/picamera_library_modified/docs/examples/record_sequence.py b/essential/picamera_library_modified/docs/examples/record_sequence.py similarity index 100% rename from picamera_library_modified/docs/examples/record_sequence.py rename to essential/picamera_library_modified/docs/examples/record_sequence.py diff --git a/picamera_library_modified/docs/examples/record_server.py b/essential/picamera_library_modified/docs/examples/record_server.py similarity index 100% rename from picamera_library_modified/docs/examples/record_server.py rename to essential/picamera_library_modified/docs/examples/record_server.py diff --git a/picamera_library_modified/docs/examples/record_server_pi.py b/essential/picamera_library_modified/docs/examples/record_server_pi.py similarity index 100% rename from picamera_library_modified/docs/examples/record_server_pi.py rename to essential/picamera_library_modified/docs/examples/record_server_pi.py diff --git a/picamera_library_modified/docs/examples/resize_capture.py b/essential/picamera_library_modified/docs/examples/resize_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/resize_capture.py rename to essential/picamera_library_modified/docs/examples/resize_capture.py diff --git a/picamera_library_modified/docs/examples/rgb_capture1.py b/essential/picamera_library_modified/docs/examples/rgb_capture1.py similarity index 100% rename from picamera_library_modified/docs/examples/rgb_capture1.py rename to essential/picamera_library_modified/docs/examples/rgb_capture1.py diff --git a/picamera_library_modified/docs/examples/rgb_capture2.py b/essential/picamera_library_modified/docs/examples/rgb_capture2.py similarity index 100% rename from picamera_library_modified/docs/examples/rgb_capture2.py rename to essential/picamera_library_modified/docs/examples/rgb_capture2.py diff --git a/picamera_library_modified/docs/examples/split_record.py b/essential/picamera_library_modified/docs/examples/split_record.py similarity index 100% rename from picamera_library_modified/docs/examples/split_record.py rename to essential/picamera_library_modified/docs/examples/split_record.py diff --git a/picamera_library_modified/docs/examples/stream_capture.py b/essential/picamera_library_modified/docs/examples/stream_capture.py similarity index 100% rename from picamera_library_modified/docs/examples/stream_capture.py rename to essential/picamera_library_modified/docs/examples/stream_capture.py diff --git a/picamera_library_modified/docs/examples/stream_capture_close.py b/essential/picamera_library_modified/docs/examples/stream_capture_close.py similarity index 100% rename from picamera_library_modified/docs/examples/stream_capture_close.py rename to essential/picamera_library_modified/docs/examples/stream_capture_close.py diff --git a/picamera_library_modified/docs/examples/stream_record.py b/essential/picamera_library_modified/docs/examples/stream_record.py similarity index 100% rename from picamera_library_modified/docs/examples/stream_record.py rename to essential/picamera_library_modified/docs/examples/stream_record.py diff --git a/picamera_library_modified/docs/examples/text_overlay.py b/essential/picamera_library_modified/docs/examples/text_overlay.py similarity index 100% rename from picamera_library_modified/docs/examples/text_overlay.py rename to essential/picamera_library_modified/docs/examples/text_overlay.py diff --git a/picamera_library_modified/docs/examples/text_overlay_scroll.py b/essential/picamera_library_modified/docs/examples/text_overlay_scroll.py similarity index 100% rename from picamera_library_modified/docs/examples/text_overlay_scroll.py rename to essential/picamera_library_modified/docs/examples/text_overlay_scroll.py diff --git a/picamera_library_modified/docs/examples/text_overlay_timestamp.py b/essential/picamera_library_modified/docs/examples/text_overlay_timestamp.py similarity index 100% rename from picamera_library_modified/docs/examples/text_overlay_timestamp.py rename to essential/picamera_library_modified/docs/examples/text_overlay_timestamp.py diff --git a/picamera_library_modified/docs/examples/timelapse1.py b/essential/picamera_library_modified/docs/examples/timelapse1.py similarity index 100% rename from picamera_library_modified/docs/examples/timelapse1.py rename to essential/picamera_library_modified/docs/examples/timelapse1.py diff --git a/picamera_library_modified/docs/examples/timelapse2.py b/essential/picamera_library_modified/docs/examples/timelapse2.py similarity index 100% rename from picamera_library_modified/docs/examples/timelapse2.py rename to essential/picamera_library_modified/docs/examples/timelapse2.py diff --git a/picamera_library_modified/docs/examples/web_streaming.py b/essential/picamera_library_modified/docs/examples/web_streaming.py similarity index 100% rename from picamera_library_modified/docs/examples/web_streaming.py rename to essential/picamera_library_modified/docs/examples/web_streaming.py diff --git a/picamera_library_modified/docs/examples/weird_outputs.py b/essential/picamera_library_modified/docs/examples/weird_outputs.py similarity index 100% rename from picamera_library_modified/docs/examples/weird_outputs.py rename to essential/picamera_library_modified/docs/examples/weird_outputs.py diff --git a/picamera_library_modified/docs/examples/yuv_capture1.py b/essential/picamera_library_modified/docs/examples/yuv_capture1.py similarity index 100% rename from picamera_library_modified/docs/examples/yuv_capture1.py rename to essential/picamera_library_modified/docs/examples/yuv_capture1.py diff --git a/picamera_library_modified/docs/examples/yuv_capture2.py b/essential/picamera_library_modified/docs/examples/yuv_capture2.py similarity index 100% rename from picamera_library_modified/docs/examples/yuv_capture2.py rename to essential/picamera_library_modified/docs/examples/yuv_capture2.py diff --git a/picamera_library_modified/docs/examples/yuv_capture3.py b/essential/picamera_library_modified/docs/examples/yuv_capture3.py similarity index 100% rename from picamera_library_modified/docs/examples/yuv_capture3.py rename to essential/picamera_library_modified/docs/examples/yuv_capture3.py diff --git a/picamera_library_modified/docs/examples/yuv_capture4.py b/essential/picamera_library_modified/docs/examples/yuv_capture4.py similarity index 100% rename from picamera_library_modified/docs/examples/yuv_capture4.py rename to essential/picamera_library_modified/docs/examples/yuv_capture4.py diff --git a/picamera_library_modified/docs/faq.rst b/essential/picamera_library_modified/docs/faq.rst similarity index 100% rename from picamera_library_modified/docs/faq.rst rename to essential/picamera_library_modified/docs/faq.rst diff --git a/picamera_library_modified/docs/fov.rst b/essential/picamera_library_modified/docs/fov.rst similarity index 100% rename from picamera_library_modified/docs/fov.rst rename to essential/picamera_library_modified/docs/fov.rst diff --git a/picamera_library_modified/docs/images/bayer_bytes.pdf b/essential/picamera_library_modified/docs/images/bayer_bytes.pdf similarity index 100% rename from picamera_library_modified/docs/images/bayer_bytes.pdf rename to essential/picamera_library_modified/docs/images/bayer_bytes.pdf diff --git a/picamera_library_modified/docs/images/bayer_bytes.png b/essential/picamera_library_modified/docs/images/bayer_bytes.png similarity index 100% rename from picamera_library_modified/docs/images/bayer_bytes.png rename to essential/picamera_library_modified/docs/images/bayer_bytes.png diff --git a/picamera_library_modified/docs/images/bayer_bytes.svg b/essential/picamera_library_modified/docs/images/bayer_bytes.svg similarity index 100% rename from picamera_library_modified/docs/images/bayer_bytes.svg rename to essential/picamera_library_modified/docs/images/bayer_bytes.svg diff --git a/picamera_library_modified/docs/images/bayer_pattern.pdf b/essential/picamera_library_modified/docs/images/bayer_pattern.pdf similarity index 100% rename from picamera_library_modified/docs/images/bayer_pattern.pdf rename to essential/picamera_library_modified/docs/images/bayer_pattern.pdf diff --git a/picamera_library_modified/docs/images/bayer_pattern.png b/essential/picamera_library_modified/docs/images/bayer_pattern.png similarity index 100% rename from picamera_library_modified/docs/images/bayer_pattern.png rename to essential/picamera_library_modified/docs/images/bayer_pattern.png diff --git a/picamera_library_modified/docs/images/bayer_pattern.svg b/essential/picamera_library_modified/docs/images/bayer_pattern.svg similarity index 100% rename from picamera_library_modified/docs/images/bayer_pattern.svg rename to essential/picamera_library_modified/docs/images/bayer_pattern.svg diff --git a/picamera_library_modified/docs/images/camera_architecture.pdf b/essential/picamera_library_modified/docs/images/camera_architecture.pdf similarity index 100% rename from picamera_library_modified/docs/images/camera_architecture.pdf rename to essential/picamera_library_modified/docs/images/camera_architecture.pdf diff --git a/picamera_library_modified/docs/images/camera_architecture.png b/essential/picamera_library_modified/docs/images/camera_architecture.png similarity index 100% rename from picamera_library_modified/docs/images/camera_architecture.png rename to essential/picamera_library_modified/docs/images/camera_architecture.png diff --git a/picamera_library_modified/docs/images/camera_architecture.svg b/essential/picamera_library_modified/docs/images/camera_architecture.svg similarity index 100% rename from picamera_library_modified/docs/images/camera_architecture.svg rename to essential/picamera_library_modified/docs/images/camera_architecture.svg diff --git a/picamera_library_modified/docs/images/camera_layout.pdf b/essential/picamera_library_modified/docs/images/camera_layout.pdf similarity index 100% rename from picamera_library_modified/docs/images/camera_layout.pdf rename to essential/picamera_library_modified/docs/images/camera_layout.pdf diff --git a/picamera_library_modified/docs/images/camera_layout.png b/essential/picamera_library_modified/docs/images/camera_layout.png similarity index 100% rename from picamera_library_modified/docs/images/camera_layout.png rename to essential/picamera_library_modified/docs/images/camera_layout.png diff --git a/picamera_library_modified/docs/images/camera_layout.svg b/essential/picamera_library_modified/docs/images/camera_layout.svg similarity index 100% rename from picamera_library_modified/docs/images/camera_layout.svg rename to essential/picamera_library_modified/docs/images/camera_layout.svg diff --git a/picamera_library_modified/docs/images/enable_camera.png b/essential/picamera_library_modified/docs/images/enable_camera.png similarity index 100% rename from picamera_library_modified/docs/images/enable_camera.png rename to essential/picamera_library_modified/docs/images/enable_camera.png diff --git a/picamera_library_modified/docs/images/encoder_classes.pdf b/essential/picamera_library_modified/docs/images/encoder_classes.pdf similarity index 100% rename from picamera_library_modified/docs/images/encoder_classes.pdf rename to essential/picamera_library_modified/docs/images/encoder_classes.pdf diff --git a/picamera_library_modified/docs/images/encoder_classes.png b/essential/picamera_library_modified/docs/images/encoder_classes.png similarity index 100% rename from picamera_library_modified/docs/images/encoder_classes.png rename to essential/picamera_library_modified/docs/images/encoder_classes.png diff --git a/picamera_library_modified/docs/images/encoder_classes.svg b/essential/picamera_library_modified/docs/images/encoder_classes.svg similarity index 100% rename from picamera_library_modified/docs/images/encoder_classes.svg rename to essential/picamera_library_modified/docs/images/encoder_classes.svg diff --git a/picamera_library_modified/docs/images/good_connection.jpg b/essential/picamera_library_modified/docs/images/good_connection.jpg similarity index 100% rename from picamera_library_modified/docs/images/good_connection.jpg rename to essential/picamera_library_modified/docs/images/good_connection.jpg diff --git a/picamera_library_modified/docs/images/good_connection.xcf b/essential/picamera_library_modified/docs/images/good_connection.xcf similarity index 100% rename from picamera_library_modified/docs/images/good_connection.xcf rename to essential/picamera_library_modified/docs/images/good_connection.xcf diff --git a/picamera_library_modified/docs/images/gpu_architecture.pdf b/essential/picamera_library_modified/docs/images/gpu_architecture.pdf similarity index 100% rename from picamera_library_modified/docs/images/gpu_architecture.pdf rename to essential/picamera_library_modified/docs/images/gpu_architecture.pdf diff --git a/picamera_library_modified/docs/images/gpu_architecture.png b/essential/picamera_library_modified/docs/images/gpu_architecture.png similarity index 100% rename from picamera_library_modified/docs/images/gpu_architecture.png rename to essential/picamera_library_modified/docs/images/gpu_architecture.png diff --git a/picamera_library_modified/docs/images/gpu_architecture.svg b/essential/picamera_library_modified/docs/images/gpu_architecture.svg similarity index 100% rename from picamera_library_modified/docs/images/gpu_architecture.svg rename to essential/picamera_library_modified/docs/images/gpu_architecture.svg diff --git a/picamera_library_modified/docs/images/image_protocol.pdf b/essential/picamera_library_modified/docs/images/image_protocol.pdf similarity index 100% rename from picamera_library_modified/docs/images/image_protocol.pdf rename to essential/picamera_library_modified/docs/images/image_protocol.pdf diff --git a/picamera_library_modified/docs/images/image_protocol.png b/essential/picamera_library_modified/docs/images/image_protocol.png similarity index 100% rename from picamera_library_modified/docs/images/image_protocol.png rename to essential/picamera_library_modified/docs/images/image_protocol.png diff --git a/picamera_library_modified/docs/images/image_protocol.svg b/essential/picamera_library_modified/docs/images/image_protocol.svg similarity index 100% rename from picamera_library_modified/docs/images/image_protocol.svg rename to essential/picamera_library_modified/docs/images/image_protocol.svg diff --git a/picamera_library_modified/docs/images/jpeg_capture_pipeline.dot b/essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.dot similarity index 100% rename from picamera_library_modified/docs/images/jpeg_capture_pipeline.dot rename to essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.dot diff --git a/picamera_library_modified/docs/images/jpeg_capture_pipeline.pdf b/essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.pdf similarity index 100% rename from picamera_library_modified/docs/images/jpeg_capture_pipeline.pdf rename to essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.pdf diff --git a/picamera_library_modified/docs/images/jpeg_capture_pipeline.png b/essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.png similarity index 100% rename from picamera_library_modified/docs/images/jpeg_capture_pipeline.png rename to essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.png diff --git a/picamera_library_modified/docs/images/jpeg_capture_pipeline.svg b/essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.svg similarity index 100% rename from picamera_library_modified/docs/images/jpeg_capture_pipeline.svg rename to essential/picamera_library_modified/docs/images/jpeg_capture_pipeline.svg diff --git a/picamera_library_modified/docs/images/jpeg_encode_pipeline.dot b/essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.dot similarity index 100% rename from picamera_library_modified/docs/images/jpeg_encode_pipeline.dot rename to essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.dot diff --git a/picamera_library_modified/docs/images/jpeg_encode_pipeline.pdf b/essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.pdf similarity index 100% rename from picamera_library_modified/docs/images/jpeg_encode_pipeline.pdf rename to essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.pdf diff --git a/picamera_library_modified/docs/images/jpeg_encode_pipeline.png b/essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.png similarity index 100% rename from picamera_library_modified/docs/images/jpeg_encode_pipeline.png rename to essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.png diff --git a/picamera_library_modified/docs/images/jpeg_encode_pipeline.svg b/essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.svg similarity index 100% rename from picamera_library_modified/docs/images/jpeg_encode_pipeline.svg rename to essential/picamera_library_modified/docs/images/jpeg_encode_pipeline.svg diff --git a/picamera_library_modified/docs/images/pi_zero_assembled.jpg b/essential/picamera_library_modified/docs/images/pi_zero_assembled.jpg similarity index 100% rename from picamera_library_modified/docs/images/pi_zero_assembled.jpg rename to essential/picamera_library_modified/docs/images/pi_zero_assembled.jpg diff --git a/picamera_library_modified/docs/images/pi_zero_pieces.jpg b/essential/picamera_library_modified/docs/images/pi_zero_pieces.jpg similarity index 100% rename from picamera_library_modified/docs/images/pi_zero_pieces.jpg rename to essential/picamera_library_modified/docs/images/pi_zero_pieces.jpg diff --git a/picamera_library_modified/docs/images/picamera_pipeline.dot b/essential/picamera_library_modified/docs/images/picamera_pipeline.dot similarity index 100% rename from picamera_library_modified/docs/images/picamera_pipeline.dot rename to essential/picamera_library_modified/docs/images/picamera_pipeline.dot diff --git a/picamera_library_modified/docs/images/picamera_pipeline.pdf b/essential/picamera_library_modified/docs/images/picamera_pipeline.pdf similarity index 100% rename from picamera_library_modified/docs/images/picamera_pipeline.pdf rename to essential/picamera_library_modified/docs/images/picamera_pipeline.pdf diff --git a/picamera_library_modified/docs/images/picamera_pipeline.png b/essential/picamera_library_modified/docs/images/picamera_pipeline.png similarity index 100% rename from picamera_library_modified/docs/images/picamera_pipeline.png rename to essential/picamera_library_modified/docs/images/picamera_pipeline.png diff --git a/picamera_library_modified/docs/images/picamera_pipeline.svg b/essential/picamera_library_modified/docs/images/picamera_pipeline.svg similarity index 100% rename from picamera_library_modified/docs/images/picamera_pipeline.svg rename to essential/picamera_library_modified/docs/images/picamera_pipeline.svg diff --git a/picamera_library_modified/docs/images/preview_pipeline.dot b/essential/picamera_library_modified/docs/images/preview_pipeline.dot similarity index 100% rename from picamera_library_modified/docs/images/preview_pipeline.dot rename to essential/picamera_library_modified/docs/images/preview_pipeline.dot diff --git a/picamera_library_modified/docs/images/preview_pipeline.pdf b/essential/picamera_library_modified/docs/images/preview_pipeline.pdf similarity index 100% rename from picamera_library_modified/docs/images/preview_pipeline.pdf rename to essential/picamera_library_modified/docs/images/preview_pipeline.pdf diff --git a/picamera_library_modified/docs/images/preview_pipeline.png b/essential/picamera_library_modified/docs/images/preview_pipeline.png similarity index 100% rename from picamera_library_modified/docs/images/preview_pipeline.png rename to essential/picamera_library_modified/docs/images/preview_pipeline.png diff --git a/picamera_library_modified/docs/images/preview_pipeline.svg b/essential/picamera_library_modified/docs/images/preview_pipeline.svg similarity index 100% rename from picamera_library_modified/docs/images/preview_pipeline.svg rename to essential/picamera_library_modified/docs/images/preview_pipeline.svg diff --git a/picamera_library_modified/docs/images/rgb_capture_pipeline.dot b/essential/picamera_library_modified/docs/images/rgb_capture_pipeline.dot similarity index 100% rename from picamera_library_modified/docs/images/rgb_capture_pipeline.dot rename to essential/picamera_library_modified/docs/images/rgb_capture_pipeline.dot diff --git a/picamera_library_modified/docs/images/rgb_capture_pipeline.pdf b/essential/picamera_library_modified/docs/images/rgb_capture_pipeline.pdf similarity index 100% rename from picamera_library_modified/docs/images/rgb_capture_pipeline.pdf rename to essential/picamera_library_modified/docs/images/rgb_capture_pipeline.pdf diff --git a/picamera_library_modified/docs/images/rgb_capture_pipeline.png b/essential/picamera_library_modified/docs/images/rgb_capture_pipeline.png similarity index 100% rename from picamera_library_modified/docs/images/rgb_capture_pipeline.png rename to essential/picamera_library_modified/docs/images/rgb_capture_pipeline.png diff --git a/picamera_library_modified/docs/images/rgb_capture_pipeline.svg b/essential/picamera_library_modified/docs/images/rgb_capture_pipeline.svg similarity index 100% rename from picamera_library_modified/docs/images/rgb_capture_pipeline.svg rename to essential/picamera_library_modified/docs/images/rgb_capture_pipeline.svg diff --git a/picamera_library_modified/docs/images/sensor_area_1.png b/essential/picamera_library_modified/docs/images/sensor_area_1.png similarity index 100% rename from picamera_library_modified/docs/images/sensor_area_1.png rename to essential/picamera_library_modified/docs/images/sensor_area_1.png diff --git a/picamera_library_modified/docs/images/sensor_area_1.xcf b/essential/picamera_library_modified/docs/images/sensor_area_1.xcf similarity index 100% rename from picamera_library_modified/docs/images/sensor_area_1.xcf rename to essential/picamera_library_modified/docs/images/sensor_area_1.xcf diff --git a/picamera_library_modified/docs/images/sensor_area_2.png b/essential/picamera_library_modified/docs/images/sensor_area_2.png similarity index 100% rename from picamera_library_modified/docs/images/sensor_area_2.png rename to essential/picamera_library_modified/docs/images/sensor_area_2.png diff --git a/picamera_library_modified/docs/images/sensor_area_2.xcf b/essential/picamera_library_modified/docs/images/sensor_area_2.xcf similarity index 100% rename from picamera_library_modified/docs/images/sensor_area_2.xcf rename to essential/picamera_library_modified/docs/images/sensor_area_2.xcf diff --git a/picamera_library_modified/docs/images/still_port_capture.pdf b/essential/picamera_library_modified/docs/images/still_port_capture.pdf similarity index 100% rename from picamera_library_modified/docs/images/still_port_capture.pdf rename to essential/picamera_library_modified/docs/images/still_port_capture.pdf diff --git a/picamera_library_modified/docs/images/still_port_capture.png b/essential/picamera_library_modified/docs/images/still_port_capture.png similarity index 100% rename from picamera_library_modified/docs/images/still_port_capture.png rename to essential/picamera_library_modified/docs/images/still_port_capture.png diff --git a/picamera_library_modified/docs/images/still_port_capture.svg b/essential/picamera_library_modified/docs/images/still_port_capture.svg similarity index 100% rename from picamera_library_modified/docs/images/still_port_capture.svg rename to essential/picamera_library_modified/docs/images/still_port_capture.svg diff --git a/picamera_library_modified/docs/images/still_raw_capture.pdf b/essential/picamera_library_modified/docs/images/still_raw_capture.pdf similarity index 100% rename from picamera_library_modified/docs/images/still_raw_capture.pdf rename to essential/picamera_library_modified/docs/images/still_raw_capture.pdf diff --git a/picamera_library_modified/docs/images/still_raw_capture.png b/essential/picamera_library_modified/docs/images/still_raw_capture.png similarity index 100% rename from picamera_library_modified/docs/images/still_raw_capture.png rename to essential/picamera_library_modified/docs/images/still_raw_capture.png diff --git a/picamera_library_modified/docs/images/still_raw_capture.svg b/essential/picamera_library_modified/docs/images/still_raw_capture.svg similarity index 100% rename from picamera_library_modified/docs/images/still_raw_capture.svg rename to essential/picamera_library_modified/docs/images/still_raw_capture.svg diff --git a/picamera_library_modified/docs/images/versions.pdf b/essential/picamera_library_modified/docs/images/versions.pdf similarity index 100% rename from picamera_library_modified/docs/images/versions.pdf rename to essential/picamera_library_modified/docs/images/versions.pdf diff --git a/picamera_library_modified/docs/images/versions.png b/essential/picamera_library_modified/docs/images/versions.png similarity index 100% rename from picamera_library_modified/docs/images/versions.png rename to essential/picamera_library_modified/docs/images/versions.png diff --git a/picamera_library_modified/docs/images/versions.svg b/essential/picamera_library_modified/docs/images/versions.svg similarity index 100% rename from picamera_library_modified/docs/images/versions.svg rename to essential/picamera_library_modified/docs/images/versions.svg diff --git a/picamera_library_modified/docs/images/video_fullfov_record.pdf b/essential/picamera_library_modified/docs/images/video_fullfov_record.pdf similarity index 100% rename from picamera_library_modified/docs/images/video_fullfov_record.pdf rename to essential/picamera_library_modified/docs/images/video_fullfov_record.pdf diff --git a/picamera_library_modified/docs/images/video_fullfov_record.png b/essential/picamera_library_modified/docs/images/video_fullfov_record.png similarity index 100% rename from picamera_library_modified/docs/images/video_fullfov_record.png rename to essential/picamera_library_modified/docs/images/video_fullfov_record.png diff --git a/picamera_library_modified/docs/images/video_fullfov_record.svg b/essential/picamera_library_modified/docs/images/video_fullfov_record.svg similarity index 100% rename from picamera_library_modified/docs/images/video_fullfov_record.svg rename to essential/picamera_library_modified/docs/images/video_fullfov_record.svg diff --git a/picamera_library_modified/docs/images/video_port_capture.pdf b/essential/picamera_library_modified/docs/images/video_port_capture.pdf similarity index 100% rename from picamera_library_modified/docs/images/video_port_capture.pdf rename to essential/picamera_library_modified/docs/images/video_port_capture.pdf diff --git a/picamera_library_modified/docs/images/video_port_capture.png b/essential/picamera_library_modified/docs/images/video_port_capture.png similarity index 100% rename from picamera_library_modified/docs/images/video_port_capture.png rename to essential/picamera_library_modified/docs/images/video_port_capture.png diff --git a/picamera_library_modified/docs/images/video_port_capture.svg b/essential/picamera_library_modified/docs/images/video_port_capture.svg similarity index 100% rename from picamera_library_modified/docs/images/video_port_capture.svg rename to essential/picamera_library_modified/docs/images/video_port_capture.svg diff --git a/picamera_library_modified/docs/images/video_port_record.pdf b/essential/picamera_library_modified/docs/images/video_port_record.pdf similarity index 100% rename from picamera_library_modified/docs/images/video_port_record.pdf rename to essential/picamera_library_modified/docs/images/video_port_record.pdf diff --git a/picamera_library_modified/docs/images/video_port_record.png b/essential/picamera_library_modified/docs/images/video_port_record.png similarity index 100% rename from picamera_library_modified/docs/images/video_port_record.png rename to essential/picamera_library_modified/docs/images/video_port_record.png diff --git a/picamera_library_modified/docs/images/video_port_record.svg b/essential/picamera_library_modified/docs/images/video_port_record.svg similarity index 100% rename from picamera_library_modified/docs/images/video_port_record.svg rename to essential/picamera_library_modified/docs/images/video_port_record.svg diff --git a/picamera_library_modified/docs/images/yuv420.pdf b/essential/picamera_library_modified/docs/images/yuv420.pdf similarity index 100% rename from picamera_library_modified/docs/images/yuv420.pdf rename to essential/picamera_library_modified/docs/images/yuv420.pdf diff --git a/picamera_library_modified/docs/images/yuv420.png b/essential/picamera_library_modified/docs/images/yuv420.png similarity index 100% rename from picamera_library_modified/docs/images/yuv420.png rename to essential/picamera_library_modified/docs/images/yuv420.png diff --git a/picamera_library_modified/docs/images/yuv420.svg b/essential/picamera_library_modified/docs/images/yuv420.svg similarity index 100% rename from picamera_library_modified/docs/images/yuv420.svg rename to essential/picamera_library_modified/docs/images/yuv420.svg diff --git a/picamera_library_modified/docs/index.rst b/essential/picamera_library_modified/docs/index.rst similarity index 100% rename from picamera_library_modified/docs/index.rst rename to essential/picamera_library_modified/docs/index.rst diff --git a/picamera_library_modified/docs/install.rst b/essential/picamera_library_modified/docs/install.rst similarity index 100% rename from picamera_library_modified/docs/install.rst rename to essential/picamera_library_modified/docs/install.rst diff --git a/picamera_library_modified/docs/license.rst b/essential/picamera_library_modified/docs/license.rst similarity index 100% rename from picamera_library_modified/docs/license.rst rename to essential/picamera_library_modified/docs/license.rst diff --git a/picamera_library_modified/docs/quickstart.rst b/essential/picamera_library_modified/docs/quickstart.rst similarity index 100% rename from picamera_library_modified/docs/quickstart.rst rename to essential/picamera_library_modified/docs/quickstart.rst diff --git a/picamera_library_modified/docs/recipes1.rst b/essential/picamera_library_modified/docs/recipes1.rst similarity index 100% rename from picamera_library_modified/docs/recipes1.rst rename to essential/picamera_library_modified/docs/recipes1.rst diff --git a/picamera_library_modified/docs/recipes2.rst b/essential/picamera_library_modified/docs/recipes2.rst similarity index 100% rename from picamera_library_modified/docs/recipes2.rst rename to essential/picamera_library_modified/docs/recipes2.rst diff --git a/picamera_library_modified/picamera.egg-info/PKG-INFO b/essential/picamera_library_modified/picamera.egg-info/PKG-INFO similarity index 100% rename from picamera_library_modified/picamera.egg-info/PKG-INFO rename to essential/picamera_library_modified/picamera.egg-info/PKG-INFO diff --git a/picamera_library_modified/picamera.egg-info/SOURCES.txt b/essential/picamera_library_modified/picamera.egg-info/SOURCES.txt similarity index 100% rename from picamera_library_modified/picamera.egg-info/SOURCES.txt rename to essential/picamera_library_modified/picamera.egg-info/SOURCES.txt diff --git a/picamera_library_modified/picamera.egg-info/dependency_links.txt b/essential/picamera_library_modified/picamera.egg-info/dependency_links.txt similarity index 100% rename from picamera_library_modified/picamera.egg-info/dependency_links.txt rename to essential/picamera_library_modified/picamera.egg-info/dependency_links.txt diff --git a/picamera_library_modified/picamera.egg-info/requires.txt b/essential/picamera_library_modified/picamera.egg-info/requires.txt similarity index 100% rename from picamera_library_modified/picamera.egg-info/requires.txt rename to essential/picamera_library_modified/picamera.egg-info/requires.txt diff --git a/picamera_library_modified/picamera.egg-info/top_level.txt b/essential/picamera_library_modified/picamera.egg-info/top_level.txt similarity index 100% rename from picamera_library_modified/picamera.egg-info/top_level.txt rename to essential/picamera_library_modified/picamera.egg-info/top_level.txt diff --git a/picamera_library_modified/picamera/__init__.py b/essential/picamera_library_modified/picamera/__init__.py similarity index 100% rename from picamera_library_modified/picamera/__init__.py rename to essential/picamera_library_modified/picamera/__init__.py diff --git a/picamera_library_modified/picamera/array.py b/essential/picamera_library_modified/picamera/array.py similarity index 100% rename from picamera_library_modified/picamera/array.py rename to essential/picamera_library_modified/picamera/array.py diff --git a/picamera_library_modified/picamera/bcm_host.py b/essential/picamera_library_modified/picamera/bcm_host.py similarity index 100% rename from picamera_library_modified/picamera/bcm_host.py rename to essential/picamera_library_modified/picamera/bcm_host.py diff --git a/picamera_library_modified/picamera/camera.py b/essential/picamera_library_modified/picamera/camera.py similarity index 100% rename from picamera_library_modified/picamera/camera.py rename to essential/picamera_library_modified/picamera/camera.py diff --git a/picamera_library_modified/picamera/color.py b/essential/picamera_library_modified/picamera/color.py similarity index 100% rename from picamera_library_modified/picamera/color.py rename to essential/picamera_library_modified/picamera/color.py diff --git a/picamera_library_modified/picamera/display.py b/essential/picamera_library_modified/picamera/display.py similarity index 100% rename from picamera_library_modified/picamera/display.py rename to essential/picamera_library_modified/picamera/display.py diff --git a/picamera_library_modified/picamera/encoders.py b/essential/picamera_library_modified/picamera/encoders.py similarity index 100% rename from picamera_library_modified/picamera/encoders.py rename to essential/picamera_library_modified/picamera/encoders.py diff --git a/picamera_library_modified/picamera/exc.py b/essential/picamera_library_modified/picamera/exc.py similarity index 100% rename from picamera_library_modified/picamera/exc.py rename to essential/picamera_library_modified/picamera/exc.py diff --git a/picamera_library_modified/picamera/frames.py b/essential/picamera_library_modified/picamera/frames.py similarity index 100% rename from picamera_library_modified/picamera/frames.py rename to essential/picamera_library_modified/picamera/frames.py diff --git a/picamera_library_modified/picamera/mmal.py b/essential/picamera_library_modified/picamera/mmal.py similarity index 100% rename from picamera_library_modified/picamera/mmal.py rename to essential/picamera_library_modified/picamera/mmal.py diff --git a/picamera_library_modified/picamera/mmalobj.py b/essential/picamera_library_modified/picamera/mmalobj.py similarity index 100% rename from picamera_library_modified/picamera/mmalobj.py rename to essential/picamera_library_modified/picamera/mmalobj.py diff --git a/picamera_library_modified/picamera/renderers.py b/essential/picamera_library_modified/picamera/renderers.py similarity index 100% rename from picamera_library_modified/picamera/renderers.py rename to essential/picamera_library_modified/picamera/renderers.py diff --git a/picamera_library_modified/picamera/streams.py b/essential/picamera_library_modified/picamera/streams.py similarity index 100% rename from picamera_library_modified/picamera/streams.py rename to essential/picamera_library_modified/picamera/streams.py diff --git a/picamera_library_modified/py32dev_requirements.txt b/essential/picamera_library_modified/py32dev_requirements.txt similarity index 100% rename from picamera_library_modified/py32dev_requirements.txt rename to essential/picamera_library_modified/py32dev_requirements.txt diff --git a/picamera_library_modified/rtd_requirements.txt b/essential/picamera_library_modified/rtd_requirements.txt similarity index 100% rename from picamera_library_modified/rtd_requirements.txt rename to essential/picamera_library_modified/rtd_requirements.txt diff --git a/picamera_library_modified/setup.py b/essential/picamera_library_modified/setup.py similarity index 100% rename from picamera_library_modified/setup.py rename to essential/picamera_library_modified/setup.py diff --git a/picamera_library_modified/tests/conftest.py b/essential/picamera_library_modified/tests/conftest.py similarity index 100% rename from picamera_library_modified/tests/conftest.py rename to essential/picamera_library_modified/tests/conftest.py diff --git a/picamera_library_modified/tests/test_array.py b/essential/picamera_library_modified/tests/test_array.py similarity index 100% rename from picamera_library_modified/tests/test_array.py rename to essential/picamera_library_modified/tests/test_array.py diff --git a/picamera_library_modified/tests/test_attr.py b/essential/picamera_library_modified/tests/test_attr.py similarity index 100% rename from picamera_library_modified/tests/test_attr.py rename to essential/picamera_library_modified/tests/test_attr.py diff --git a/picamera_library_modified/tests/test_capture.py b/essential/picamera_library_modified/tests/test_capture.py similarity index 100% rename from picamera_library_modified/tests/test_capture.py rename to essential/picamera_library_modified/tests/test_capture.py diff --git a/picamera_library_modified/tests/test_exc.py b/essential/picamera_library_modified/tests/test_exc.py similarity index 100% rename from picamera_library_modified/tests/test_exc.py rename to essential/picamera_library_modified/tests/test_exc.py diff --git a/picamera_library_modified/tests/test_misc.py b/essential/picamera_library_modified/tests/test_misc.py similarity index 100% rename from picamera_library_modified/tests/test_misc.py rename to essential/picamera_library_modified/tests/test_misc.py diff --git a/picamera_library_modified/tests/test_record.py b/essential/picamera_library_modified/tests/test_record.py similarity index 100% rename from picamera_library_modified/tests/test_record.py rename to essential/picamera_library_modified/tests/test_record.py diff --git a/picamera_library_modified/tests/test_streams.py b/essential/picamera_library_modified/tests/test_streams.py similarity index 100% rename from picamera_library_modified/tests/test_streams.py rename to essential/picamera_library_modified/tests/test_streams.py diff --git a/picamera_library_modified/tests/verify.py b/essential/picamera_library_modified/tests/verify.py similarity index 100% rename from picamera_library_modified/tests/verify.py rename to essential/picamera_library_modified/tests/verify.py diff --git a/pygame_matplotlib/__init__.py b/essential/pygame_matplotlib/__init__.py similarity index 100% rename from pygame_matplotlib/__init__.py rename to essential/pygame_matplotlib/__init__.py diff --git a/pygame_matplotlib/backend_pygame.py b/essential/pygame_matplotlib/backend_pygame.py similarity index 100% rename from pygame_matplotlib/backend_pygame.py rename to essential/pygame_matplotlib/backend_pygame.py diff --git a/pygame_matplotlib/gui_window.py b/essential/pygame_matplotlib/gui_window.py similarity index 100% rename from pygame_matplotlib/gui_window.py rename to essential/pygame_matplotlib/gui_window.py diff --git a/scripts/root_crontab.sh b/essential/scripts/root_crontab.sh similarity index 100% rename from scripts/root_crontab.sh rename to essential/scripts/root_crontab.sh diff --git a/scripts/user_crontab.sh b/essential/scripts/user_crontab.sh similarity index 100% rename from scripts/user_crontab.sh rename to essential/scripts/user_crontab.sh diff --git a/syringe_pump_c_code/main.c b/essential/syringe_pump_c_code/main.c similarity index 100% rename from syringe_pump_c_code/main.c rename to essential/syringe_pump_c_code/main.c diff --git a/syringe_pump_c_code/main.py b/essential/syringe_pump_c_code/main.py similarity index 100% rename from syringe_pump_c_code/main.py rename to essential/syringe_pump_c_code/main.py diff --git a/syringe_pump_c_code/main.so b/essential/syringe_pump_c_code/main.so similarity index 100% rename from syringe_pump_c_code/main.so rename to essential/syringe_pump_c_code/main.so diff --git a/syringe_pump_c_code/readme.md b/essential/syringe_pump_c_code/readme.md similarity index 100% rename from syringe_pump_c_code/readme.md rename to essential/syringe_pump_c_code/readme.md diff --git a/treadmill/Bounce2-master (1).zip b/essential/treadmill/Bounce2-master (1).zip similarity index 100% rename from treadmill/Bounce2-master (1).zip rename to essential/treadmill/Bounce2-master (1).zip diff --git a/treadmill/Treadmill.ino b/essential/treadmill/Treadmill.ino similarity index 100% rename from treadmill/Treadmill.ino rename to essential/treadmill/Treadmill.ino diff --git a/treadmill/Treadmill_20200302.ino b/essential/treadmill/Treadmill_20200302.ino similarity index 100% rename from treadmill/Treadmill_20200302.ino rename to essential/treadmill/Treadmill_20200302.ino diff --git a/treadmill/Treadmill_20211112.ino b/essential/treadmill/Treadmill_20211112.ino similarity index 100% rename from treadmill/Treadmill_20211112.ino rename to essential/treadmill/Treadmill_20211112.ino diff --git a/treadmill/digitalWriteFast-master (1).zip b/essential/treadmill/digitalWriteFast-master (1).zip similarity index 100% rename from treadmill/digitalWriteFast-master (1).zip rename to essential/treadmill/digitalWriteFast-master (1).zip diff --git a/treadmill/readme.md b/essential/treadmill/readme.md similarity index 100% rename from treadmill/readme.md rename to essential/treadmill/readme.md diff --git a/treadmill/treadmill_current.ino b/essential/treadmill/treadmill_current.ino similarity index 100% rename from treadmill/treadmill_current.ino rename to essential/treadmill/treadmill_current.ino diff --git a/treadmill_distance.ino b/essential/treadmill/treadmill_distance.ino similarity index 100% rename from treadmill_distance.ino rename to essential/treadmill/treadmill_distance.ino diff --git a/treadmill_i2c.py b/essential/treadmill/treadmill_i2c.py similarity index 100% rename from treadmill_i2c.py rename to essential/treadmill/treadmill_i2c.py diff --git a/video_acquisition/README.md b/essential/video_acquisition/README.md similarity index 100% rename from video_acquisition/README.md rename to essential/video_acquisition/README.md diff --git a/video_acquisition/StartAcquisition_gpio.py b/essential/video_acquisition/StartAcquisition_gpio.py similarity index 100% rename from video_acquisition/StartAcquisition_gpio.py rename to essential/video_acquisition/StartAcquisition_gpio.py diff --git a/video_acquisition/VideoCapture.py b/essential/video_acquisition/VideoCapture.py similarity index 100% rename from video_acquisition/VideoCapture.py rename to essential/video_acquisition/VideoCapture.py diff --git a/video_acquisition/control_acquisition.py b/essential/video_acquisition/control_acquisition.py similarity index 100% rename from video_acquisition/control_acquisition.py rename to essential/video_acquisition/control_acquisition.py diff --git a/video_acquisition/killrecording.py b/essential/video_acquisition/killrecording.py similarity index 100% rename from video_acquisition/killrecording.py rename to essential/video_acquisition/killrecording.py diff --git a/video_acquisition/start_acquisition.py b/essential/video_acquisition/start_acquisition.py similarity index 100% rename from video_acquisition/start_acquisition.py rename to essential/video_acquisition/start_acquisition.py diff --git a/video_acquisition/start_acquisition_old.py b/essential/video_acquisition/start_acquisition_old.py similarity index 100% rename from video_acquisition/start_acquisition_old.py rename to essential/video_acquisition/start_acquisition_old.py diff --git a/start_preview.py b/essential/video_acquisition/start_preview.py similarity index 100% rename from start_preview.py rename to essential/video_acquisition/start_preview.py diff --git a/video_acquisition/stop_acquisition.sh b/essential/video_acquisition/stop_acquisition.sh similarity index 100% rename from video_acquisition/stop_acquisition.sh rename to essential/video_acquisition/stop_acquisition.sh diff --git a/stop_preview.sh b/essential/video_acquisition/stop_preview.sh similarity index 100% rename from stop_preview.sh rename to essential/video_acquisition/stop_preview.sh diff --git a/stop_video b/essential/video_acquisition/stop_video similarity index 100% rename from stop_video rename to essential/video_acquisition/stop_video diff --git a/visual_stimuli/readme.md b/essential/visual_stimuli/readme.md similarity index 100% rename from visual_stimuli/readme.md rename to essential/visual_stimuli/readme.md diff --git a/visual_stimuli/vstest.py b/essential/visual_stimuli/vstest.py similarity index 100% rename from visual_stimuli/vstest.py rename to essential/visual_stimuli/vstest.py diff --git a/visualstim.py b/essential/visualstim.py similarity index 100% rename from visualstim.py rename to essential/visualstim.py diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py deleted file mode 100644 index 5ddb9c1..0000000 --- a/headfixed_independent_reward_task.py +++ /dev/null @@ -1,463 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training task structure -description: - an updated test version of headfixed_task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class HeadfixedIndependentRewardTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.session_info["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.session_info["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["wait_for_choice"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'initiate'], - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.correct_trial_number = 0 - self.actual_trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.early_lick_error = False - self.initiate_error = False - self.cue_state_error = False - self.wrong_choice_error = True - self.multiple_choice_error = False - self.error_repeat = False - - self.pump_num = None - self.reward_size = None - self.current_reward = None - self.reward_check = False - self.reward_size_offset = self.session_info['reward_size_offset'] - - self.block_count = 0 - self.blocknumber = self.session_info["block_number"] - self.current_card = None - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - - self.treadmill = self.box.treadmill - - self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - self.distance_buffer = None - self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - # there can only be lick during the reward available state - # if lick detected prior to reward available state - # the trial will restart and transition to standby - if self.event_name is "left_entry" or self.event_name == "right_entry": - # print("EVENT NAME !!!!!! " + self.event_name) - if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": - pass - else: - self.early_lick_error = True - self.error_repeat = True - self.restart() - if self.state == "standby": - pass - elif self.state == "initiate": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.initiate_error = False - self.start_cue() - else: - self.initiate_error = True - elif self.state == "cue_state": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_cue: - self.cue_state_error = False - self.evaluate_reward() - else: - self.cue_state_error = True - elif self.state == "reward_available": - cue_state = self.current_card[0] - side_mice = None - if self.event_name == "left_entry": - side_mice = 'left' - self.left_poke_count += 1 - self.left_poke_count_list.append(self.left_poke_count) - self.timeline_left_poke.append(time.time()) - elif self.event_name == "right_entry": - side_mice = 'right' - self.right_poke_count += 1 - self.right_poke_count_list.append(self.right_poke_count) - self.timeline_right_poke.append(time.time()) - if side_mice: - self.side_mice_buffer = side_mice - if cue_state == 'all': - side_choice = side_mice - if side_choice == 'left': - self.pump_num = self.current_card[2][0] - self.reward_size = self.current_reward[0] - print("self.current_reward[0]: " + str(self.current_reward[0])) - elif side_choice == 'right': - self.pump_num = self.current_card[2][1] - self.reward_size = self.current_reward[1] - print("self.current_reward[0]: " + str(self.current_reward[1])) - elif cue_state == 'LED_L': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[0] - elif cue_state == 'LED_R': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[1] - print("!!!!!!!!CUE_STATE: " + str(cue_state)) - if side_mice == side_choice: # if the animal chose correctly - self.side_mice_buffer = side_mice - if side_mice == side_choice: # if the animal chose correctly - if self.lick_count == 0: # if this is the first lick - self.wrong_choice_error = False - self.reward_check = True - self.lick_count += 1 - self.restart() - elif self.side_mice_buffer: - if self.lick_count == 0: - self.wrong_choice_error = True - self.lick_count += 1 - self.restart() - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - if self.early_lick_error: - self.error_list.append("early_lick_error") - logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.early_lick_error = False - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.lick_count = 0 - self.side_mice_buffer = None - self.box.event_list.clear() - pass - - def enter_initiate(self): - # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes - # check error_repeat - logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) - self.check_cue('sound1') - self.trial_running = True - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) - print("EVENT NAME: " + str(self.box.event_list)) - self.cue_off('sound1') - if self.initiate_error: - self.error_list.append('initiate_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) - self.error_count += 1 - - def enter_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) - # turn on the cue according to the current card - self.check_cue(self.current_card[0]) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) - self.cue_off(self.current_card[0]) - if not self.early_lick_error: - if self.cue_state_error: - self.check_cue("sound2") - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - if self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('no_choice_error') - elif self.wrong_choice_error: - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('wrong_choice_error') - elif self.reward_check: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.pump.reward(self.pump_num, self.reward_size) - self.error_repeat = False - self.total_reward += 1 - self.reward_check = False - self.error_list.append('correct_trial') - self.pump_num = None - self.reward_size = None - self.wrong_choice_error = False - - - def check_cue(self, cue): - if cue == 'sound1': - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) - self.box.sound1.on() - if cue == 'sound2': - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) - self.box.sound2.blink(1, 0.1, 1) - elif cue == 'LED_L': - self.box.cueLED1.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) - elif cue == 'all': - self.box.cueLED1.on() - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) - - def cue_off(self, cue): - if cue == 'all': - self.box.cueLED1.off() - self.box.cueLED2.off() - elif cue == 'sound1': - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) - elif cue == 'sound2': - self.box.sound2.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) - elif cue == 'LED_L': - self.box.cueLED1.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) - - def get_distance(self): - try: - distance = self.treadmill.distance_cm - except Exception as e: - logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) - self.treadmill = self.box.treadmill - distance = self.treadmill.distance_cm - return distance - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - print(type(fig)) - - ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/behavbox_v2.py b/obsolete/behavbox_v2.py similarity index 100% rename from behavbox_v2.py rename to obsolete/behavbox_v2.py diff --git a/fake_session_info.py b/obsolete/fake_session_info.py similarity index 100% rename from fake_session_info.py rename to obsolete/fake_session_info.py diff --git a/headfixed2FC_task.py b/obsolete/headfixed2FC_task_old.py similarity index 100% rename from headfixed2FC_task.py rename to obsolete/headfixed2FC_task_old.py diff --git a/headfixed_task.py b/obsolete/headfixed_task_old.py similarity index 100% rename from headfixed_task.py rename to obsolete/headfixed_task_old.py diff --git a/lick_task.py b/obsolete/lick_task.py similarity index 100% rename from lick_task.py rename to obsolete/lick_task.py diff --git a/pump_task.py b/obsolete/pump_task.py similarity index 100% rename from pump_task.py rename to obsolete/pump_task.py diff --git a/record_run_test.py b/obsolete/record_run_test.py similarity index 100% rename from record_run_test.py rename to obsolete/record_run_test.py diff --git a/run_flip_task.py b/obsolete/run_flip_task.py similarity index 100% rename from run_flip_task.py rename to obsolete/run_flip_task.py diff --git a/run_headfixed2FC_task.py b/obsolete/run_headfixed2FC_task.py similarity index 100% rename from run_headfixed2FC_task.py rename to obsolete/run_headfixed2FC_task.py diff --git a/run_headfixed_task.py b/obsolete/run_headfixed_task.py similarity index 100% rename from run_headfixed_task.py rename to obsolete/run_headfixed_task.py diff --git a/run_lick_task.py b/obsolete/run_lick_task.py similarity index 100% rename from run_lick_task.py rename to obsolete/run_lick_task.py diff --git a/run_season_task.py b/obsolete/run_season_task.py similarity index 100% rename from run_season_task.py rename to obsolete/run_season_task.py diff --git a/run_soyoun_task.py b/obsolete/run_soyoun_task.py similarity index 100% rename from run_soyoun_task.py rename to obsolete/run_soyoun_task.py diff --git a/run_visualization_task.py b/obsolete/run_visualization_task.py similarity index 100% rename from run_visualization_task.py rename to obsolete/run_visualization_task.py diff --git a/run_walk_task.py b/obsolete/run_walk_task.py similarity index 100% rename from run_walk_task.py rename to obsolete/run_walk_task.py diff --git a/session_info_headfixed.py b/obsolete/session_info_headfixed.py similarity index 100% rename from session_info_headfixed.py rename to obsolete/session_info_headfixed.py diff --git a/session_info_headfixed2FC.py b/obsolete/session_info_headfixed2FC.py similarity index 100% rename from session_info_headfixed2FC.py rename to obsolete/session_info_headfixed2FC.py diff --git a/session_info_walk.py b/obsolete/session_info_walk.py similarity index 100% rename from session_info_walk.py rename to obsolete/session_info_walk.py diff --git a/soyoun_task.py b/obsolete/soyoun_task.py similarity index 100% rename from soyoun_task.py rename to obsolete/soyoun_task.py diff --git a/task_information_headfixed.py b/obsolete/task_information_headfixed.py similarity index 100% rename from task_information_headfixed.py rename to obsolete/task_information_headfixed.py diff --git a/task_information_headfixed2FC.py b/obsolete/task_information_headfixed2FC.py similarity index 100% rename from task_information_headfixed2FC.py rename to obsolete/task_information_headfixed2FC.py diff --git a/task_information_lick.py b/obsolete/task_information_lick.py similarity index 100% rename from task_information_lick.py rename to obsolete/task_information_lick.py diff --git a/task_information_phase_1.py b/obsolete/task_information_phase_1.py similarity index 100% rename from task_information_phase_1.py rename to obsolete/task_information_phase_1.py diff --git a/test_session_info.py b/obsolete/test_session_info.py similarity index 100% rename from test_session_info.py rename to obsolete/test_session_info.py diff --git a/testing_visualstim.py b/obsolete/testing_visualstim.py similarity index 100% rename from testing_visualstim.py rename to obsolete/testing_visualstim.py diff --git a/task_protocol/visualization_task.py b/obsolete/visualization_task.py similarity index 100% rename from task_protocol/visualization_task.py rename to obsolete/visualization_task.py diff --git a/walk_task.py b/obsolete/walk_task.py similarity index 100% rename from walk_task.py rename to obsolete/walk_task.py diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py deleted file mode 100644 index ebed007..0000000 --- a/run_headfixed_independent_reward_task.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env -S ipython3 -i -# run_headfixed2FC_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: run_headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training run task file -description: - an updated test version of run_headfixed_task.py - -""" -import random -import numpy as np -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from headfixed_independent_reward_task import HeadfixedIndependentRewardTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - from task_information_independent_reward import TaskInformation - task_information = TaskInformation() - # print("Imported task_information_headfixed: " + str(task_information.name)) - task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) - - - def cumsum_positive(input_list): - for index in range(len(input_list)): - if index == 0 and input_list[index] < 0: - input_list[index] = -input_list[index] - elif input_list[index] + input_list[index - 1] < 0: - input_list[index] = input_list[index] - input_list[index - 1] - else: - input_list[index] = input_list[index] + input_list[index - 1] - return input_list - - def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): - # initial reward (need to be random) - rewards_L = [1] - rewards_R = [1] - for a in np.arange(np.round(ntrials / change_point)): - temp = np.random.randn(change_point) * scale - rewards_L.append(cumsum_positive(temp) + offset) - temp = np.random.randn(change_point) * scale - rewards_R.append(cumsum_positive(temp) + offset) - rewards_L = np.hstack(rewards_L) - rewards_R = np.hstack(rewards_R) - # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') - reward_LR = [rewards_L, rewards_R] - reward_LR = np.transpose(np.array(reward_LR)) - reward_LR = reward_LR[0:ntrials, :] - # print(reward_LR) - return reward_LR - - def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only - session_start = random.uniform(0, period_width) - session_end = session_start + session_length - value_input = np.arange(session_start, session_end, increment) - - sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale - negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale - left_side_reward = np.random.normal(sine_output, deviation) - right_side_reward = np.random.normal(negative_sine_output, deviation) - reward_list = list(zip(left_side_reward, right_side_reward)) - return reward_list - - if session_info['phase'] == "independent_reward": - # from reward_distribution import generate_reward_trajectory - scale = session_info['independent_reward']['scale'] - offset = session_info['independent_reward']['offset'] - change_point = session_info['independent_reward']['change_point'] - ntrials = session_info['independent_reward']['ntrials'] - reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) - elif session_info['phase'] == "forced_choice": - reward_size = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - session_length = session_info["sine_reward"]["session_length"] - increment = session_info["sine_reward"]["increment"] - period_width = session_info["sine_reward"]["period_width"] - amplitude_offset = session_info["sine_reward"]["amplitude_offset"] - amplitude_scale = session_info["sine_reward"]["amplitude_scale"] - deviation = session_info["sine_reward"]["deviation"] - reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, - amplitude_scale, deviation, session_length) - first_trial_of_the_session = True - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info - t_end = time.time() + 60 * t_minute - while time.time() < t_end: # time check - if task.error_repeat: # error repeat check - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - print("Trial " + str(task.actual_trial_number) + " \n") - task.actual_trial_number += 1 - print("*******************************\n") - print("*error_repeat trial* \n" + - " - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - else: - if not first_trial_of_the_session: - print("reward_time_out: " + str(session_info["reward_timeout"])) - sleep(session_info["reward_timeout"]) - else: - first_trial_of_the_session = False - # setup the beginning of a new trial - task.error_count = 0 # reset the error count if previous trial is correct - print("Trial " + str(task.actual_trial_number) + " \n") - task.correct_trial_number += 1 - task.actual_trial_number += 1 - print("*******************************\n") - # acquire new reward contingency and cue association - task.current_card = task_information.draw_card(session_info['phase']) - if session_info['phase'] == "independent_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) - elif session_info['phase'] == "forced_choice": - task.current_reward = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] - logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + - ";current_reward_" + str(task.current_reward)[1:-1]) - print(" - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() \ No newline at end of file diff --git a/task_protocol/headfixed_task.py b/task_protocol/headfixed_task/headfixed_task.py similarity index 100% rename from task_protocol/headfixed_task.py rename to task_protocol/headfixed_task/headfixed_task.py diff --git a/task_protocol/run_headfixed_task.py b/task_protocol/headfixed_task/run_headfixed_task.py similarity index 100% rename from task_protocol/run_headfixed_task.py rename to task_protocol/headfixed_task/run_headfixed_task.py diff --git a/session_info_headfixed_independent_reward.py b/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py similarity index 100% rename from session_info_headfixed_independent_reward.py rename to task_protocol/headfixed_task/session_info_headfixed_independent_reward.py diff --git a/task_protocol/session_info_headfixed_task.py b/task_protocol/headfixed_task/session_info_headfixed_task.py similarity index 100% rename from task_protocol/session_info_headfixed_task.py rename to task_protocol/headfixed_task/session_info_headfixed_task.py diff --git a/task_protocol/task_information_headfixed.py b/task_protocol/headfixed_task/task_information_headfixed.py similarity index 100% rename from task_protocol/task_information_headfixed.py rename to task_protocol/headfixed_task/task_information_headfixed.py diff --git a/task_information_independent_reward.py b/task_protocol/headfixed_task/task_information_independent_reward.py similarity index 100% rename from task_information_independent_reward.py rename to task_protocol/headfixed_task/task_information_independent_reward.py diff --git a/task_protocol/kelly_record_task.py b/task_protocol/kelly_record_task.py deleted file mode 100755 index 1440cce..0000000 --- a/task_protocol/kelly_record_task.py +++ /dev/null @@ -1,58 +0,0 @@ -# Kelly recording task -# This task is designed for recording freely moving animal behavioral task - -import logging -from datetime import datetime -import os -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -# import behavbox_test -import behavbox -class KellyRecordTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - print(self.session_info) - - # initialize behavior box - # self.box = behavbox_test.BehavBoxTest(self.session_info) - self.box = behavbox.BehavBox(self.session_info) - def start_session(self): - print("Start recording video") - self.box.video_start() - - def end_session(self): - print("Stop recording video") - self.box.video_stop() diff --git a/task_protocol/kelly_task.py b/task_protocol/kelly_task.py deleted file mode 100755 index 73cae35..0000000 --- a/task_protocol/kelly_task.py +++ /dev/null @@ -1,181 +0,0 @@ -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class KellyTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - Timeout( - name="cue", - on_enter=["enter_cue"], - on_exit=["exit_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_start", "standby", "reward_available"], - ["active_poke", "reward_available", "cue"], - ["timeup", "cue", "standby"], - ] - - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = behavbox.Pump() - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - self.box.sound1.blink(0.5, 0.1, 1) - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - self.box.cueLED4.on() - self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - self.pump.reward("1", self.session_info["reward_size"]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - self.pump.reward("3", self.session_info["reward_size"]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() - self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/kelly_record_task.py b/task_protocol/kelly_task/kelly_record_task.py similarity index 100% rename from kelly_record_task.py rename to task_protocol/kelly_task/kelly_record_task.py diff --git a/kelly_task.py b/task_protocol/kelly_task/kelly_task.py similarity index 100% rename from kelly_task.py rename to task_protocol/kelly_task/kelly_task.py diff --git a/run_kelly_task.py b/task_protocol/kelly_task/run_kelly_task.py similarity index 100% rename from run_kelly_task.py rename to task_protocol/kelly_task/run_kelly_task.py diff --git a/run_record_task.py b/task_protocol/kelly_task/run_record_task.py similarity index 100% rename from run_record_task.py rename to task_protocol/kelly_task/run_record_task.py diff --git a/session_info_year-month-date.py b/task_protocol/kelly_task/session_info_year-month-date.py similarity index 100% rename from session_info_year-month-date.py rename to task_protocol/kelly_task/session_info_year-month-date.py diff --git a/task_protocol/lick_task.py b/task_protocol/lick_task.py deleted file mode 100644 index 4f69474..0000000 --- a/task_protocol/lick_task.py +++ /dev/null @@ -1,182 +0,0 @@ -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class LickTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - Timeout( - name="cue", - on_enter=["enter_cue"], - on_exit=["exit_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_start", "standby", "reward_available"], - ["active_poke", "reward_available", "cue"], - ["timeup", "cue", "standby"], - ] - - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - # self.box.sound1.blink(0.5, 0.1, 1) - # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - # self.box.cueLED4.on() - # self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - reward_size = "small" - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - self.pump.reward("1", self.session_info["reward_size"][reward_size]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - self.pump.reward("2", self.session_info["reward_size"][reward_size]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() - # self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/remi_self_admin_task.py b/task_protocol/remi_self_admin_task.py deleted file mode 100644 index 5b28f8e..0000000 --- a/task_protocol/remi_self_admin_task.py +++ /dev/null @@ -1,372 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - - -# remifentanil self-administration task - -# NOTE: THIS TASK WILL BE NEARLY IDENTICAL TO THE SUCROSE SA TASK, EXCEPT THE MOUSE WILL -# OBTAIN AN INTRAVENOUS INFUSION OF REMIFENTANIL INSTEAD OF SUCROSE -# I MOSTLY NEED ASSISTANCE WITH THE ivsa_syringe_pump class (which will presumably end up in the behavbox code, not this code) - -# python3: headfixed_task.py -""" -author: tian qiu -date: 2023-02-28 -name: remi_self_admin_task.py -goal: self administration task adpated via Mitch's instruction -description: - an updated test version of self_admin_Task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox -# import ivsa_syringe_pump # I will need to add the ivsa_syringe_pump class to the behavbox code - - -#######################ivsa_syringe_pump code below######################### -""" -class ivsa_syringe_pump(object,session_info): # changed this to syringe pump - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - self.syringe_pump = LED(23) - self.reward_list = [] - - # COMMENTS ON REWARD LOGIC# - # Syringe pump will be turned on depending on the weight of the mouse - # For a 30g mouse, the syringe pump will be on for 1 second - # For <30g mouse, the syringe pump will be on for <1s - # For >30g mouse, the syringe pump will be on for >1s - def reward(self): # prototype mouse weight equals 30 - infusion_duration = (self.session_info['mouse_weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial - self.syringe_pump.blink(infusion_duration, 0.1, - 1) # season's edit: this is a shorter implement without having a function - self.reward_list.append(("syringe_pump_reward", infusion_duration)) - logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) - # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration - -""" -# COMMENTS ON INJECT LOGIC# -# this code will turn on the syringe pump, sleep for 'infusion_duration', then turn off the syringe pump with a 2nd pulse -# def inject(self, duration): # season's' edit: a function requires the input - infusion duration -# self.on() -# sleep(duration) # season's' edit: a function requires the input - infusion duration -# self.off() -############################################################################ - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class RemiSelfAdminTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] - ['restart', 'reward_available', 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.lever_pressed_time = 0.0 - self.lever_press_interval = self.session_info["lever_press_interval"] - # self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False - self.reward_time_delay = self.session_info["reward_time_delay"] - self.reward_time_recent = time.time() - self.reward_pump = self.session_info["reward_pump"] - self.reward_size = self.session_info["reward_size"] - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - - # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - # self.distance_buffer = None - # self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - # for the reward function - self.syringe_pump = LED(23) - self.reward_list = [] - - def reward(self): # prototype mouse weight equals 30 - infusion_duration = (self.session_info['weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial - self.syringe_pump.blink(infusion_duration, 0.1, - 1) # season's edit: this is a shorter implement without having a function - self.reward_list.append(("syringe_pump_reward", infusion_duration)) - logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) - # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - if self.state == "standby": - pass - elif self.state == "reward_available": - if self.event_name == "reserved_rx1_pressed": - lever_pressed_time_temp = time.time() - lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time - if lever_pressed_dt >= self.lever_press_interval and (time.time() - self.reward_time_recent > self.reward_time_delay): - self.reward() - self.lever_pressed_time = lever_pressed_time_temp - self.reward_time_recent = time.time() - self.total_reward += 1 - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - # self.cue_off('all') - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - # if self.early_lick_error: - # self.error_list.append("early_lick_error") - # self.early_lick_error = False - self.lick_count = 0 - self.side_mice_buffer = None - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - # self.cue_off('all') - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.box.event_list.clear() - pass - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - self.trial_running = True - # self.reward_times_up = False - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - # self.cue_off('sound2') - # self.reward_times_up = True - self.pump.reward("vaccum", 0) - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/run_kelly_task.py b/task_protocol/run_kelly_task.py deleted file mode 100755 index 2c03e74..0000000 --- a/task_protocol/run_kelly_task.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from kelly_task import KellyTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - task_info_path = '/home/pi/experiment_info/kelly_task/session_info' - sys.path.insert(0, task_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - # initiate task object\ - task = KellyTask(name="fentanyl_task", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - sleep(10) - # loop over trials - for i in range(2): - logging.info(str("##############################\n" + - str(time.time())) + ", starting_trial, " + str(i) + - str("\n##############################")) - - task.trial_start() - - while task.trial_running: - task.run() - - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - pygame.quit() - - -# # exit because of error -# except (RuntimeError) as ex: -# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) -# # save dicts to disk -# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) -# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - - - - diff --git a/task_protocol/run_record_task.py b/task_protocol/run_record_task.py deleted file mode 100755 index 66c7e31..0000000 --- a/task_protocol/run_record_task.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -import logging -from datetime import datetime -import os -import logging.config -import socket -import importlib -import colorama -from colorama import Fore, Style -import scipy.io, pickle -from time import sleep - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from kelly_record_task import KellyRecordTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - # There should be a session_info module corresponding to this before running this file - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - task_info_path = '/home/pi/experiment_info/record_task/session_info' - sys.path.insert(0, task_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info[ - 'datetime'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # initiate task object\ - task = KellyRecordTask(name="fentanyl_task", session_info=session_info) - - # start session - print("start_session") - duration_buffer = 10 # it takes 8 seconds for the camera and the video_start function to be set up - duration = int(input("Enter the time in seconds: ")) + duration_buffer - task.start_session() - sleep(duration) - task.end_session() - dir_name = session_info['dir_name'] - basename = session_info['basename'] - file_name = dir_name + "/" + basename - base_dir = '/mnt/hd/' - hd_dir = base_dir + basename - - # Per Kelly's request, remove all the files except the video file from the hard drive -# print("Remove mat - ") -# os.system("rm -r " + hd_dir + "/*.mat") -# print("Remove pkl - ") -# os.system("rm -r " + hd_dir + "/*.pkl") -# print("Remove log -") -# os.system("rm -r " + hd_dir + "/*.log") - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - task.end_session() - # # save dicts to disk - # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - # # pygame.quit() - - -# exit because of error -except (RuntimeError) as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # # save dicts to disk - # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) diff --git a/task_protocol/run_remi_self_admin_task.py b/task_protocol/run_remi_self_admin_task.py deleted file mode 100644 index 5825a8e..0000000 --- a/task_protocol/run_remi_self_admin_task.py +++ /dev/null @@ -1,134 +0,0 @@ -#run_self_admin.task - -#!/usr/bin/env -S ipython3 -i -# run_self_admin_task.py -""" -author: tian qiu -date: 2023-02-28 -name: run_remi_self_admin_task.py -goal: running the self_admin_Task -description: - adapted from Mitch's run_self_admin_task.py - -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from remi_self_admin_task import RemiSelfAdminTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - - task = RemiSelfAdminTask(name="remi_self_admin_task", session_info=session_info) - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - for i in range(session_info['max_trial_number']): - print("Trial " + str(i) + "\n") - if time.time() >= t_end: - print("Times up, finishing up") - break - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() diff --git a/task_protocol/run_self_admin_task.py b/task_protocol/run_self_admin_task.py deleted file mode 100644 index cf52841..0000000 --- a/task_protocol/run_self_admin_task.py +++ /dev/null @@ -1,134 +0,0 @@ -#run_self_admin.task - -#!/usr/bin/env -S ipython3 -i -# run_self_admin_task.py -""" -author: tian qiu -date: 2023-01-25 -name: run_self_admin_task.py -goal: running the self_admin_Task -description: - adapted from Mitch's run_self_admin_task.py - -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from self_admin_task import SelfAdminTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - - task = SelfAdminTask(name="self_admin_task", session_info=session_info) - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - for i in range(session_info['max_trial_number']): - print("Trial " + str(i) + "\n") - if time.time() >= t_end: - print("Times up, finishing up") - break - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() diff --git a/task_protocol/self_admin_task.py b/task_protocol/self_admin_task.py deleted file mode 100644 index fec7a43..0000000 --- a/task_protocol/self_admin_task.py +++ /dev/null @@ -1,308 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu -date: 2023-01-26 -name: self_admin_Task.py -goal: self administration task adpated via Mitch's instruction -description: - an updated test version of self_admin_Task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class SelfAdminTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] - ['restart', 'reward_available', 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.lever_pressed_time = 0.0 - self.lever_press_interval = self.session_info["lever_press_interval"] - # self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False - self.reward_pump = self.session_info["reward_pump"] - self.reward_size = self.session_info["reward_size"] - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - - # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - # self.distance_buffer = None - # self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - if self.state == "standby": - pass - elif self.state == "reward_available": - if self.event_name == "reserved_rx1_pressed": - lever_pressed_time_temp = time.time() - lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time - if lever_pressed_dt >= self.lever_press_interval: - self.pump.reward(self.reward_pump, self.reward_size) - self.lever_pressed_time = lever_pressed_time_temp - self.total_reward += 1 - # self.active_press += 1 - # self.active_press_count_list.append(self.left_poke_count) - # self.timeline_active_press.append(time.time()) - # elif self.event_name == "reserved_rx2_pressed": - # - # self.inactive_press += 1 - # self.inactive_press_count_list.append(self.right_poke_count) - # self.timeline_inactive_press.append(time.time()) - - # Lick detection: - # if self.event_name == "left_IR_entry": - # self.left_poke_count += 1 - # self.left_poke_count_list.append(self.left_poke_count) - # self.timeline_left_poke.append(time.time()) - # self.lick_count += 1 - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - # self.cue_off('all') - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - # if self.early_lick_error: - # self.error_list.append("early_lick_error") - # self.early_lick_error = False - # self.lick_count = 0 - # self.side_mice_buffer = None - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.box.event_list.clear() - pass - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - self.trial_running = True - # self.reward_times_up = False - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - # self.cue_off('sound2') - # self.reward_times_up = True - self.pump.reward("vaccum", 0) - # if self.multiple_choice_error: - # logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) - # self.error_repeat = False - # self.error_list.append('multiple_choice_error') - # self.multiple_choice_error = False - # elif self.lick_count == 0: - # logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - # self.error_repeat = True - # self.error_list.append('no_choice_error') - # self.lick_count = 0 - # self.reward_time_start = None - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/remi_self_admin_task.py b/task_protocol/self_admin_task/remi_self_admin_task.py similarity index 100% rename from remi_self_admin_task.py rename to task_protocol/self_admin_task/remi_self_admin_task.py diff --git a/run_remi_self_admin_task.py b/task_protocol/self_admin_task/run_remi_self_admin_task.py similarity index 100% rename from run_remi_self_admin_task.py rename to task_protocol/self_admin_task/run_remi_self_admin_task.py diff --git a/run_self_admin_task.py b/task_protocol/self_admin_task/run_self_admin_task.py similarity index 100% rename from run_self_admin_task.py rename to task_protocol/self_admin_task/run_self_admin_task.py diff --git a/self_admin_task.py b/task_protocol/self_admin_task/self_admin_task.py similarity index 100% rename from self_admin_task.py rename to task_protocol/self_admin_task/self_admin_task.py diff --git a/session_info_self_admin.py b/task_protocol/self_admin_task/session_info_self_admin.py similarity index 100% rename from session_info_self_admin.py rename to task_protocol/self_admin_task/session_info_self_admin.py diff --git a/task_protocol/session_info_headfixed_independent_reward.py b/task_protocol/session_info_headfixed_independent_reward.py deleted file mode 100644 index 1a1b2aa..0000000 --- a/task_protocol/session_info_headfixed_independent_reward.py +++ /dev/null @@ -1,123 +0,0 @@ -from datetime import datetime -import os -import pysistence, collections -import socket -import pandas as pd -import numpy as np - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -# session_info['basedir'] = '/home/pi/video' -session_info['weight'] = 0.0 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() -session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts - -session_info['config'] = 'headfixed2FC' - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info["lick_threshold"] = 1 -# visual stimulus -session_info["visual_stimulus"] = False - -session_info['config'] = 'headfixed2FC' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True -session_info['phase'] = 'independent_reward' # 'forced_choice', 'sine_reward' - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_cue'] = 5 # cm - session_info['treadmill_setup']['distance_initiation'] = 10 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info['cue'] = ['LED_L', 'LED_R', 'all'] -# session_info['state'] = ['block1', 'block2'] # -session_info['choice'] = ['right', 'left'] # lick port -session_info['air_duration'] = 0 -session_info["vacuum_duration"] = 1 - -""" solenoid calibration information configuration """ - -solenoid_coeff = None -def get_coefficient(): - df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") - pump_coefficient = {} - - for pump_num in range(1, 5): - df_pump = df_calibration[df_calibration['pump_number'] == pump_num] - mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) - on_time = df_pump['on_time'] - - fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first - pump_coefficient[str(pump_num)] = fit_calibration - return pump_coefficient - -try: - solenoid_coeff = get_coefficient() -except Exception as e: - print(e) - -session_info["calibration_coefficient"] = {} - -if solenoid_coeff: - session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] - session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] - session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] - session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] -else: - print("No coefficients, generate the default") - # solenoid valve linear fit coefficient for each pump - session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first - session_info["calibration_coefficient"]['2'] = [0.13, 0] - session_info["calibration_coefficient"]['3'] = [0.13, 0.0] - session_info["calibration_coefficient"]['4'] = [0.13, 0.0] - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['wait_for_choice'] = 60 -session_info['reward_timeout'] = 1 -session_info["punishment_timeout"] = 3 - -session_info["key_reward_amount"] = 2 -session_info['reward_size_offset'] = 2 - -if session_info['phase'] == "forced_choice": - session_info['reward_size'] = (10, 10) -elif session_info["phase"] == 'independent_reward': - session_info['independent_reward'] = {} - session_info['independent_reward']['scale'] = 0.5 - session_info['independent_reward']['offset'] = 3.0 - session_info['independent_reward']['change_point'] = 20 - session_info['independent_reward']['ntrials'] = 1000 -elif session_info["phase"] == 'sine_reward': - session_info["sine_reward"] = {} - session_info["sine_reward"]["increment"] = 1 - session_info["sine_reward"]["period_width"] = 40 - session_info["sine_reward"]["amplitude_offset"] = 2 - session_info["sine_reward"]["amplitude_scale"] = 3 - session_info["sine_reward"]["deviation"] = 0 - -session_info['consecutive_control'] = False -if session_info['consecutive_control']: - session_info['consecutive_max'] = 3 - diff --git a/task_protocol/session_info_self_admin.py b/task_protocol/session_info_self_admin.py deleted file mode 100644 index 340fd91..0000000 --- a/task_protocol/session_info_self_admin.py +++ /dev/null @@ -1,66 +0,0 @@ -# session_info_self_admin.py - -# put all of your mouse and session info in here - -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' - -session_info['weight'] = 32.18 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -# session_info['config'] = 'freely_moving_v1' -session_info['config'] = 'self_admin' - -session_info['max_trial_number'] = 100 - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters -session_info["lick_threshold"] = 2 -# visual stimulus -session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', -# '/home/pi/second_grating.dat'] -# session_info['vis_raws'] = [] - -# task related information - -session_info['config'] = 'headfixed_walk' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 10 # cm - session_info['treadmill_setup']['distance_cue'] = 25 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info["reward_pump"] = '1' -session_info['reward_size'] = 5 - - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['reward_timeout'] = 60 -# session_info["punishment_timeout"] = 1 diff --git a/task_protocol/session_info_year-month-date.py b/task_protocol/session_info_year-month-date.py deleted file mode 100755 index 5abf3e8..0000000 --- a/task_protocol/session_info_year-month-date.py +++ /dev/null @@ -1,65 +0,0 @@ -# put all of your mouse and session info in here -import random -from datetime import datetime -import os -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] -# session_info['trainingPhase'] = 4 -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -# session_info['basedir'] = '/home/pi/video' -session_info['weight'] = 32.18 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -# session_info['config'] = 'freely_moving_v1' -session_info['experiment_setup'] = 'head_fixed' -session_info['treadmill'] = True -session_info['treadmill_setup'] = {} -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 5 # cm - session_info['treadmill_setup']['distance_short'] = 7 # cm - session_info['treadmill_setup']['distance_long'] = 30 # cm - -# behavior parameters -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['reward_timeout'] = 5 -session_info["reward_wait"] = 5 -session_info["punishment_timeout"] = 0 - -# error repeat -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_repeat_max'] = 3 - -# reward parameters -# session_info['reward_size'] = 10 # in microliters -session_info['reward_size'] = {'small': 5, 'large': 10} # in microliters - -# visual stimulus -session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.dat', -# '/home/pi/gratings/second_grating.dat'] -session_info['vis_gratings'] = [] -session_info['vis_raws'] = [] - -# define block_duration and initial block to start the session -session_info['block_duration'] = 2 # each block has this amount of repetition -session_info['block_variety'] = 2 -if session_info['block_variety'] > 1: - initial_block = 1 diff --git a/task_protocol/task_information_independent_reward.py b/task_protocol/task_information_independent_reward.py deleted file mode 100644 index 1d88dc7..0000000 --- a/task_protocol/task_information_independent_reward.py +++ /dev/null @@ -1,27 +0,0 @@ -import random - - -class TaskInformation(object): - def __init__(self, **kwargs): - self.name = "model_based_reinforcement_learning_task" - self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] - - def draw_card(self, phase="independent_reward"): - row_start = 0 - row_end = len(self.deck)-1 - if phase == 'independent_reward': - pass - elif phase == 'forced_choice': - row_end = 1 - elif phase == 'free_choice': - row_start = 2 - elif phase == 'forced_choice_left': - row_end = 0 - elif phase == 'forced_choice_right': - row_start = 1 - row_end = 1 - card = self.deck[random.randint(row_start, row_end)] - return card - -# print(TaskInformation().draw_card()) diff --git a/treadmill_20211115.ino b/treadmill_20211115.ino deleted file mode 100644 index 31e5267..0000000 --- a/treadmill_20211115.ino +++ /dev/null @@ -1,145 +0,0 @@ -// when the treadmil encoder is located in the front -// include rev output for stablity -//#include -#include -#define VERSION "20211112" -// ===== VERSIONS ====== -#define MAXSPEED 1000.0f // maximum speed for dac out (mm/sec) -#define MAXDACVOLTS 2.5f // DAC ouput voltage at maximum speed -#define MAXDACCNTS 4095.0f // maximum dac value -//float maxDACval = MAXDACVOLTS * MAXDACCNTS / 3.3; // limit dac output to max allowed -float maxDACval = MAXDACVOLTS * MAXDACCNTS / 3.3 / 2; // limit dac output to max allowed // JR edit 5/28/19 make in both directions -#define encAPin 0 -#define encBPin 1 -#define dacPin A14 -//#define idxPin 2 // not use d here - -// counts per rotation of treadmill encoder wheel -// 200 counts per rev -// 1.03" per rev -// so - 1.03 * 25.4 * pi / 200 /1000 = microns/cnt -#define MM_PER_COUNT 410950 // actually 1/10^6mm per count since we divide by usecs -#define DIST_PER_COUNT ((float)MM_PER_COUNT/1000000.0) -//(float)0.41095 -#define SPEED_TIMEOUT 50000 // if we don't move in this many microseconds assume we are stopped -static float runSpeed = 0; -static float lastSpeed = 0; -volatile uint32_t lastUsecs; -volatile uint32_t thisUsecs; -volatile uint32_t encoderUsecs; -volatile float distance = 0; -int counts = 0; // net count - -int countAdj = 0; // 0-250 and 0-50 for negative 50-250 for positive -//int rev = 0;//count revolution -#define FW 1 -#define BW -1 -int dir = FW; -// ------------------------------------------ -// interrupt routine for ENCODER_A rising edge -// --------------------------------------------- -void encoderInt() -{ - int ENCA = digitalRead(encAPin); // always update output - int ENCB = digitalRead(encBPin); - if (ENCA == ENCB ) // figure out the direction - { - Serial.print('F'); - dir = FW; - thisUsecs = micros(); - encoderUsecs = thisUsecs - lastUsecs; - lastUsecs = thisUsecs; - runSpeed = (float)MM_PER_COUNT / encoderUsecs; - distance += DIST_PER_COUNT; - counts += 1; - } - else - { - Serial.print('B'); - dir = BW; - thisUsecs = micros(); - encoderUsecs = thisUsecs - lastUsecs; - lastUsecs = thisUsecs; - runSpeed = (float)MM_PER_COUNT / encoderUsecs* -1; - distance -= DIST_PER_COUNT; - counts -= 1; - } -} -void setup() -{ - //Serial.begin(115200); - //Serial2.begin(115200); - Serial.begin(19200); - Serial2.begin(19200); - //while ( !Serial); // if no serial USB is connected, may need to comment this out - pinMode(encAPin, INPUT_PULLUP); // sets the digital pin as input - pinMode(encBPin, INPUT_PULLUP); // sets the digital pin as input - analogWriteResolution(12); - - Serial.print("Treadmill Interface V: "); - Serial.println(VERSION); - Serial.println("distance,speed"); - Serial.println(maxDACval); - - Wire.begin(8); - Wire.setSDA(18); - Wire.setSCL(19); - Wire.onRequest(sendData); - - lastUsecs = micros(); - attachInterrupt(encAPin, encoderInt, RISING); // check encoder every A pin rising edge -} -void loop() -{ - noInterrupts(); - uint32_t now = micros(); - uint32_t lastU = lastUsecs; - if ( (now > lastU) && ((now - lastU) > SPEED_TIMEOUT) ) - { // now should never be < lastUsecs, but sometiems it is - // I question if noInterupts works - runSpeed = 0; - } - interrupts(); - if ( runSpeed != lastSpeed ) - { - lastSpeed = runSpeed; - // float dacval = runSpeed / MAXSPEED * maxDACval; - float dacval = (.5 + runSpeed / MAXSPEED) * maxDACval; - if ( dacval < 0 ) dacval = 0; - if ( dacval > maxDACval) dacval = maxDACval; -// Serial.print(distance); - countAdj = counts+50; - if (countAdj>250) - { - counts=1; - countAdj = 51; - } - if (counts<-50){ - counts = -50; - countAdj = 0; - } - Serial.print(countAdj); - Serial.print(","); - Serial.println(runSpeed); - int a=(uint16_t)dacval-730; - analogWrite(A14, (uint16_t) dacval); - Serial.println("iiiiiiiiiiiiiii"); - Serial.println(a); -// Wire.onRequest(sendData); //for debug purpose -// Wire.write(counts); //for transmitting the count as data - Serial2.write(counts);//Serial2.write(a); - } -// Serial.println(distance);d -} - -void sendData() -{ -// long Dst = distance; -// long Spd = runSpeed; -// long data = (Dst << 8) | Spd; -// Wire.write(data); -// Serial.println(data); - Wire.write(counts); //for transmitting the count as data -// Wire.write("iiiiiiiiiiiiiii"); -// Wire.write(a); -} \ No newline at end of file diff --git a/visualization_task.py b/visualization_task.py deleted file mode 100644 index d22f21a..0000000 --- a/visualization_task.py +++ /dev/null @@ -1,182 +0,0 @@ -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class VisualizationTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - # if kwargs.get("session_info", None) is None: - # print( - # Fore.RED - # + Style.BRIGHT - # + "Warning: no session_info supplied; making fake one" - # + Style.RESET_ALL - # ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - # else: - # self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - Timeout( - name="cue", - on_enter=["enter_cue"], - on_exit=["exit_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_start", "standby", "reward_available"], - ["active_poke", "reward_available", "cue"], - ["timeup", "cue", "standby"], - ] - - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - # self.pump = behavbox.Pump() - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - self.box.check_plot() - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - # self.box.sound1.blink(0.5, 0.1, 1) - # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - # self.box.cueLED4.on() - # self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - # self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - # self.pump.reward("1", self.session_info["reward_size"]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - # self.pump.reward("3", self.session_info["reward_size"]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - # self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - # self.box.video_stop() - # self.box.visualstim.myscreen.close() \ No newline at end of file From 873d24262682898ee8a68b54e39e81059679e3ee Mon Sep 17 00:00:00 2001 From: season Date: Thu, 29 Jun 2023 15:46:06 -0400 Subject: [PATCH 078/135] __init__.py in every directory --- debug/__init__.py | 1 + environment/__init__.py | 1 + essential/ADC/__init__.py | 1 + essential/RTC/__init__.py | 1 + essential/__init__.py | 1 + essential/camera/__init__.py | 1 + essential/scripts/__init__.py | 1 + essential/treadmill/__init__.py | 1 + essential/video_acquisition/__init__.py | 1 + essential/visual_stimuli/__init__.py | 1 + task_protocol/EFO_task/__init__.py | 1 + task_protocol/__init__.py | 1 + task_protocol/headfixed_task/__init__.py | 1 + task_protocol/kelly_task/__init__.py | 1 + task_protocol/self_admin_task/__init__.py | 1 + 15 files changed, 15 insertions(+) create mode 100644 debug/__init__.py create mode 100644 environment/__init__.py create mode 100644 essential/ADC/__init__.py create mode 100644 essential/RTC/__init__.py create mode 100644 essential/__init__.py create mode 100644 essential/camera/__init__.py create mode 100644 essential/scripts/__init__.py create mode 100644 essential/treadmill/__init__.py create mode 100644 essential/video_acquisition/__init__.py create mode 100644 essential/visual_stimuli/__init__.py create mode 100644 task_protocol/EFO_task/__init__.py create mode 100644 task_protocol/__init__.py create mode 100644 task_protocol/headfixed_task/__init__.py create mode 100644 task_protocol/kelly_task/__init__.py create mode 100644 task_protocol/self_admin_task/__init__.py diff --git a/debug/__init__.py b/debug/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/debug/__init__.py @@ -0,0 +1 @@ + diff --git a/environment/__init__.py b/environment/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/environment/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/ADC/__init__.py b/essential/ADC/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/ADC/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/RTC/__init__.py b/essential/RTC/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/RTC/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/__init__.py b/essential/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/camera/__init__.py b/essential/camera/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/camera/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/scripts/__init__.py b/essential/scripts/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/scripts/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/treadmill/__init__.py b/essential/treadmill/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/treadmill/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/video_acquisition/__init__.py b/essential/video_acquisition/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/video_acquisition/__init__.py @@ -0,0 +1 @@ + diff --git a/essential/visual_stimuli/__init__.py b/essential/visual_stimuli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/essential/visual_stimuli/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/EFO_task/__init__.py b/task_protocol/EFO_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/EFO_task/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/__init__.py b/task_protocol/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/headfixed_task/__init__.py b/task_protocol/headfixed_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/headfixed_task/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/kelly_task/__init__.py b/task_protocol/kelly_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/kelly_task/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/self_admin_task/__init__.py b/task_protocol/self_admin_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/self_admin_task/__init__.py @@ -0,0 +1 @@ + From 7339ad22af900804e97a73a4f2fc694ae172b9de Mon Sep 17 00:00:00 2001 From: season Date: Tue, 11 Jul 2023 17:26:00 -0400 Subject: [PATCH 079/135] reorganization update: import essential --- task_protocol/headfixed_task/headfixed_task.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/task_protocol/headfixed_task/headfixed_task.py b/task_protocol/headfixed_task/headfixed_task.py index 0953d1b..b74d802 100644 --- a/task_protocol/headfixed_task/headfixed_task.py +++ b/task_protocol/headfixed_task/headfixed_task.py @@ -36,7 +36,8 @@ } ) # all modules above this line will have logging disabled - +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') import behavbox From d65cbf6a3a271bb8ddd0290f443b9b0a7e58e6cf Mon Sep 17 00:00:00 2001 From: season Date: Tue, 11 Jul 2023 17:39:55 -0400 Subject: [PATCH 080/135] ADS1x15 --- essential/{ADC => }/ADS1x15.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename essential/{ADC => }/ADS1x15.py (100%) diff --git a/essential/ADC/ADS1x15.py b/essential/ADS1x15.py similarity index 100% rename from essential/ADC/ADS1x15.py rename to essential/ADS1x15.py From 2fecc20508d370a11fc672ca783eb98a85dc68c7 Mon Sep 17 00:00:00 2001 From: season Date: Tue, 11 Jul 2023 18:16:49 -0400 Subject: [PATCH 081/135] updating all the tasks with new organization --- task_protocol/EFO_task/EFO_task.py | 4 +++- task_protocol/kelly_task/kelly_record_task.py | 4 +++- task_protocol/kelly_task/kelly_task.py | 4 +++- task_protocol/self_admin_task/remi_self_admin_task.py | 4 +++- task_protocol/self_admin_task/self_admin_task.py | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/task_protocol/EFO_task/EFO_task.py b/task_protocol/EFO_task/EFO_task.py index 4eaddd7..5b86cde 100644 --- a/task_protocol/EFO_task/EFO_task.py +++ b/task_protocol/EFO_task/EFO_task.py @@ -26,7 +26,9 @@ } ) # all modules above this line will have logging disabled - +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') import behavbox # adding timing capability to the state machine diff --git a/task_protocol/kelly_task/kelly_record_task.py b/task_protocol/kelly_task/kelly_record_task.py index 1440cce..a149eb8 100755 --- a/task_protocol/kelly_task/kelly_record_task.py +++ b/task_protocol/kelly_task/kelly_record_task.py @@ -15,7 +15,9 @@ ) # all modules above this line will have logging disabled -# import behavbox_test +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') import behavbox class KellyRecordTask(object): def __init__(self, **kwargs): # name and session_info should be provided as kwargs diff --git a/task_protocol/kelly_task/kelly_task.py b/task_protocol/kelly_task/kelly_task.py index 73cae35..f3ce1f1 100755 --- a/task_protocol/kelly_task/kelly_task.py +++ b/task_protocol/kelly_task/kelly_task.py @@ -17,7 +17,9 @@ } ) # all modules above this line will have logging disabled - +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') import behavbox # adding timing capability to the state machine diff --git a/task_protocol/self_admin_task/remi_self_admin_task.py b/task_protocol/self_admin_task/remi_self_admin_task.py index 5b28f8e..76db1a1 100644 --- a/task_protocol/self_admin_task/remi_self_admin_task.py +++ b/task_protocol/self_admin_task/remi_self_admin_task.py @@ -46,7 +46,9 @@ } ) # all modules above this line will have logging disabled - +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') import behavbox # import ivsa_syringe_pump # I will need to add the ivsa_syringe_pump class to the behavbox code diff --git a/task_protocol/self_admin_task/self_admin_task.py b/task_protocol/self_admin_task/self_admin_task.py index fec7a43..1f04a15 100644 --- a/task_protocol/self_admin_task/self_admin_task.py +++ b/task_protocol/self_admin_task/self_admin_task.py @@ -36,7 +36,9 @@ } ) # all modules above this line will have logging disabled - +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') import behavbox From 92c43df452829e51629df685b5dc1c477a4f69df Mon Sep 17 00:00:00 2001 From: season Date: Tue, 11 Jul 2023 18:22:46 -0400 Subject: [PATCH 082/135] update the debug directory with new reorganization --- debug/pump_debug.py | 3 +++ debug/syringe_pump_pygame_debug.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/debug/pump_debug.py b/debug/pump_debug.py index 946f369..dc0beda 100755 --- a/debug/pump_debug.py +++ b/debug/pump_debug.py @@ -1,6 +1,9 @@ # pump_debug.py: it's for testing the pump class and the pump itself import sys import time +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') from behavbox import Pump # from fake_session_info import fake_session_info side = str(sys.argv[1]) diff --git a/debug/syringe_pump_pygame_debug.py b/debug/syringe_pump_pygame_debug.py index b23775b..14cfaed 100644 --- a/debug/syringe_pump_pygame_debug.py +++ b/debug/syringe_pump_pygame_debug.py @@ -1,4 +1,7 @@ import pygame +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') from behavbox import Pump import numpy as np From 7a5dc3d11a3dc915df249dbb04b35bb9cfff2fc7 Mon Sep 17 00:00:00 2001 From: "Tian \"Season\" Qiu" Date: Tue, 11 Jul 2023 18:35:51 -0400 Subject: [PATCH 083/135] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 70ab553..9f376d7 100755 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ # RPi4_behavior_boxes BehavBox is a system with Raspberry Pi computers that is sufficient to provide a foundation of constructing animal behavior training and experiment. + +# Quick Start +in task_protocol, you could find all the task example. Each task has it's run file, task file, task information file and an example of session_information file. + +To start running a task file, you need to first create a session_information pathway and session_information file in a path (suggested) in the home directory and outside of the git repo since you would have to configure and changes the file everyday for training purposes. + +After configure the session_information path and input the appropriate path leading to the exact session_information of the date, you could do python3 run_x_task.py to start running the task. From f135ef14faed2672c5573636cb83815381bf04d9 Mon Sep 17 00:00:00 2001 From: season Date: Wed, 12 Jul 2023 12:30:41 -0400 Subject: [PATCH 084/135] README update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f376d7..c276b30 100755 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ BehavBox is a system with Raspberry Pi computers that is sufficient to provide a foundation of constructing animal behavior training and experiment. # Quick Start -in task_protocol, you could find all the task example. Each task has it's run file, task file, task information file and an example of session_information file. +in task_protocol, you could find all the task examples. Each task has its run file, task file, task information file and an example of session_information file. To start running a task file, you need to first create a session_information pathway and session_information file in a path (suggested) in the home directory and outside of the git repo since you would have to configure and changes the file everyday for training purposes. From 5e58e55c0bfae32c58043c7f70e5c93383e2a836 Mon Sep 17 00:00:00 2001 From: season Date: Wed, 12 Jul 2023 12:51:47 -0400 Subject: [PATCH 085/135] README update --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index c276b30..9898f52 100755 --- a/README.md +++ b/README.md @@ -7,3 +7,19 @@ in task_protocol, you could find all the task examples. Each task has its run fi To start running a task file, you need to first create a session_information pathway and session_information file in a path (suggested) in the home directory and outside of the git repo since you would have to configure and changes the file everyday for training purposes. After configure the session_information path and input the appropriate path leading to the exact session_information of the date, you could do python3 run_x_task.py to start running the task. + +# Example +To start running the task `headfixed_task.py` +1. Setup and configure the 'session_information_year-month-date.py' file: +first, create the experimental_data directory in the home directory path: +`$ mkdir ~/experimental_data`\ +second, create all the necessary subdirectories for the specific task: +`$ mkdir ~/experimental_data/headfixed_task`\ +`$ mkdir ~/experimental_data/headfixed_task/session_info`\ +then, copy the session_information example file corresponding to the specific task: +`$ cp ~/RPi4_behavbior_boxes/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py ~/experimental_data/headfixed_task/session_info`\ +2. Modify the newly created session_info file: +`$ sudo nano ~/experimental_data/headfixed_task/session_info_headfixed_independent_reward.py` +**KEEP IN MIND** after configuring the session_information to manually change the field manual date to the day of the experiment session (the day of the experiment), and the name of the session_info file from `session_info_headfixed_independent_reward.py` to `session_info_year-month-date.py`. Otherwise, an error would occur when running the task file. +3. After setting up the session_info file, run the task: +`$ python3 ~/RPi4_behavior_boxes/task_protocol/headfixed_task/run_headfixed_task.py` \ No newline at end of file From 944f0a02e7e2e1648f85c76cb54da46c673d25bf Mon Sep 17 00:00:00 2001 From: season Date: Wed, 12 Jul 2023 12:58:13 -0400 Subject: [PATCH 086/135] README update --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9898f52..c01f1ff 100755 --- a/README.md +++ b/README.md @@ -11,15 +11,15 @@ After configure the session_information path and input the appropriate path lead # Example To start running the task `headfixed_task.py` 1. Setup and configure the 'session_information_year-month-date.py' file: -first, create the experimental_data directory in the home directory path: -`$ mkdir ~/experimental_data`\ -second, create all the necessary subdirectories for the specific task: -`$ mkdir ~/experimental_data/headfixed_task`\ -`$ mkdir ~/experimental_data/headfixed_task/session_info`\ -then, copy the session_information example file corresponding to the specific task: -`$ cp ~/RPi4_behavbior_boxes/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py ~/experimental_data/headfixed_task/session_info`\ -2. Modify the newly created session_info file: -`$ sudo nano ~/experimental_data/headfixed_task/session_info_headfixed_independent_reward.py` +first, create the experimental_data directory in the home directory path:
+`$ mkdir ~/experimental_data`
+second, create all the necessary subdirectories for the specific task:
+`$ mkdir ~/experimental_data/headfixed_task`
+`$ mkdir ~/experimental_data/headfixed_task/session_info`
+then, copy the session_information example file corresponding to the specific task:
+`$ cp ~/RPi4_behavbior_boxes/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py ~/experimental_data/headfixed_task/session_info`
+2. Modify the newly created session_info file:
+`$ sudo nano ~/experimental_data/headfixed_task/session_info_headfixed_independent_reward.py`
**KEEP IN MIND** after configuring the session_information to manually change the field manual date to the day of the experiment session (the day of the experiment), and the name of the session_info file from `session_info_headfixed_independent_reward.py` to `session_info_year-month-date.py`. Otherwise, an error would occur when running the task file. -3. After setting up the session_info file, run the task: +3. After setting up the session_info file, run the task:
`$ python3 ~/RPi4_behavior_boxes/task_protocol/headfixed_task/run_headfixed_task.py` \ No newline at end of file From 11c31d4d898249b7753b59e8e7c1908f4c4adf3f Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Wed, 12 Jul 2023 14:09:25 -0400 Subject: [PATCH 087/135] adding foraging reward condition adding foraging reward condition --- headfixed_independent_reward_task.py | 8 ++++- run_headfixed_independent_reward_task.py | 33 ++++++++++++++++++-- session_info_headfixed_independent_reward.py | 6 ++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/headfixed_independent_reward_task.py b/headfixed_independent_reward_task.py index 5ddb9c1..844fef5 100644 --- a/headfixed_independent_reward_task.py +++ b/headfixed_independent_reward_task.py @@ -5,7 +5,7 @@ name: headfixed2FC_task.py goal: model_free reinforcement learning behavioral training task structure description: - an updated test version of headfixed_task.py + an updated test version of headfixed_task.py & add foraging reward condition """ import importlib @@ -152,6 +152,10 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa self.distance_buffer = None self.distance_diff = 0 + # for foragaing parameters + self.side_choice = None # whether free choice is left or right + self.cue_state = None + # for refining the lick detection self.lick_count = 0 self.side_mice_buffer = None @@ -215,6 +219,7 @@ def run(self): self.timeline_right_poke.append(time.time()) if side_mice: self.side_mice_buffer = side_mice + self.cue_state = cue_state # cue state for foraging if cue_state == 'all': side_choice = side_mice if side_choice == 'left': @@ -238,6 +243,7 @@ def run(self): self.side_mice_buffer = side_mice if side_mice == side_choice: # if the animal chose correctly if self.lick_count == 0: # if this is the first lick + self.side_choice = side_choice # foraging task self.wrong_choice_error = False self.reward_check = True self.lick_count += 1 diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index ebed007..3203830 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -3,10 +3,10 @@ """ author: tian qiu & Soyoun Kim date: 2023-02-16 -name: run_headfixed2FC_task.py +name: run_headfixed_independent_reward_task.py goal: model_free reinforcement learning behavioral training run task file description: - an updated test version of run_headfixed_task.py + an updated test version of run_headfixed_task.py & add foraging task """ import random @@ -55,6 +55,7 @@ datestr = datetime.now().strftime("%Y-%m-%d") timestr = datetime.now().strftime('%H%M%S') full_module_name = 'session_info_' + datestr + import sys session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' @@ -152,6 +153,13 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal deviation = session_info["sine_reward"]["deviation"] reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length) + elif session_info['phase'] == 'foraging_reward': + offset = session_info['foraging_reward']['offset'] + max_reward = session_info['foraging_reward']['max_reward'] + increment = session_info['foraging_reward']['increment'] + reward_distribution[0] = offset + reward_distribution[1] = offset + first_trial_of_the_session = True # # you can change various parameters if you want @@ -199,7 +207,26 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal task.current_reward = session_info['reward_size'] elif session_info['phase'] == "sine_reward": task.current_reward = reward_distribution_list[task.correct_trial_number] - logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + + elif session_info['phase'] == 'foraging_reward': + if task.cue_state == 'all': + if task.side_choice == 'left': + reward_distribution[0] = reward_distribution[0] - increment + reward_distribution[1] = reward_distribution[1] + increment + if reward_distribution[0]< 0: + reward_distribution[0] = 0 + if reward_distribution[1]> max_reward: + reward_distribution[1] = max_reward + elif task.side_choice == 'right': + reward_distribution[1] = reward_distribution[1] - increment + reward_distribution[0] = reward_distribution[0] + increment + if reward_distribution[1] < 0: + reward_distribution[1] = 0 + if reward_distribution[0] > max_reward: + reward_distribution[0] = max_reward + + task.current_reward = reward_distribution + + logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)[1:-1]) print(" - Current card condition: \n" + "*******************************\n" + diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 1a1b2aa..1e73095 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -116,6 +116,12 @@ def get_coefficient(): session_info["sine_reward"]["amplitude_offset"] = 2 session_info["sine_reward"]["amplitude_scale"] = 3 session_info["sine_reward"]["deviation"] = 0 +elif session_info['phase'] == 'foraging_reward': + session_info["foraging_reward"] = {} + session_info["foraging_reward"]["increment"] = 0.25 + session_info["foraging_reward"]["offset"] = 3 + session_info["foraging_reward"]["max_reward"] = 10 + session_info['consecutive_control'] = False if session_info['consecutive_control']: From 651b4b426970aa8760a01d79fec70104e20fad47 Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Wed, 12 Jul 2023 16:55:12 -0400 Subject: [PATCH 088/135] Update run_headfixed_independent_reward_task.py --- run_headfixed_independent_reward_task.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 3203830..f3dcd40 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -208,6 +208,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal elif session_info['phase'] == "sine_reward": task.current_reward = reward_distribution_list[task.correct_trial_number] elif session_info['phase'] == 'foraging_reward': + task.current_reward = reward_distribution if task.cue_state == 'all': if task.side_choice == 'left': reward_distribution[0] = reward_distribution[0] - increment @@ -223,8 +224,8 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal reward_distribution[1] = 0 if reward_distribution[0] > max_reward: reward_distribution[0] = max_reward + task.current_reward = reward_distribution - task.current_reward = reward_distribution logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)[1:-1]) From 96fde11480c8af7edb378c6bdf76a6d8ed5ded5d Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Wed, 12 Jul 2023 16:56:53 -0400 Subject: [PATCH 089/135] Update run_headfixed_independent_reward_task.py --- run_headfixed_independent_reward_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index f3dcd40..62cbc4f 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -229,7 +229,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)[1:-1]) - print(" - Current card condition: \n" + + print(" - Current card condition: \n" + "*******************************\n" + "*reward_side: " + str(task.current_card[0]) + "\n" + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") From 878ce68570bcf6067057893c407561e281651ebb Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Wed, 12 Jul 2023 17:06:31 -0400 Subject: [PATCH 090/135] Update run_headfixed_independent_reward_task.py --- run_headfixed_independent_reward_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 62cbc4f..68bb87a 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -157,8 +157,8 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal offset = session_info['foraging_reward']['offset'] max_reward = session_info['foraging_reward']['max_reward'] increment = session_info['foraging_reward']['increment'] - reward_distribution[0] = offset - reward_distribution[1] = offset + reward_distribution = (3,3) + first_trial_of_the_session = True From 2905011ce384084210ae71f93cd233db6c50baef Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 10:22:09 -0400 Subject: [PATCH 091/135] Update session_info_headfixed_independent_reward.py --- session_info_headfixed_independent_reward.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 1e73095..1201aaa 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -36,7 +36,7 @@ session_info['config'] = 'headfixed2FC' session_info['treadmill_setup'] = {} session_info['treadmill'] = True -session_info['phase'] = 'independent_reward' # 'forced_choice', 'sine_reward' +session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' if session_info['treadmill']: session_info['treadmill_setup']['distance_cue'] = 5 # cm @@ -100,10 +100,9 @@ def get_coefficient(): session_info["key_reward_amount"] = 2 session_info['reward_size_offset'] = 2 +session_info['reward_size'] = (5, 5) -if session_info['phase'] == "forced_choice": - session_info['reward_size'] = (10, 10) -elif session_info["phase"] == 'independent_reward': +if session_info["phase"] == 'independent_reward': session_info['independent_reward'] = {} session_info['independent_reward']['scale'] = 0.5 session_info['independent_reward']['offset'] = 3.0 From 362b61b53822e48f3c31ee402244a996e4b174e6 Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 10:27:16 -0400 Subject: [PATCH 092/135] Update session_info_headfixed_independent_reward.py --- session_info_headfixed_independent_reward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 1201aaa..d73fbe2 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -21,7 +21,7 @@ # for actual data save to this dir: # session_info['basedir'] = '/home/pi/video' session_info['weight'] = 0.0 -session_info['manual_date'] = '202x-xx-xx' +session_info['manual_date'] = '2023-07-13' session_info['box_name'] = socket.gethostname() session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts From 520bbb6fbc59b21b7df22363b3a4b7a29f896b2f Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 10:48:29 -0400 Subject: [PATCH 093/135] Update run_headfixed_independent_reward_task.py --- run_headfixed_independent_reward_task.py | 30 ++++++++++++++---------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 68bb87a..3796f2d 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -158,7 +158,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal max_reward = session_info['foraging_reward']['max_reward'] increment = session_info['foraging_reward']['increment'] reward_distribution = (3,3) - + first_trial_of_the_session = True @@ -208,22 +208,26 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal elif session_info['phase'] == "sine_reward": task.current_reward = reward_distribution_list[task.correct_trial_number] elif session_info['phase'] == 'foraging_reward': + reward_L = reward_distribution[0] + reward_R = reward_distribution[1] task.current_reward = reward_distribution if task.cue_state == 'all': if task.side_choice == 'left': - reward_distribution[0] = reward_distribution[0] - increment - reward_distribution[1] = reward_distribution[1] + increment - if reward_distribution[0]< 0: - reward_distribution[0] = 0 - if reward_distribution[1]> max_reward: - reward_distribution[1] = max_reward + reward_L = reward_L - increment + reward_R = reward_R + increment + if reward_L < 0: + reward_L = 0 + if reward_R > max_reward: + reward_R = max_reward elif task.side_choice == 'right': - reward_distribution[1] = reward_distribution[1] - increment - reward_distribution[0] = reward_distribution[0] + increment - if reward_distribution[1] < 0: - reward_distribution[1] = 0 - if reward_distribution[0] > max_reward: - reward_distribution[0] = max_reward + reward_R = reward_R - increment + reward_L = reward_L + increment + if reward_R < 0: + reward_R = 0 + if reward_L > max_reward: + reward_L = max_reward + reward_L = reward_distribution[0] + reward_R = reward_distribution[1] task.current_reward = reward_distribution From c1b506bdc038fbe7129281ad26892228d51b6373 Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 11:03:02 -0400 Subject: [PATCH 094/135] Update run_headfixed_independent_reward_task.py --- run_headfixed_independent_reward_task.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 3796f2d..2f8f2f8 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -226,8 +226,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal reward_R = 0 if reward_L > max_reward: reward_L = max_reward - reward_L = reward_distribution[0] - reward_R = reward_distribution[1] + reward_distribution = (reward_L, reward_R) task.current_reward = reward_distribution From 7f94503d0e41cc3030add83118abec654bebf012 Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 14:13:45 -0400 Subject: [PATCH 095/135] add fraction of free choices in the session info --- run_headfixed_independent_reward_task.py | 2 +- session_info_headfixed_independent_reward.py | 1 + task_information_independent_reward.py | 31 ++++++++++++++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 2f8f2f8..d5b7d69 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -200,7 +200,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal task.actual_trial_number += 1 print("*******************************\n") # acquire new reward contingency and cue association - task.current_card = task_information.draw_card(session_info['phase']) + task.current_card = task_information.draw_card(session_info['phase'], session_info['free_choice_fraction']) if session_info['phase'] == "independent_reward": task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) elif session_info['phase'] == "forced_choice": diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index d73fbe2..b559b81 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -37,6 +37,7 @@ session_info['treadmill_setup'] = {} session_info['treadmill'] = True session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' +session_info['free_choice_fraction'] = 0.3 # 0.3, 0.5,0.7,1 if session_info['treadmill']: session_info['treadmill_setup']['distance_cue'] = 5 # cm diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index 1d88dc7..1409747 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -5,22 +5,41 @@ class TaskInformation(object): def __init__(self, **kwargs): self.name = "model_based_reinforcement_learning_task" self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ] - def draw_card(self, phase="independent_reward"): + def draw_card(self, phase="independent_reward", fraction = 0.5): row_start = 0 row_end = len(self.deck)-1 - if phase == 'independent_reward': - pass - elif phase == 'forced_choice': + + if phase == 'forced_choice': row_end = 1 elif phase == 'free_choice': - row_start = 2 + row_start = 9 elif phase == 'forced_choice_left': row_end = 0 elif phase == 'forced_choice_right': row_start = 1 row_end = 1 + else: + if fraction == 0.5: + row_start = 8 + row_end = 11 + elif fraction == 0.7: + row_start = 6 + elif fraction == 0.3: + row_end = 13 + elif fraction == 1: + row_start = 11 + card = self.deck[random.randint(row_start, row_end)] return card From 596a9414bb15d0fa44c8349af792800b3b1c88e9 Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 14:58:35 -0400 Subject: [PATCH 096/135] Update run_headfixed_independent_reward_task.py --- run_headfixed_independent_reward_task.py | 1 + 1 file changed, 1 insertion(+) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index d5b7d69..bb4154d 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -200,6 +200,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal task.actual_trial_number += 1 print("*******************************\n") # acquire new reward contingency and cue association + print("fraction " + str(session_info['free_choice_fraction']) + " \n") task.current_card = task_information.draw_card(session_info['phase'], session_info['free_choice_fraction']) if session_info['phase'] == "independent_reward": task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) From 169b74ebd879763453aedb324157075bb809eabb Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 15:04:58 -0400 Subject: [PATCH 097/135] Update task_information_independent_reward.py --- task_information_independent_reward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/task_information_independent_reward.py b/task_information_independent_reward.py index 1409747..ddcf184 100644 --- a/task_information_independent_reward.py +++ b/task_information_independent_reward.py @@ -16,7 +16,7 @@ def __init__(self, **kwargs): ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), ] - def draw_card(self, phase="independent_reward", fraction = 0.5): + def draw_card(self, phase="independent_reward", fraction=0.5): row_start = 0 row_end = len(self.deck)-1 From 000d691ff939298acbc0096a1630031c19b6c4ab Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 15:34:44 -0400 Subject: [PATCH 098/135] adding free choice fraction --- run_headfixed_independent_reward_task.py | 4 ++-- session_info_headfixed_independent_reward.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index bb4154d..57d45ab 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -200,8 +200,8 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal task.actual_trial_number += 1 print("*******************************\n") # acquire new reward contingency and cue association - print("fraction " + str(session_info['free_choice_fraction']) + " \n") - task.current_card = task_information.draw_card(session_info['phase'], session_info['free_choice_fraction']) + print("fraction " + str(session_info['fraction']) + " \n") + task.current_card = task_information.draw_card(session_info['phase'], session_info['fraction']) if session_info['phase'] == "independent_reward": task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) elif session_info['phase'] == "forced_choice": diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index b559b81..02e9828 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -37,7 +37,7 @@ session_info['treadmill_setup'] = {} session_info['treadmill'] = True session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' -session_info['free_choice_fraction'] = 0.3 # 0.3, 0.5,0.7,1 +session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice if session_info['treadmill']: session_info['treadmill_setup']['distance_cue'] = 5 # cm From 9d9c9a1c9722d502c2ef8684e2b686e71a1fcdaa Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Thu, 13 Jul 2023 15:36:47 -0400 Subject: [PATCH 099/135] Update session_info_headfixed_independent_reward.py --- session_info_headfixed_independent_reward.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/session_info_headfixed_independent_reward.py b/session_info_headfixed_independent_reward.py index 02e9828..5b8795d 100644 --- a/session_info_headfixed_independent_reward.py +++ b/session_info_headfixed_independent_reward.py @@ -36,8 +36,10 @@ session_info['config'] = 'headfixed2FC' session_info['treadmill_setup'] = {} session_info['treadmill'] = True +session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' -session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice + + if session_info['treadmill']: session_info['treadmill_setup']['distance_cue'] = 5 # cm From 11fa4a7f8e70b1c041cc6014cab373003e5b709d Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Fri, 14 Jul 2023 14:26:57 -0400 Subject: [PATCH 100/135] Update run_headfixed_independent_reward_task.py --- run_headfixed_independent_reward_task.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/run_headfixed_independent_reward_task.py b/run_headfixed_independent_reward_task.py index 57d45ab..1957312 100644 --- a/run_headfixed_independent_reward_task.py +++ b/run_headfixed_independent_reward_task.py @@ -200,7 +200,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal task.actual_trial_number += 1 print("*******************************\n") # acquire new reward contingency and cue association - print("fraction " + str(session_info['fraction']) + " \n") + #print("fraction " + str(session_info['fraction']) + " \n") task.current_card = task_information.draw_card(session_info['phase'], session_info['fraction']) if session_info['phase'] == "independent_reward": task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) @@ -233,6 +233,7 @@ def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scal logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + ";current_reward_" + str(task.current_reward)[1:-1]) + print(" - Current card condition: \n" + "*******************************\n" + "*reward_side: " + str(task.current_card[0]) + "\n" + From 2bce35c65e93b5c026b2061f476d5fdc6e7dab63 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 27 Jul 2023 13:34:33 -0400 Subject: [PATCH 101/135] merging new changes Soyoun added for the independent_reward_task --- .../headfixed_independent_reward_task.py | 471 ++++++++++++++++++ .../run_headfixed_independent_reward_task.py | 265 ++++++++++ 2 files changed, 736 insertions(+) create mode 100644 task_protocol/headfixed_task/headfixed_independent_reward_task.py create mode 100644 task_protocol/headfixed_task/run_headfixed_independent_reward_task.py diff --git a/task_protocol/headfixed_task/headfixed_independent_reward_task.py b/task_protocol/headfixed_task/headfixed_independent_reward_task.py new file mode 100644 index 0000000..9484671 --- /dev/null +++ b/task_protocol/headfixed_task/headfixed_independent_reward_task.py @@ -0,0 +1,471 @@ +# python3: headfixed_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training task structure +description: + an updated test version of headfixed_task.py & add foraging reward condition + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class HeadfixedIndependentRewardTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["wait_for_choice"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.correct_trial_number = 0 + self.actual_trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = True + self.multiple_choice_error = False + self.error_repeat = False + + self.pump_num = None + self.reward_size = None + self.current_reward = None + self.reward_check = False + self.reward_size_offset = self.session_info['reward_size_offset'] + + self.block_count = 0 + self.blocknumber = self.session_info["block_number"] + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for foragaing parameters + self.side_choice = None # whether free choice is left or right + self.cue_state = None + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + cue_state = self.current_card[0] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + self.cue_state = cue_state # cue state for foraging + if cue_state == 'all': + side_choice = side_mice + if side_choice == 'left': + self.pump_num = self.current_card[2][0] + self.reward_size = self.current_reward[0] + print("self.current_reward[0]: " + str(self.current_reward[0])) + elif side_choice == 'right': + self.pump_num = self.current_card[2][1] + self.reward_size = self.current_reward[1] + print("self.current_reward[0]: " + str(self.current_reward[1])) + elif cue_state == 'LED_L': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[0] + elif cue_state == 'LED_R': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[1] + print("!!!!!!!!CUE_STATE: " + str(cue_state)) + if side_mice == side_choice: # if the animal chose correctly + self.side_mice_buffer = side_mice + if side_mice == side_choice: # if the animal chose correctly + if self.lick_count == 0: # if this is the first lick + self.side_choice = side_choice # foraging task + self.wrong_choice_error = False + self.reward_check = True + self.lick_count += 1 + self.restart() + elif self.side_mice_buffer: + if self.lick_count == 0: + self.wrong_choice_error = True + self.lick_count += 1 + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.early_lick_error = False + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.lick_count = 0 + self.side_mice_buffer = None + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + self.cue_off('sound1') + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if not self.early_lick_error: + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + if self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('no_choice_error') + elif self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('wrong_choice_error') + elif self.reward_check: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.pump.reward(self.pump_num, self.reward_size) + self.error_repeat = False + self.total_reward += 1 + self.reward_check = False + self.error_list.append('correct_trial') + self.pump_num = None + self.reward_size = None + self.wrong_choice_error = False + + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1, 0.1, 1) + elif cue == 'LED_L': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) + elif cue == 'all': + self.box.cueLED1.on() + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.cueLED1.off() + self.box.cueLED2.off() + elif cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'LED_L': + self.box.cueLED1.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py b/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py new file mode 100644 index 0000000..1957312 --- /dev/null +++ b/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py @@ -0,0 +1,265 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed2FC_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: run_headfixed_independent_reward_task.py +goal: model_free reinforcement learning behavioral training run task file +description: + an updated test version of run_headfixed_task.py & add foraging task + +""" +import random +import numpy as np +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed_independent_reward_task import HeadfixedIndependentRewardTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + + import sys + + session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_independent_reward import TaskInformation + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) + + + def cumsum_positive(input_list): + for index in range(len(input_list)): + if index == 0 and input_list[index] < 0: + input_list[index] = -input_list[index] + elif input_list[index] + input_list[index - 1] < 0: + input_list[index] = input_list[index] - input_list[index - 1] + else: + input_list[index] = input_list[index] + input_list[index - 1] + return input_list + + def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials / change_point)): + temp = np.random.randn(change_point) * scale + rewards_L.append(cumsum_positive(temp) + offset) + temp = np.random.randn(change_point) * scale + rewards_R.append(cumsum_positive(temp) + offset) + rewards_L = np.hstack(rewards_L) + rewards_R = np.hstack(rewards_R) + # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials, :] + # print(reward_LR) + return reward_LR + + def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only + session_start = random.uniform(0, period_width) + session_end = session_start + session_length + value_input = np.arange(session_start, session_end, increment) + + sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale + negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale + left_side_reward = np.random.normal(sine_output, deviation) + right_side_reward = np.random.normal(negative_sine_output, deviation) + reward_list = list(zip(left_side_reward, right_side_reward)) + return reward_list + + if session_info['phase'] == "independent_reward": + # from reward_distribution import generate_reward_trajectory + scale = session_info['independent_reward']['scale'] + offset = session_info['independent_reward']['offset'] + change_point = session_info['independent_reward']['change_point'] + ntrials = session_info['independent_reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + elif session_info['phase'] == "forced_choice": + reward_size = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + session_length = session_info["sine_reward"]["session_length"] + increment = session_info["sine_reward"]["increment"] + period_width = session_info["sine_reward"]["period_width"] + amplitude_offset = session_info["sine_reward"]["amplitude_offset"] + amplitude_scale = session_info["sine_reward"]["amplitude_scale"] + deviation = session_info["sine_reward"]["deviation"] + reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, + amplitude_scale, deviation, session_length) + elif session_info['phase'] == 'foraging_reward': + offset = session_info['foraging_reward']['offset'] + max_reward = session_info['foraging_reward']['max_reward'] + increment = session_info['foraging_reward']['increment'] + reward_distribution = (3,3) + + + first_trial_of_the_session = True + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info + t_end = time.time() + 60 * t_minute + while time.time() < t_end: # time check + if task.error_repeat: # error repeat check + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("Trial " + str(task.actual_trial_number) + " \n") + task.actual_trial_number += 1 + print("*******************************\n") + print("*error_repeat trial* \n" + + " - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + else: + if not first_trial_of_the_session: + print("reward_time_out: " + str(session_info["reward_timeout"])) + sleep(session_info["reward_timeout"]) + else: + first_trial_of_the_session = False + # setup the beginning of a new trial + task.error_count = 0 # reset the error count if previous trial is correct + print("Trial " + str(task.actual_trial_number) + " \n") + task.correct_trial_number += 1 + task.actual_trial_number += 1 + print("*******************************\n") + # acquire new reward contingency and cue association + #print("fraction " + str(session_info['fraction']) + " \n") + task.current_card = task_information.draw_card(session_info['phase'], session_info['fraction']) + if session_info['phase'] == "independent_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) + elif session_info['phase'] == "forced_choice": + task.current_reward = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + elif session_info['phase'] == 'foraging_reward': + reward_L = reward_distribution[0] + reward_R = reward_distribution[1] + task.current_reward = reward_distribution + if task.cue_state == 'all': + if task.side_choice == 'left': + reward_L = reward_L - increment + reward_R = reward_R + increment + if reward_L < 0: + reward_L = 0 + if reward_R > max_reward: + reward_R = max_reward + elif task.side_choice == 'right': + reward_R = reward_R - increment + reward_L = reward_L + increment + if reward_R < 0: + reward_R = 0 + if reward_L > max_reward: + reward_L = max_reward + reward_distribution = (reward_L, reward_R) + task.current_reward = reward_distribution + + + logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + + ";current_reward_" + str(task.current_reward)[1:-1]) + + print(" - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() \ No newline at end of file From 6347726541bb8e67c755c7ea3b06e12c20eae081 Mon Sep 17 00:00:00 2001 From: season Date: Thu, 27 Jul 2023 13:35:41 -0400 Subject: [PATCH 102/135] merging new changes Soyoun added for the independent_reward_task --- ...ssion_info_headfixed_independent_reward.py | 21 ++++++++---- .../task_information_independent_reward.py | 33 +++++++++++++++---- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py b/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py index 1a1b2aa..4c4bbf1 100644 --- a/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py +++ b/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py @@ -21,7 +21,7 @@ # for actual data save to this dir: # session_info['basedir'] = '/home/pi/video' session_info['weight'] = 0.0 -session_info['manual_date'] = '202x-xx-xx' +session_info['manual_date'] = '2023-07-13' session_info['box_name'] = socket.gethostname() session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts @@ -36,7 +36,10 @@ session_info['config'] = 'headfixed2FC' session_info['treadmill_setup'] = {} session_info['treadmill'] = True -session_info['phase'] = 'independent_reward' # 'forced_choice', 'sine_reward' +session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice +session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' + + if session_info['treadmill']: session_info['treadmill_setup']['distance_cue'] = 5 # cm @@ -100,10 +103,9 @@ def get_coefficient(): session_info["key_reward_amount"] = 2 session_info['reward_size_offset'] = 2 +session_info['reward_size'] = (5, 5) -if session_info['phase'] == "forced_choice": - session_info['reward_size'] = (10, 10) -elif session_info["phase"] == 'independent_reward': +if session_info["phase"] == 'independent_reward': session_info['independent_reward'] = {} session_info['independent_reward']['scale'] = 0.5 session_info['independent_reward']['offset'] = 3.0 @@ -116,8 +118,13 @@ def get_coefficient(): session_info["sine_reward"]["amplitude_offset"] = 2 session_info["sine_reward"]["amplitude_scale"] = 3 session_info["sine_reward"]["deviation"] = 0 +elif session_info['phase'] == 'foraging_reward': + session_info["foraging_reward"] = {} + session_info["foraging_reward"]["increment"] = 0.25 + session_info["foraging_reward"]["offset"] = 3 + session_info["foraging_reward"]["max_reward"] = 10 + session_info['consecutive_control'] = False if session_info['consecutive_control']: - session_info['consecutive_max'] = 3 - + session_info['consecutive_max'] = 3 \ No newline at end of file diff --git a/task_protocol/headfixed_task/task_information_independent_reward.py b/task_protocol/headfixed_task/task_information_independent_reward.py index 1d88dc7..a423b6d 100644 --- a/task_protocol/headfixed_task/task_information_independent_reward.py +++ b/task_protocol/headfixed_task/task_information_independent_reward.py @@ -5,23 +5,42 @@ class TaskInformation(object): def __init__(self, **kwargs): self.name = "model_based_reinforcement_learning_task" self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2'))] + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ] - def draw_card(self, phase="independent_reward"): + def draw_card(self, phase="independent_reward", fraction=0.5): row_start = 0 row_end = len(self.deck)-1 - if phase == 'independent_reward': - pass - elif phase == 'forced_choice': + + if phase == 'forced_choice': row_end = 1 elif phase == 'free_choice': - row_start = 2 + row_start = 9 elif phase == 'forced_choice_left': row_end = 0 elif phase == 'forced_choice_right': row_start = 1 row_end = 1 + else: + if fraction == 0.5: + row_start = 8 + row_end = 11 + elif fraction == 0.7: + row_start = 6 + elif fraction == 0.3: + row_end = 13 + elif fraction == 1: + row_start = 11 + card = self.deck[random.randint(row_start, row_end)] return card -# print(TaskInformation().draw_card()) +# print(TaskInformation().draw_card()) \ No newline at end of file From 1df9b75c41ebc505a4e7f0dfd97c587cc5a698ca Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Thu, 26 Oct 2023 14:12:41 -0400 Subject: [PATCH 103/135] gitattributes file for line ending normalization --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto From e66574dad759c4a7f18b6b40fdac782d0c4e848e Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Fri, 27 Oct 2023 10:18:06 -0400 Subject: [PATCH 104/135] Remove obsolete directory --- obsolete/behavbox_v2.py | 413 ------------------- obsolete/fake_session_info.py | 43 -- obsolete/headfixed2FC_task_old.py | 461 ---------------------- obsolete/headfixed_task_old.py | 454 --------------------- obsolete/lick_task.py | 182 --------- obsolete/pump_task.py | 171 -------- obsolete/record_run_test.py | 49 --- obsolete/run_flip_task.py | 27 -- obsolete/run_headfixed2FC_task.py | 182 --------- obsolete/run_headfixed_task.py | 172 -------- obsolete/run_lick_task.py | 131 ------ obsolete/run_season_task.py | 125 ------ obsolete/run_soyoun_task.py | 137 ------- obsolete/run_visualization_task.py | 129 ------ obsolete/run_walk_task.py | 163 -------- obsolete/session_info_headfixed.py | 89 ----- obsolete/session_info_headfixed2FC.py | 88 ----- obsolete/session_info_walk.py | 64 --- obsolete/soyoun_task.py | 327 --------------- obsolete/task_information_headfixed.py | 77 ---- obsolete/task_information_headfixed2FC.py | 42 -- obsolete/task_information_lick.py | 134 ------- obsolete/task_information_phase_1.py | 158 -------- obsolete/test_session_info.py | 23 -- obsolete/testing_visualstim.py | 64 --- obsolete/visualization_task.py | 182 --------- obsolete/walk_task.py | 461 ---------------------- 27 files changed, 4548 deletions(-) delete mode 100644 obsolete/behavbox_v2.py delete mode 100755 obsolete/fake_session_info.py delete mode 100644 obsolete/headfixed2FC_task_old.py delete mode 100644 obsolete/headfixed_task_old.py delete mode 100644 obsolete/lick_task.py delete mode 100755 obsolete/pump_task.py delete mode 100755 obsolete/record_run_test.py delete mode 100755 obsolete/run_flip_task.py delete mode 100644 obsolete/run_headfixed2FC_task.py delete mode 100644 obsolete/run_headfixed_task.py delete mode 100644 obsolete/run_lick_task.py delete mode 100644 obsolete/run_season_task.py delete mode 100644 obsolete/run_soyoun_task.py delete mode 100644 obsolete/run_visualization_task.py delete mode 100644 obsolete/run_walk_task.py delete mode 100644 obsolete/session_info_headfixed.py delete mode 100644 obsolete/session_info_headfixed2FC.py delete mode 100644 obsolete/session_info_walk.py delete mode 100644 obsolete/soyoun_task.py delete mode 100644 obsolete/task_information_headfixed.py delete mode 100644 obsolete/task_information_headfixed2FC.py delete mode 100644 obsolete/task_information_lick.py delete mode 100644 obsolete/task_information_phase_1.py delete mode 100755 obsolete/test_session_info.py delete mode 100755 obsolete/testing_visualstim.py delete mode 100644 obsolete/visualization_task.py delete mode 100644 obsolete/walk_task.py diff --git a/obsolete/behavbox_v2.py b/obsolete/behavbox_v2.py deleted file mode 100644 index 5845d25..0000000 --- a/obsolete/behavbox_v2.py +++ /dev/null @@ -1,413 +0,0 @@ -# contains the behavior box class, which includes pin numbers and whether DIO pins are -# configured as input or output - -from gpiozero import PWMLED, LED, Button -import os -import socket -import time -from collections import deque - -# from icecream import ic -import pygame -import logging -from colorama import Fore, Style -# import pysistence, collections -from visualstim import VisualStim - -import scipy.io, pickle - -import Treadmill -import ADS1x15 - - -from fake_session_info import fake_session_info - -# for the flipper -from FlipperOutput import FlipperOutput - - -class BehavBox(object): - event_list = ( - deque() - ) # all detected events are added to this queue to be read out by the behavior class - - def __init__(self, session_info): - - logging.info(str(time.time()) + ", behavior_box_initialized") - self.session_info = session_info - - from subprocess import check_output - IP_address = check_output(['hostname', '-I']).decode('ascii')[:-2] - self.IP_address = IP_address - IP_address_video_list = list(IP_address) - IP_address_video_list[-3] = "2" - self.IP_address_video = "".join(IP_address_video_list) - - ############################################################################################### - # below are all the pin numbers for Yi's breakout board - # cue LEDs - setting PWM frequency of 200 Hz - ############################################################################################### - self.cueLED1 = BoxLED(22, frequency=200) - self.cueLED2 = BoxLED(18, frequency=200) - self.cueLED3 = BoxLED(17, frequency=200) - self.cueLED4 = BoxLED(14, frequency=200) - - ############################################################################################### - # digital I/O's - used for cue LED - # cue for animals - # DIO 1 and 2 are reserved for the audio board - ############################################################################################### - # self.DIO3 = LED(9) # reserved for vacuum function - self.DIO4 = LED(10) - self.DIO5 = LED(11) - # there is a DIO6, but that is the same pin as the camera strobe - - ############################################################################################### - # IR detection - for nosepoke - ############################################################################################### - self.IR_rx1 = Button(5, None, True) # None, True inverts the signal so poke=True, no-poke=False - self.IR_rx2 = Button(6, None, True) - self.IR_rx3 = Button(12, None, True) - self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use - self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use - - # link nosepoke event detections to callbacks - self.IR_rx1.when_pressed = self.left_IR_entry - self.IR_rx2.when_pressed = self.center_IR_entry - self.IR_rx3.when_pressed = self.right_IR_entry - self.IR_rx1.when_released = self.left_IR_exit - self.IR_rx2.when_released = self.center_IR_exit - self.IR_rx3.when_released = self.right_IR_exit - - ############################################################################################### - # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors - ############################################################################################### - # pins originally reserved for the lick detection is now used for audio board TTL input signal - self.sound1 = LED(26) # originally lick1 - self.sound2 = LED(27) # originally lick2 - self.sound3 = LED(15) # originally lick3 - - self.sound4 = LED(23) # originally DIO1 - self.sound5 = LED(24) # originally DIO2 - - ############################################################################################### - # flipper strobe signal (previously called camera strobe signal) - ############################################################################################### - # previously: self.camera_strobe = Button(4) - # previously: rising and falling edges are detected and logged in a separate video file - # initiating flipper object - self.flipper = FlipperOutput(self.session_info, pin=4) - - ############################################################################################### - # visual stimuli - ############################################################################################### - try: - self.visualstim = VisualStim(self.session_info) - except Exception as error_message: - print("visualstim issue\n") - print(str(error_message)) - - ############################################################################################### - # TODO: ADC(Adafruit_ADS1x15) - ############################################################################################### - try: - self.ADC = ADS1x15.ADS1015 - except Exception as error_message: - print("ADC issue\n") - print(str(error_message)) - - # ############################################################################################### - # # TODO: treadmill - # ############################################################################################### - try: - self.treadmill = Treadmill.dacval - except Exception as error_message: - print("treadmill issue\n") - print(str(error_message)) - - ############################################################################################### - # Keystroke handler - ############################################################################################### - try: - DISPLAYSURF = pygame.display.set_mode((200, 200)) - pygame.display.set_caption(session_info["box_name"]) - print( - "\nKeystroke handler initiated. In order for keystrokes to register, the pygame window" - ) - print("must be in the foreground. Keys are as follows:\n") - print( - Fore.YELLOW - + " 1: left poke 2: center poke 3: right poke" - ) - print( - " Q: left lick W: center lick E: right lick" - ) - print( - Fore.CYAN - + " Esc: close key capture window\n" - + Style.RESET_ALL - ) - print( - Fore.GREEN - + Style.BRIGHT - + " TO EXIT, CLICK THE MAIN TEXT WINDOW AND PRESS CTRL-C " - + Fore.RED - + "ONCE\n" - + Style.RESET_ALL - ) - - self.keyboard_active = True - except Exception as error_message: - print("pygame issue\n") - print(str(error_message)) - - ############################################################################################### - # check for key presses - uses pygame window to simulate nosepokes and licks - - ############################################################################################### - - def check_keybd(self): - if self.keyboard_active == True: - event = pygame.event.poll() - - KeyDown = 768 # event type numbers - KeyUp = 769 - - if event: - if event.type == KeyDown and event.key == 49: # 1 key - self.left_IR_entry() - elif event.type == KeyUp and event.key == 49: - self.left_IR_exit() - elif event.type == KeyDown and event.key == 50: # 2 key - self.center_IR_entry() - elif event.type == KeyUp and event.key == 50: - self.center_IR_exit() - elif event.type == KeyDown and event.key == 51: # 3 key - self.right_IR_entry() - elif event.type == KeyUp and event.key == 51: - self.right_IR_exit() - elif event.type == KeyDown and event.key == 113: # Q key - self.left_lick_start() - elif event.type == KeyUp and event.key == 113: - self.left_lick_stop() - elif event.type == KeyDown and event.key == 119: # W key - self.center_lick_start() - elif event.type == KeyUp and event.key == 119: - self.center_lick_stop() - elif event.type == KeyDown and event.key == 101: # E key - self.right_lick_start() - elif event.type == KeyUp and event.key == 101: - self.right_lick_stop() - elif event.type == KeyDown and event.key == 27: # escape key - pygame.quit() - self.keyboard_active = False - - ############################################################################################### - # methods to start and stop video - # These work with fake video files but haven't been tested with real ones - ############################################################################################### - def video_start(self): - IP_address_video = self.IP_address_video - dir_name = self.session_info['dir_name'] - basename = self.session_info['basename'] - file_name = dir_name + "/" + basename - # print(Fore.RED + '\nTEST - RED' + Style.RESET_ALL) - - # create directory on the external storage - base_dir = self.session_info['external_storage'] + '/' - hd_dir = base_dir + basename - os.mkdir(hd_dir) - - - # Preview check per Kelly request - print(Fore.YELLOW + "Killing any python process prior to this session!\n" + Style.RESET_ALL) - try: - os.system("ssh pi@" + IP_address_video + " pkill python") - print(Fore.CYAN + "\nStart Previewing ..." + Style.RESET_ALL) - print(Fore.RED + "\n CRTL + C to quit previewing and start recording" + Style.RESET_ALL) - - os.system("ssh pi@" + IP_address_video + " '/home/pi/RPi4_behavior_boxes/start_preview.py'") - # Kill any python process before start recording - print(Fore.GREEN + "\nKilling any python process before start recording!" + Style.RESET_ALL) - - os.system("ssh pi@" + IP_address_video + " pkill python") - time.sleep(2) - - # Prepare the path for recording - os.system("ssh pi@" + IP_address_video + " mkdir " + dir_name) - os.system("ssh pi@" + IP_address_video + " 'date >> ~/video/videolog.log' ") # I/O redirection - tempstr = ( - "ssh pi@" + IP_address_video + " 'nohup /home/pi/RPi4_behavior_boxes/video_acquisition/start_acquisition.py " - + file_name - + " >> ~/video/videolog.log 2>&1 & ' " # file descriptors - ) - # start the flipper before the recording start - # initiate the flipper - try: - self.flipper.flip() - except: - pass - # start recording - print(Fore.GREEN + "\nStart Recording!" + Style.RESET_ALL) - os.system(tempstr) - print( - Fore.RED + Style.BRIGHT + "Please check if the preview screen is on! Cancel the session if it's not!" + Style.RESET_ALL) - - # start initiating the dumping of the session information when available - scipy.io.savemat(hd_dir + "/" + basename + '_session_info.mat', {'session_info': self.session_info}) - print("dumping session_info") - pickle.dump(self.session_info, open(hd_dir + "/" + basename + '_session_info.pkl', "wb")) - - except Exception as e: - print(e) - - def video_stop(self): - # Get the basename from the session information - basename = self.session_info['basename'] - dir_name = self.session_info['dir_name'] - # Get the ip address for the box video: - IP_address_video = self.IP_address_video - try: - # Run the stop_video script in the box video - - os.system( - "ssh pi@" + IP_address_video + " /home/pi/RPi4_behavior_boxes/video_acquisition/stop_acquisition.sh") - time.sleep(2) - # now stop the flipper after the video stopped recording - try: # try to stop the flipper - self.flipper.close() - except: - pass - - time.sleep(2) - - hostname = socket.gethostname() - print("Moving video files from " + hostname + "video to " + hostname + ":") - - # Create a directory for storage on the hard drive mounted on the box behavior - base_dir = self.session_info['external_storage'] + '/' - - hd_dir = base_dir + basename - - scipy.io.savemat(hd_dir + "/" + basename + '_session_info.mat', {'session_info': self.session_info}) - print("dumping session_info") - pickle.dump(self.session_info, open(hd_dir + "/" + basename + '_session_info.pkl', "wb")) - - # Move the video + log from the box_video SD card to the box_behavior external hard drive - os.system( - "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":" + dir_name + "/ " - + hd_dir - ) - os.system( - "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":~/video/*.log " - + hd_dir - ) - print("rsync finished!") - - except Exception as e: - print(e) - - def left_IR_entry(self): - self.event_list.append("left_IR_entry") - self.cueLED1.blink(0.3,0.1,1) - logging.info(str(time.time()) + ", left_IR_entry") - - def center_IR_entry(self): - self.event_list.append("center_IR_entry") - self.cueLED2.blink(0.3, 0.1, 1) - logging.info(str(time.time()) + ", center_IR_entry") - - def right_IR_entry(self): - self.event_list.append("right_IR_entry") - self.cueLED3.blink(0.3, 0.1, 1) - logging.info(str(time.time()) + ", right_IR_entry") - - def left_IR_exit(self): - self.event_list.append("left_IR_exit") - logging.info(str(time.time()) + ", left_IR_exit") - - def center_IR_exit(self): - self.event_list.append("center_IR_exit") - logging.info(str(time.time()) + ", center_IR_exit") - - def right_IR_exit(self): - self.event_list.append("right_IR_exit") - logging.info(str(time.time()) + ", right_IR_exit") - - def left_lick_start(self): - self.event_list.append("left_lick_start") - logging.info(str(time.time()) + ", left_lick_start") - - def center_lick_start(self): - self.event_list.append("center_lick_start") - logging.info(str(time.time()) + ", center_lick_start") - - def right_lick_start(self): - self.event_list.append("right_lick_start") - logging.info(str(time.time()) + ", right_lick_start") - - def left_lick_stop(self): - self.event_list.append("left_lick_stop") - logging.info(str(time.time()) + ", left_lick_stop") - - def center_lick_stop(self): - self.event_list.append("center_lick_stop") - logging.info(str(time.time()) + ", center_lick_stop") - - def right_lick_stop(self): - self.event_list.append("right_lick_stop") - logging.info(str(time.time()) + ", right_lick_stop") - - -# this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) -# currently. BoxLED.set_value is the saved intensity value that determines how bright the -# LED will be if BoxLED.on() is called. This is better than the original PWMLED class. -class BoxLED(PWMLED): - set_value = 1 # the intensity value, ranging from 0-1 - - def on( - self, - ): # unlike PWMLED, here the on() function sets the intensity to set_value, - # not to full intensity - self.value = self.set_value - - -class Pump(object): - def __init__(self): - - ############################################################################################### - # syringe pumps - ############################################################################################### - self.pump1 = LED(19) # for testing only - the correct pin number is 19 - self.pump2 = LED(20) - self.pump3 = LED(21) - self.pump4 = LED(8) - self.pump5 = LED(7) - self.pump_en = LED(25) # pump enable - - def reward(self, which_pump, reward_size): - print("TODO: calibrate and test syringe pump code in BehavBox.reward()") - diameter_mm = 12.06 # for 5 mL syringe - # diameter_mm = 14.5 # for 10 mL syringe - volPerRevolution_uL = ( - 0.8 * (diameter_mm / 2) * (diameter_mm / 2) * 3.1415926535898 - ) # thread is 0.8 mm per turn - howManyRevolutions = reward_size / volPerRevolution_uL - # // determine total steps needed to reach desired revolutions, @200 steps/revolution - # // use *4 as a multiplier because it's operating at 1/4 microstep mode. - # // round to nearest int - totalSteps = round(200 * howManyRevolutions * 4) - reward_duration = 1 # delivery reward over 300 ms - cycle_length = ( - reward_duration / totalSteps - ) # need to know what the minimum value can be - - if which_pump == "left": - self.pump1.blink(cycle_length * 0.1, cycle_length * 0.9, totalSteps) - logging.info(str(time.time()) + ", left_reward," + str(reward_size)) - elif which_pump == "center": - self.pump2.blink(cycle_length * 0.1, cycle_length * 0.9, totalSteps) - logging.info(str(time.time()) + ", center_reward," + str(reward_size)) - elif which_pump == "right": - logging.info(str(time.time()) + ", right_reward," + str(reward_size)) - self.pump3.blink(cycle_length * 0.1, cycle_length * 0.9, totalSteps) diff --git a/obsolete/fake_session_info.py b/obsolete/fake_session_info.py deleted file mode 100755 index e11d052..0000000 --- a/obsolete/fake_session_info.py +++ /dev/null @@ -1,43 +0,0 @@ -# put all of your mouse and session info in here - -from datetime import datetime -import os -import pysistence, collections -import socket - - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test_pump', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -fake_session_info = collections.OrderedDict() -fake_session_info['mouse_info'] = mouse_info -fake_session_info['mouse_name'] = mouse_info['mouse_name'] -#fake_session_info['trainingPhase'] = 4 -fake_session_info['basedir'] = '/home/pi/buffer' -fake_session_info['external_storage'] = '/mnt/hd' -# fake_session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -#fake_session_info['basedir'] = '/home/pi/video' -fake_session_info['weight'] = 32.18 -fake_session_info['manual_date'] = '2021-09-14' -fake_session_info['box_name'] = socket.gethostname() - -# fake_session_info['config'] = 'freely_moving_v1' -fake_session_info['config'] = 'head_fixed_v1' - -# behavior parameters -fake_session_info['timeout_length'] = 5 # in seconds -fake_session_info['reward_size'] = 10 # in microliters - -# visual stimulus -fake_session_info['visual_stimulus'] = False -fake_session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -fake_session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.dat', - '/home/pi/gratings/second_grating.dat'] -fake_session_info['vis_raws'] = [] - -# treadmill -fake_session_info['treadmill'] = False diff --git a/obsolete/headfixed2FC_task_old.py b/obsolete/headfixed2FC_task_old.py deleted file mode 100644 index 996b29b..0000000 --- a/obsolete/headfixed2FC_task_old.py +++ /dev/null @@ -1,461 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training task structure -description: - an updated test version of headfixed_task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class Headfixed2FCTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.session_info["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.session_info["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'initiate'], - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.early_lick_error = False - self.initiate_error = False - self.cue_state_error = False - self.wrong_choice_error = False - self.multiple_choice_error = False - self.error_repeat = False - self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False - - self.block_count = 0 - self.blocknumber = self.session_info["block_number"] - self.current_card = None - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - - self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - self.distance_buffer = None - self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - self.correct_trial_in_block = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - # there can only be lick during the reward available state - # if lick detected prior to reward available state - # the trial will restart and transition to standby - if self.event_name is "left_entry" or self.event_name == "right_entry": - # print("EVENT NAME !!!!!! " + self.event_name) - if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": - pass - else: - # print("beeeeeeep") # debug signal - self.early_lick_error = True - self.error_repeat = True - self.restart() - if self.state == "standby": - pass - elif self.state == "initiate": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.initiate_error = False - self.start_cue() - else: - self.initiate_error = True - elif self.state == "cue_state": - # if self.LED_blink: - # self.box.cueLED1.blink(0.2, 0.1) - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_cue: - self.cue_state_error = False - self.evaluate_reward() - else: - self.cue_state_error = True - elif self.state == "reward_available": - if not self.reward_times_up: - if self.reward_time_start: - if time.time() >= self.reward_time_start + self.reward_time: - self.restart() - # first detect the lick signal: - cue_state = self.current_card[0] - side_mice = None - if self.event_name == "left_entry": - side_mice = 'left' - self.left_poke_count += 1 - self.left_poke_count_list.append(self.left_poke_count) - self.timeline_left_poke.append(time.time()) - elif self.event_name == "right_entry": - side_mice = 'right' - self.right_poke_count += 1 - self.right_poke_count_list.append(self.right_poke_count) - self.timeline_right_poke.append(time.time()) - if side_mice: - self.side_mice_buffer = side_mice - if cue_state == 'all': - side_choice = side_mice - if side_choice == 'left': - left_reward = self.session_info['reward_size'][self.current_card[2][0]] - reward_size = random.uniform(left_reward - self.session_info['reward_deviation'], - left_reward + self.session_info['reward_deviation']) - pump_num = self.current_card[3][0] - elif side_choice == 'right': - right_reward = self.session_info['reward_size'][self.current_card[2][1]] - reward_size = random.uniform(right_reward - self.session_info['reward_deviation'], - right_reward + self.session_info['reward_deviation']) - pump_num = self.current_card[3][1] - else: - side_choice = self.current_card[1] - forced_reward = self.session_info['reward_size'][self.current_card[2]] - reward_size = random.uniform(forced_reward - self.session_info['reward_deviation'], - forced_reward + self.session_info['reward_deviation']) - pump_num = self.current_card[3] - if side_mice == side_choice: # if the animal chose correctly - print("Number of lick detected: " + str(self.lick_count)) - if self.lick_count == 0: # if this is the first lick - self.pump.reward(pump_num, reward_size) - self.total_reward += 1 - self.correct_trial_in_block += 1 - self.reward_time_start = time.time() - print("Reward time start" + str(self.reward_time_start)) - self.lick_count += 1 - elif self.side_mice_buffer: - if self.lick_count == 0: - self.check_cue('sound2') - self.wrong_choice_error = True - self.restart() - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - if self.early_lick_error: - self.error_list.append("early_lick_error") - self.early_lick_error = False - self.lick_count = 0 - self.side_mice_buffer = None - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.box.event_list.clear() - pass - - def enter_initiate(self): - # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes - # check error_repeat - logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) - self.check_cue('sound1') - self.trial_running = True - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) - print("EVENT NAME: " + str(self.box.event_list)) - self.cue_off('sound1') - if self.initiate_error: - self.error_list.append('initiate_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) - self.error_count += 1 - - def enter_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) - # turn on the cue according to the current card - self.check_cue(self.current_card[0]) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) - self.cue_off(self.current_card[0]) - if self.cue_state_error: - self.check_cue("sound2") - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") - self.cue_off(self.current_card[0]) - self.reward_times_up = False - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - self.reward_times_up = True - self.pump.reward("vaccum", 0) - if self.wrong_choice_error: - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - self.error_repeat = True - self.error_list.append('wrong_choice_error') - self.wrong_choice_error = False - elif self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.error_repeat = True - self.error_list.append('no_choice_error') - else: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.error_list.append('correct_trial') - self.lick_count = 0 - self.reward_time_start = None - - def check_cue(self, cue): - if cue == 'sound1': - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) - self.box.sound1.on() - if cue == 'sound2': - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) - self.box.sound2.blink(1, 0.1, 1) - elif cue == 'LED_L': - self.box.cueLED1.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) - elif cue == 'LED_R': - # self.LED_blink = True - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) - elif cue == 'all': - self.box.cueLED1.on() - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) - - def cue_off(self, cue): - if cue == 'all': - self.box.cueLED1.off() - self.box.cueLED2.off() - elif cue == 'sound1': - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) - elif cue == 'sound2': - self.box.sound2.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) - elif cue == 'LED_L': - self.box.cueLED1.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) - - def get_distance(self): - try: - distance = self.treadmill.distance_cm - except Exception as e: - logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) - self.treadmill = self.box.treadmill - distance = self.treadmill.distance_cm - return distance - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - print(type(fig)) - - ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() diff --git a/obsolete/headfixed_task_old.py b/obsolete/headfixed_task_old.py deleted file mode 100644 index aef3183..0000000 --- a/obsolete/headfixed_task_old.py +++ /dev/null @@ -1,454 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu -date: 2022-07-29 -name: headfixed_task.py -goal: model_based reinforcement learning behavioral training task structure -description: - an updated test version of soyoun_task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class HeadfixedTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.session_info["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.session_info["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'initiate'], # format: ['trigger', 'origin', 'destination'] - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.early_lick_error = False - self.initiate_error = False - self.cue_state_error = False - self.wrong_choice_error = False - self.multiple_choice_error = False - self.error_repeat = False - self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False - - self.current_card = None - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - - self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - self.distance_buffer = None - self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - # there can only be lick during the reward available state - # if lick detected prior to reward available state - # the trial will restart and transition to standby - if self.event_name is "left_entry" or self.event_name == "right_entry": - # print("EVENT NAME !!!!!! " + self.event_name) - if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": - pass - else: - # print("beeeeeeep") # debug signal - self.early_lick_error = True - self.error_repeat = True - self.restart() - if self.state == "standby": - pass - elif self.state == "initiate": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.initiate_error = False - self.start_cue() - else: - self.initiate_error = True - elif self.state == "cue_state": - # if self.LED_blink: - # self.box.cueLED1.blink(0.2, 0.1) - self.distance_diff = self.get_distance() - self.distance_buffer - distance_condition = self.current_card[1] - distance_required = self.session_info['treadmill_setup'][distance_condition] - if self.distance_diff >= distance_required: - self.cue_state_error = False - self.evaluate_reward() - else: - self.cue_state_error = True - elif self.state == "reward_available": - if not self.reward_times_up: - if self.reward_time_start: - if time.time() >= self.reward_time_start + self.reward_time: - self.restart() - # first detect the lick signal: - cue_state = self.current_card[0] - # side_choice = self.current_card[2] - side_mice = None - if self.event_name == "left_entry": - side_mice = 'left' - self.left_poke_count += 1 - self.left_poke_count_list.append(self.left_poke_count) - self.timeline_left_poke.append(time.time()) - elif self.event_name == "right_entry": - side_mice = 'right' - self.right_poke_count += 1 - self.right_poke_count_list.append(self.right_poke_count) - self.timeline_right_poke.append(time.time()) - if side_mice: - self.side_mice_buffer = side_mice - if cue_state == 'sound+LED': - side_choice = side_mice - if side_choice == 'left': - reward_size = self.current_card[3][0] - pump_num = self.current_card[4][0] - elif side_choice == 'right': - reward_size = self.current_card[3][1] - pump_num = self.current_card[4][1] - else: - side_choice = self.current_card[2] - reward_size = self.current_card[3] - pump_num = self.current_card[4] - if side_mice == side_choice: # if the animal chose correctly - print("Number of lick detected: " + str(self.lick_count)) - if self.lick_count == 0: # if this is the first lick - # self.side_mice_buffer = side_mice - self.pump.reward(pump_num, self.session_info["reward_size"][reward_size]) - self.total_reward += 1 - self.reward_time_start = time.time() - print("Reward time start" + str(self.reward_time_start)) - self.lick_count += 1 - - elif self.side_mice_buffer: - if self.lick_count == 0: # multiple choice error - # self.reward_error = True - self.wrong_choice_error = True - self.restart() - else: # wrong side - wrong_choice error - # self.reward_error = True - self.multiple_choice_error = True - self.restart() - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - if self.early_lick_error: - self.error_list.append("early_lick_error") - self.early_lick_error = False - self.lick_count = 0 - self.side_mice_buffer = None - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.box.event_list.clear() - pass - - def enter_initiate(self): - # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes - # check error_repeat - logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) - self.trial_running = True - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) - print("EVENT NAME: " + str(self.box.event_list)) - if self.initiate_error: - self.error_list.append('initiate_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) - self.error_count += 1 - - def enter_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) - # turn on the cue according to the current card - self.check_cue(self.current_card[0]) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) - self.cue_off(self.current_card[0]) - if self.cue_state_error: - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") - self.cue_off(self.current_card[0]) - self.reward_times_up = False - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - self.reward_times_up = True - self.pump.reward("vaccum", 0) - if self.wrong_choice_error: - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - self.error_repeat = True - self.error_list.append('wrong_choice_error') - self.wrong_choice_error = False - elif self.multiple_choice_error: - logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) - self.error_repeat = False - self.error_list.append('multiple_choice_error') - self.multiple_choice_error = False - elif self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.error_repeat = True - self.error_list.append('no_choice_error') - else: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.error_list.append('correct_trial') - self.lick_count = 0 - self.reward_time_start = None - - def check_cue(self, cue): - if cue == 'sound': - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) - self.box.sound1.on() - elif cue == 'LED': - self.box.cueLED1.blink(0.2, 0.1) - logging.info(";" + str(time.time()) + ";[cue];cueLED1_on;" + str(self.error_repeat)) - else: - # self.LED_blink = True - self.box.cueLED1.blink(0.2, 0.1) - self.box.sound1.on() - logging.info(";" + str(time.time()) + ";[cue];LED_sound_on; " + str(self.error_repeat)) - - def cue_off(self, cue): - if cue == 'sound': - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) - pass - elif cue == 'LED': - self.box.cueLED1.off() - self.LED_blink = False - logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) - else: - self.box.cueLED1.off() - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];LED_sound_off;" + str(self.error_repeat)) - - def get_distance(self): - try: - distance = self.treadmill.distance_cm - except Exception as e: - logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) - self.treadmill = self.box.treadmill - distance = self.treadmill.distance_cm - return distance - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - print(type(fig)) - - ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() diff --git a/obsolete/lick_task.py b/obsolete/lick_task.py deleted file mode 100644 index 4f69474..0000000 --- a/obsolete/lick_task.py +++ /dev/null @@ -1,182 +0,0 @@ -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class LickTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - Timeout( - name="cue", - on_enter=["enter_cue"], - on_exit=["exit_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_start", "standby", "reward_available"], - ["active_poke", "reward_available", "cue"], - ["timeup", "cue", "standby"], - ] - - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - # self.box.sound1.blink(0.5, 0.1, 1) - # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - # self.box.cueLED4.on() - # self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - reward_size = "small" - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - self.pump.reward("1", self.session_info["reward_size"][reward_size]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - self.pump.reward("2", self.session_info["reward_size"][reward_size]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() - # self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/obsolete/pump_task.py b/obsolete/pump_task.py deleted file mode 100755 index 7364902..0000000 --- a/obsolete/pump_task.py +++ /dev/null @@ -1,171 +0,0 @@ -# pump_task -# a task file for testing the pump object code -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox -from behavbox import Pump - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - -class PumpTask(object): - def __init__(self, **kwargs): - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - Timeout( - name="cue", - on_enter=["enter_cue"], - on_exit=["exit_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_start", "standby", "reward_available"], - ["active_poke", "reward_available", "cue"], - ["timeup", "cue", "standby"], - ] - - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = behavbox.Pump(LED) - ######################################################################## - # functions called when state transitions occur - ######################################################################## - - def enter_standby(self): - print("entering standby") - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - self.box.cueLED1.on() - self.box.visualstim.show_grating("first_grating.grat") - - def exit_cue(self): - print("stop cue") - self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - if event_name == "left_poke_entry": - self.active_poke() # triggers state transition - - elif self.state == "cue": - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() diff --git a/obsolete/record_run_test.py b/obsolete/record_run_test.py deleted file mode 100755 index d07690c..0000000 --- a/obsolete/record_run_test.py +++ /dev/null @@ -1,49 +0,0 @@ -from fake_session_info import fake_session_info -import socket -import os -import time - -session_info = fake_session_info -# Get the ip address for SSH into different behavioral box -IP_address = socket.gethostbyname(socket.gethostname() + ".local") -IP_address_video_list = list(IP_address) -IP_address_video_list[-3] = "2" -IP_address_video = "".join(IP_address_video_list) - -# def video_start - - -dir_name = session_info['dir_name'] -os.system("ssh pi@" + IP_address_video + " mkdir " + dir_name) -os.system("ssh pi@" + IP_address_video + " 'date >> ~/videolog.log' ") # I/O redirection -tempstr = ( - "ssh pi@" + IP_address_video + " 'nohup /home/pi/RPi4_behavior_boxes/record_video_test.py " - + session_info["basename"] - + " >> " + session_info['dir_name'] + "/" + session_info['basename'] + ".log 2>&1 & ' " # file descriptors -) - -#start recording -os.system(tempstr) - -#delay -time.sleep(10) - -os.system("ssh pi@" + IP_address_video + " /home/pi/RPi4_behavior_boxes/stop_video_test") -time.sleep(2) -hostname = socket.gethostname() -print("Moving video files from " + hostname + "video to " + hostname + ":") - -# base_dir = '/mnt/hd/' -# path = os.path.join(base_dir, session_info['basename']) -# -# # Move the video from the box_video SD card to the box_behavior external hard drive -# os.system( -# "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":" + session_info['dir_name'] + "/*.h264 " # this could be a problem .avi -# + path -# ) -# -# # Move the video log from the box_video SD card to the box_behavior external hard drive -# os.system( -# "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":" + session_info["dir_name"] + "/*.log " -# + path -# ) \ No newline at end of file diff --git a/obsolete/run_flip_task.py b/obsolete/run_flip_task.py deleted file mode 100755 index 7e56b5d..0000000 --- a/obsolete/run_flip_task.py +++ /dev/null @@ -1,27 +0,0 @@ -from FlipperOutput import FlipperOutput -from fake_session_info import fake_session_info -from time import sleep -import sys - -# def signal_handler(signum): -# print("SIGINT detected") -# FlipperOutput.close() -# print('Closing the output.') -# sys.exit(0) -# -# signal.signal(signal.SIGINT, signal_handler) - -with FlipperOutput(fake_session_info, pin=4) as flip_box: - try: - flip_box.flip() - sleep(30) - flip_box.close() - except KeyboardInterrupt: - print("try to interrupt") - flip_box.close() - print("Closing the output.") - except Exception as e: - print("Exception!") - flip_box.close() - print("Closing the output.") - print(e) diff --git a/obsolete/run_headfixed2FC_task.py b/obsolete/run_headfixed2FC_task.py deleted file mode 100644 index d6799a3..0000000 --- a/obsolete/run_headfixed2FC_task.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env -S ipython3 -i -# run_headfixed2FC_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: run_headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training run task file -description: - an updated test version of run_headfixed_task.py - -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from headfixed2FC_task import Headfixed2FCTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/headfixed2FC_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - from task_information_headfixed2FC import TaskInformation - - task_information = TaskInformation() - # print("Imported task_information_headfixed: " + str(task_information.name)) - - task = Headfixed2FCTask(name="headfixed2FC_task", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) ## wll add in the session info - t_end = time.time() + 60 * t_minute - block_count = 0 ## can be replaced with task.block_count - while time.time() < t_end: - if block_count==0: - block_number = session_info["block_number"] #random.randint(1, session_info["block_variety"]) - block_count = block_count + 1 - else: - block_number = 3-block_number # it's either or 1 or 2 - block_count = block_count+1 - #task.block_number = block_number - - #if ((block_number != 1 ) || (block_number != 2) ): - # print('check_block number!!!!') - # block_number = 1 - task.correct_trial_in_block = 0 - while task.correct_trial_in_block <= session_info['block_duration']: # while total correct trial is not fullfilled - if time.time() >= t_end: - print("Times up, finishing up") - break - first_card = True - task.error_count = 0 - print("Trial " + str(task.trial_number) + " \n") - task.trial_number += 1 - print("*******************************\n") - task.current_card = task_information.draw_card(block_number, session_info['phase']) - logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) - print("Block " + str(block_number) + - " - Current card condition: \n" + - "*******************************\n" + - "*Cue: " + str(task.current_card[0]) + "\n" + - "*Choice: " + str(task.current_card[1]) + "\n" + - "*Reward: " + str(task.current_card[2]) + "\n") - while first_card or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ - "error_max"]): - if time.time() >= t_end: - print("Times up, finishing up") - break - if task.error_repeat: - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - print("*error_repeat trial* \n" + "Block " + str(block_number) + - " - Current card condition: \n" + - "*******************************\n" + - "*Cue: " + str(task.current_card[0]) + "\n" + - #"*State: " + str(task.current_card[1]) + "\n" + - "*Choice: " + str(task.current_card[1]) + "\n" + - "*Reward: " + str(task.current_card[2]) + "\n") - task.trial_number += 1 - first_card = False - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() diff --git a/obsolete/run_headfixed_task.py b/obsolete/run_headfixed_task.py deleted file mode 100644 index e128c38..0000000 --- a/obsolete/run_headfixed_task.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env -S ipython3 -i -# run_headfixed_task.py -""" -author: tian qiu -date: 2022-03-16 -name: run_headfixed_task.py -goal: model_based reinforcement learning behavioral training run task file -description: - an updated test version of run_soyoun_task.py - -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from headfixed_task import HeadfixedTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/headfixed_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - from task_information_headfixed import TaskInformation - - task_information = TaskInformation() - # print("Imported task_information_headfixed: " + str(task_information.name)) - - task = HeadfixedTask(name="headfixed_task", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - while time.time() < t_end: - block_number = random.randint(1, session_info["block_variety"]) - for block in range(session_info["block_duration"]): - if time.time() >= t_end: - print("Times up, finishing up") - break - first_card = True - task.error_count = 0 - print("Trial " + str(block) + " \n") - task.trial_number += 1 - print("*******************************\n") - task.current_card = task_information.draw_card(block_number, session_info['phase']) - logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) - print("Block " + str(block_number) + - " - Current card condition: \n" + - "*******************************\n" + - "*Cue: " + str(task.current_card[0]) + "\n" + - "*State: " + str(task.current_card[1]) + "\n" + - "*Choice: " + str(task.current_card[2]) + "\n" + - "*Reward: " + str(task.current_card[3]) + "\n") - while first_card or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ - "error_max"]): - if time.time() >= t_end: - print("Times up, finishing up") - break - if task.error_repeat: - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - print("*error_repeat trial* \n" + "Block " + str(block_number) + - " - Current card condition: \n" + - "*******************************\n" + - "*Cue: " + str(task.current_card[0]) + "\n" + - "*State: " + str(task.current_card[1]) + "\n" + - "*Choice: " + str(task.current_card[2]) + "\n" + - "*Reward: " + str(task.current_card[3]) + "\n") - task.trial_number += 1 - first_card = False - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() diff --git a/obsolete/run_lick_task.py b/obsolete/run_lick_task.py deleted file mode 100644 index 2900780..0000000 --- a/obsolete/run_lick_task.py +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from lick_task import LickTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - task_info_path = '/home/pi/experiment_info/headfixed_task/session_info' - sys.path.insert(0, task_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - # initiate task object\ - task = LickTask(name="head_fxied_lick", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - sleep(10) - # loop over trials - t_minute = int(input("Enter the time in minutes: ")) - # t_minute = 20 - t_end = time.time() + 60 * t_minute - duration_buffer = 10 - - while time.time() < t_end: - logging.info(str("##############################\n" + - str(time.time())) + ", starting_trial" + - str("\n##############################")) - - task.trial_start() - - while task.trial_running: - task.run() - - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - pygame.quit() - - -# # exit because of error -# except (RuntimeError) as ex: -# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) -# # save dicts to disk -# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) -# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - - - - diff --git a/obsolete/run_season_task.py b/obsolete/run_season_task.py deleted file mode 100644 index 046b338..0000000 --- a/obsolete/run_season_task.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from kelly_task import KellyTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - task_info_path = '/home/pi/experiment_info/kelly_task/session_info' - sys.path.insert(0, task_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info['datetime'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - - # make data directory and initialize logfile - os.makedirs( session_info['dir_name'] ) - os.chdir( session_info['dir_name'] ) - session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - # initiate task object\ - task = KellyTask(name="fentanyl_task", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - sleep(10) - - # loop over trials - for i in range(1000): - logging.info(str("##############################\n" + - str(time.time())) + ", starting_trial, " + str(i) + - str("\n##############################")) - - task.trial_start() - - while task.trial_running: - task.run() - - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - pygame.quit() - - -# # exit because of error -# except (RuntimeError) as ex: -# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) -# # save dicts to disk -# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) -# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - - - - diff --git a/obsolete/run_soyoun_task.py b/obsolete/run_soyoun_task.py deleted file mode 100644 index 0168df5..0000000 --- a/obsolete/run_soyoun_task.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import threading -import sys -import time -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style - -from time import sleep - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from soyoun_task import SoyounTask - - -def _terminate(): - print('terminating the session') - sys.exit() - - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - session_info_path = '/home/pi/experiment_info/headfixed_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - # initiate task object\ - try: - logging.info(str(time.time()) + ", trying to retrieve task_information from the ~/experiment_info/*") - full_module_name = 'task_information_headfixed' - import sys - - task_info_path = '/home/pi/experiment_info/headfixed_task/task_information/' - sys.path.insert(0, task_info_path) - tempmod = importlib.import_module(full_module_name) - task_information = tempmod.task_information - except: - logging.info(str(time.time()) + ", failed to retrieve task_information from the default path.\n" + - "Now, try to load the task_information from the local directory ...") - from task_information_phase_1 import task_information - - # self.task_information = task_information - task = SoyounTask(name="headfixed_task", session_info=session_info, task_information=task_information) - - # def run_soyoun_task(): - session_length = int(input("Enter the duration of session (in seconds): ")) - terminate_timer = threading.Timer(session_length, _terminate) - while True: - terminate_timer.start() - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - - block_deck = task.generate_deck(current_block, block_duration, consecutive control) - - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# # exit because of error -# except (RuntimeError) as ex: -# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) -# # save dicts to disk -# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) -# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) diff --git a/obsolete/run_visualization_task.py b/obsolete/run_visualization_task.py deleted file mode 100644 index 764e933..0000000 --- a/obsolete/run_visualization_task.py +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from visualization_task import VisualizationTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - # datestr = datetime.now().strftime("%Y-%m-%d") - # timestr = datetime.now().strftime('%H%M%S') - # full_module_name = 'session_info_' + datestr - # import sys - # task_info_path = '/home/pi/experiment_info/kelly_task/session_info' - # sys.path.insert(0, task_info_path) - # tempmod = importlib.import_module(full_module_name) - # session_info = tempmod.session_info - # mouse_info = tempmod.mouse_info - # - # session_info['date'] = datestr - # session_info['time'] = timestr - # session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - # session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - # session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - # if session_info['manual_date'] != session_info['date']: # check if file is updated - # print('wrong date!!') - # raise RuntimeError('manual_date field in session_info file is not updated') - # - # - # # make data directory and initialize logfile - # os.makedirs(session_info['dir_name']) - # os.chdir(session_info['dir_name']) - # session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - # # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] - # logging.basicConfig( - # level=logging.INFO, - # format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - # datefmt=('%H:%M:%S'), - # handlers=[ - # logging.FileHandler(session_info['file_basename'] + '.log'), - # logging.StreamHandler() # sends copy of log output to screen - # ] - # ) - - # initiate task object - from fake_session_info import fake_session_info - - session_info = fake_session_info - task = VisualizationTask(name="visualization_task", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # # start session - # task.start_session() - # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - # pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - # sleep(10) - # loop over trials - for i in range(2): - logging.info(str("##############################\n" + - str(time.time())) + ", starting_trial, " + str(i) + - str("\n##############################")) - - task.trial_start() - - while task.trial_running: - task.run() - - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - pygame.quit() - - -# # exit because of error -# except (RuntimeError) as ex: -# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) -# # save dicts to disk -# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) -# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - - - - diff --git a/obsolete/run_walk_task.py b/obsolete/run_walk_task.py deleted file mode 100644 index a56a2f7..0000000 --- a/obsolete/run_walk_task.py +++ /dev/null @@ -1,163 +0,0 @@ -#run_self_admin.task - -#!/usr/bin/env -S ipython3 -i -# run_self_admin_task.py -""" -author: tian qiu -date: 2023-01-25 -name: run_walk_task.py -goal: a simplified headfixed task -description: - adapted from Mitch's run_self_admin_task.py - -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from walk_task import WalkTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/walk_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - - task = WalkTask(name="walk_task", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - while time.time() < t_end: - # session_info["block_duration"] indicate how many successful trials - # does it take to the session to finish - # first_card = True - task.innocent = True - task.error_count = 0 - random_cue = random.randint(0,1) - if random_cue: - task.current_cue = "left" - else: - task.current_cue = "right" - - print("*******************************\n") - print("Trial " + str(task.trial_number) + "; Side" + task.current_cue + "\n") - task.trial_number += 1 - print("*******************************\n") - - logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_cue) + "_LED") - while task.innocent or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ - "error_max"]): - if time.time() >= t_end: - print("Times up, finishing up") - break - if task.innocent: - task.innocent = False - if task.error_repeat: - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - task.trial_number += 1 - # first_card = False - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() diff --git a/obsolete/session_info_headfixed.py b/obsolete/session_info_headfixed.py deleted file mode 100644 index 9ef907c..0000000 --- a/obsolete/session_info_headfixed.py +++ /dev/null @@ -1,89 +0,0 @@ -# session_info_headfixed.py - -# put all of your mouse and session info in here - -from datetime import datetime -import os -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -#session_info['basedir'] = '/home/pi/video' -session_info['weight'] = 32.18 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -# session_info['config'] = 'freely_moving_v1' -session_info['config'] = 'head_fixed_v1' - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters -session_info["lick_threshold"] = 2 -# visual stimulus -session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', -# '/home/pi/second_grating.dat'] -# session_info['vis_raws'] = [] - -# task related information - -session_info['config'] = 'headfixed_soyoun' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True -session_info['phase'] = 1 - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 1 # cm - session_info['treadmill_setup']['distance_short'] = 3 # cm - session_info['treadmill_setup']['distance_long'] = 5 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info['cue'] = ['sound', 'LED', 'sound+LED'] -session_info['state'] = ['distance_short', 'distance_long'] # treadmill distance -session_info['choice'] = ['right', 'left'] # lick port -session_info['reward'] = ['small', 'large'] # reward size -session_info['reward_size'] = {'small': 5, 'large': 10} - -if session_info['phase'] == 1: - session_info['reward_size'] = {'small': 20, 'large': 20} - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['reward_timeout'] = 60 -session_info["punishment_timeout"] = 1 - -# define block_duration and initial block to start the session -session_info['block_duration'] = 5 # each block has this amount of repetition -session_info['block_variety'] = 2 -if session_info['block_variety'] > 1: - session_info['initial_block'] = 1 - -# # allowing user defined initial_block and initial setup for conditions? -# task_information["initial_block"] = 1 -# -# allowing consecutive repeated trial? -session_info['consecutive_control'] = True -if session_info['consecutive_control']: - session_info['consecutive_max'] = 3 \ No newline at end of file diff --git a/obsolete/session_info_headfixed2FC.py b/obsolete/session_info_headfixed2FC.py deleted file mode 100644 index 8136923..0000000 --- a/obsolete/session_info_headfixed2FC.py +++ /dev/null @@ -1,88 +0,0 @@ -# put all of your mouse and session info in here - -from datetime import datetime -import os -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -# session_info['basedir'] = '/home/pi/video' -session_info['weight'] = 0.0 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() -session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts - -session_info['config'] = 'headfixed2FC' - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters -session_info["lick_threshold"] = 1 -# visual stimulus -session_info["visual_stimulus"] = False - -session_info['config'] = 'headfixed2FC' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True -session_info['phase'] = 'forced_choice' - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_cue'] = 5 # cm - session_info['treadmill_setup']['distance_initiation'] = 10 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info['cue'] = ['LED_L', 'LED_R', 'all'] -# session_info['state'] = ['block1', 'block2'] # -session_info['choice'] = ['right', 'left'] # lick port -session_info['reward'] = ['small', 'large'] # reward size -session_info['reward_size'] = {'small': 5, 'large': 10} -session_info['reward_deviation'] = 1 - -if session_info['phase'] == 1: - session_info['reward_size'] = {'small': 10, 'large': 10} - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['reward_timeout'] = 60 -session_info["punishment_timeout"] = 3 - -# define block_duration and initial block to start the session -session_info['block_duration'] = 30 # each block has this amount of repetition -session_info['block_variety'] = 2 -if session_info['block_variety'] > 1: - session_info['initial_block'] = 1 - -session_info['consecutive_control'] = False -if session_info['consecutive_control']: - session_info['consecutive_max'] = 3 - -session_info["calibration_coefficient"] = {} - -session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first -session_info["calibration_coefficient"]['2'] = [0.13, 0] -session_info["calibration_coefficient"]['3'] = [0.13, 0.0] -session_info["calibration_coefficient"]['4'] = [0.13, 0.0] - -session_info['air_duration'] = 0 -session_info["vacuum_duration"] = 1 -session_info["key_reward_amount"] = 5 \ No newline at end of file diff --git a/obsolete/session_info_walk.py b/obsolete/session_info_walk.py deleted file mode 100644 index 6078166..0000000 --- a/obsolete/session_info_walk.py +++ /dev/null @@ -1,64 +0,0 @@ -# session_info_walk.py - -# put all of your mouse and session info in here - -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' - -session_info['weight'] = 32.18 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -# session_info['config'] = 'freely_moving_v1' -session_info['config'] = 'head_fixed_walk' - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters -session_info["lick_threshold"] = 2 -# visual stimulus -session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', -# '/home/pi/second_grating.dat'] -# session_info['vis_raws'] = [] - -# task related information - -session_info['config'] = 'headfixed_walk' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 10 # cm - session_info['treadmill_setup']['distance_cue'] = 25 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info['cue'] = ['sound', 'LED', 'sound+LED'] -session_info['reward_size'] = 5 - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['reward_timeout'] = 60 -session_info["punishment_timeout"] = 1 diff --git a/obsolete/soyoun_task.py b/obsolete/soyoun_task.py deleted file mode 100644 index ec0d395..0000000 --- a/obsolete/soyoun_task.py +++ /dev/null @@ -1,327 +0,0 @@ -# python3: soyoun_task.py -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class SoyounTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and task_information should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - if kwargs.get("task_information", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no task_information supplied; making fake one" - + Style.RESET_ALL - ) - from task_information_phase_1 import task_information - - self.task_information = task_information - else: - self.task_information = kwargs.get("task_information", None) - ic(self.task_information) - - self.error_repeat = self.task_information['error_repeat'] - self.error_count_max = self.task_information['error_repeat_max'] - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name='draw', - on_enter=["enter_draw"], - on_exit=["exit_draw"], - timeout=0, - on_timeout=["play_game"] - ), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.task_information["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.task_information["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.task_information["reward_timeout"] + - self.task_information["reward_wait"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'draw'], # format: ['trigger', 'origin', 'destination'] - ['play_game', 'draw', 'initiate'], - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.session_length = len(self.task_information["block_list"]) - self.trial_running = False - self.restart_flag = False - # self.restart_flag_inter = False - - self.trial_number = 0 - self.error_count = 0 - self.card_count = -1 - self.deck = self.task_information["deck"] - self.current_card = None - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = behavbox.Pump() - self.treadmill = self.box.treadmill - self.distance_initiation = self.task_information['treadmill_setup']['distance_initiation'] - self.distance_buffer = self.treadmill.distance_cm - self.distance_diff = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - if self.state == "standby": - pass - elif self.state == "draw": - self.play_game() - # elif self.restart_flag: - # self.restart() - elif self.state == "initiate": - if self.distance_buffer: - self.distance_diff = self.treadmill.distance_cm - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.distance_buffer = self.treadmill.distance_cm - self.distance_diff = 0 - self.start_cue() - else: - self.error_count += 1 - - elif self.state == "cue_state": - if self.distance_buffer: - self.distance_diff = self.treadmill.distance_cm - self.distance_buffer - distance_required = self.task_information['treadmill_setup'][ - self.task_information["state"][self.current_card[1]]] - if self.distance_diff >= distance_required: - self.distance_buffer = self.treadmill.distance_cm - self.distance_diff = 0 - self.evaluate_reward() - else: - self.error_count += 1 - self.restart_flag = True - # logging.info(str(time.time()) + ", " + str( - # self.trial_number) + ", treadmill state distance did not pass") - - elif self.state == "reward_available": - # first detect the lick signal: - cue_state = self.current_card[0] - side_choice = self.task_information['choice'][self.current_card[2]] - # question: do we want entry mark as lick? - side_mice = None - if event_name == "left_IR_entry": - side_mice = 'left' - elif event_name == "right_IR_entry": - side_mice = 'right' - if side_mice: - reward_size = self.task_information['reward'][self.current_card[3]] - if cue_state == 2: - self.pump.reward(side_mice, self.task_information["reward_size"][reward_size]) - elif side_choice == side_mice: - if side_mice == 'left': - reward_side = '1' - elif side_mice == 'right': - reward_side = '2' - # reward_size = self.task_information['reward'][self.current_card[3]] - self.pump.reward(reward_side, self.task_information["reward_size"][reward_size]) - else: - self.error_count += 1 - self.restart_flag = True - self.restart() - else: - self.error_count += 1 - self.restart_flag = True - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering standby, prepare to start the trial...") - self.trial_running = False - # if self.restart_flag: - # time.sleep(self.task_information["punishment_timeout"]) - # pass - time.sleep(self.task_information["reward_wait"]) - - def exit_standby(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting standby") - self.trial_number += 1 - pass - - def enter_draw(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering draw") - if self.card_count >= self.session_length: - self.trial_running = False # terminate the state machine, end the session - elif self.error_repeat and (self.error_count < self.error_count_max): - self.trial_running = True - else: - self.restart_flag = False - self.trial_running = True - - def exit_draw(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting draw") - # if self.restart_flag: - # # self.error_count += 1 - # self.restart_flag = False - # else: - # self.card_count += 1 - # # print(str(self.card_count)) - # self.current_card = self.deck[self.card_count] - - print(str(self.current_card)) - card_cue = self.task_information['cue'][self.current_card[0]] - card_state = self.task_information['state'][self.current_card[1]] - card_choice = self.task_information['choice'][self.current_card[2]] - card_reward = self.task_information['reward'][self.current_card[3]] - print("****************************\n" + - "Current card condition: \n" + - "****************************\n" + - "*Cue: " + str(card_cue) + "\n" + - "*State: " + str(card_state) + "\n" + - "*Choice: " + str(card_choice) + "\n" + - "*Reward: " + str(card_reward) + "\n") - - def enter_initiate(self): - # check error_repeat - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering initiate") - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.treadmill.distance_cm - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", treadmill distance t0: " + str(self.distance_buffer)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting initiate") - self.distance_buffer = self.treadmill.distance_cm - self.restart_flag = True - - def enter_cue_state(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering cue state") - # turn on the cue according to the current card - self.check_cue(self.task_information['cue'][self.current_card[0]]) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.treadmill.distance_cm - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", treadmill distance t0: " + str(self.distance_buffer)) - - def exit_cue_state(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting cue state") - self.cue_off(self.task_information['cue'][self.current_card[0]]) - - def enter_reward_available(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering reward available") - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied, treadmill: " + str(self.treadmill.distance_cm)) - self.cue_off(self.task_information['cue'][self.current_card[0]]) - - def exit_reward_available(self): - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting reward available") - pass - - def check_cue(self, cue): - if cue == 'sound': - self.box.sound1.on() # could be modify according to specific sound cue - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cue sound1 on") - elif cue == 'LED': - self.box.cueLED1.on() - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cueLED1 on") - else: - self.box.sound1.on() - self.box.cueLED1.on() - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", sound1 + cueLED1 on (free choice)") - - def cue_off(self, cue): - if cue == 'sound': - self.box.sound1.off() # could be modify according to specific sound cue - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cue sound1 off") - elif cue == 'LED': - self.box.cueLED1.off() - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cueLED1 off") - else: - self.box.sound1.off() - self.box.cueLED1.off() - logging.info(str(time.time()) + ", " + str(self.trial_number) + ", sound1 + cueLED1 off (free choice)") - - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() \ No newline at end of file diff --git a/obsolete/task_information_headfixed.py b/obsolete/task_information_headfixed.py deleted file mode 100644 index ecaded9..0000000 --- a/obsolete/task_information_headfixed.py +++ /dev/null @@ -1,77 +0,0 @@ -# Python3: task_information_2022_02_14.py -import random - - -class TaskInformation(object): - def __init__(self, **kwargs): - self.name = "model_based_reinforcement_learning_task" - self.block = { - 1: [ - # block_1 forced component - ('LED', 'distance_short', 'right', 'large', '2'), # 0, 1 index for corresponding condition setup - ('LED', 'distance_long', 'left', 'large', '1'), # forced choice block 1 - - ('sound', 'distance_short', 'left', 'small', '3'), - # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount - ('sound', 'distance_long', 'right', 'small', '4'), - - # each row is a combination of the condition parameter for block 1 - # block_1 free component - # modification on block_1 free component - ('sound+LED', 'distance_short', ('left', 'right'), ('small', 'large'), ('3','2')), - ('sound+LED', 'distance_long', ('left', 'right'), ('large', 'small'), ('1','4')) - # """old version""" - # # ('sound+LED', 'distance_short', 'right', 'large', '2'), # free choice block 1 - # # ('sound+LED', 'distance_short', 'left', 'small', '3'), # LED - # # # 0, 1 index for corresponding condition setup, 2 in column 0 - # # ('sound+LED', 'distance_long', 'left', 'large', '1'), # means both cues are on - # # ('sound+LED', 'distance_long', 'right', 'small', '4') - # """old version ends here""" - ], - 2: [ - # block_2 forced component - ('LED', 'distance_short', 'right', 'small', '2'), # 0, 1 index for corresponding condition setup - ('LED', 'distance_long', 'left', 'small', '1'), # forced choice block 1 - - ('sound', 'distance_short', 'left', 'large', '3'), - # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount - ('sound', 'distance_long', 'right', 'large', '4'), - - # each row is a combination of the condition parameter for block 1 - # modification on block_1 free component - ('sound+LED', 'distance_short', ('left', 'right'), ('large', 'small'), ('3','2')), - ('sound+LED', 'distance_long', ('left', 'right'), ('small', 'large'), ('1','4')) - # """old version""" - # ('sound+LED', 'distance_short', 'right', 'small', '2'), # free choice block 1 - # ('sound+LED', 'distance_short', 'left', 'large', '3'), - # # 0, 1 index for corresponding condition setup, 2 in column 0 - # ('sound+LED', 'distance_long', 'left', 'small', '1'), # means both cues are on # sound - # ('sound+LED', 'distance_long', 'right', 'large', '4') - # """old version ends here""" - ]} - - def draw_card(self, block_key, phase="final"): - row_start = 0 - row_end = 5 - if phase == 'final': - pass - elif phase == 'forced_choice': - row_end = 3 - elif phase == 'free_choice': - # """old version""" - row_start = 4 - # row_end = 7 - # """old version ends here""" - row_start = 4 - elif phase == 'forced_choice_LED': - row_end = 1 - elif phase == 'forced_choice_sound': - row_start = 2 - row_end = 3 - block_map = self.block[block_key] - row_index = random.randint(row_start, row_end) - print(str(row_index)) - card = block_map[row_index] - - return card -# print(TaskInformation().draw_card(2,'free_choice')) diff --git a/obsolete/task_information_headfixed2FC.py b/obsolete/task_information_headfixed2FC.py deleted file mode 100644 index 4c3d3a2..0000000 --- a/obsolete/task_information_headfixed2FC.py +++ /dev/null @@ -1,42 +0,0 @@ -import random - - -class TaskInformation(object): - def __init__(self, **kwargs): - self.name = "model_based_reinforcement_learning_task" - self.block = { - 1: [ - # block_1 forced component - ('LED_L', 'left', 'large', '1'), # forced choice block 1 - ('LED_R', 'right', 'small', '2'), # 0, 1 index for corresponding condition setup - # block_1 free component - ('all', ('left', 'right'), ('large', 'small'), ('1','2')) - ], - 2: [ - # block_2 forced component - ('LED_L', 'left', 'small', '1'), # forced choice block 1 - ('LED_R', 'right', 'large', '2'), # 0, 1 index for corresponding condition setup - ('all', ('left', 'right'), ('small', 'large'), ('1','2')) - ]} - - def draw_card(self, block_key, phase="final"): - row_start = 0 - row_end = 2 - if phase == 'final': - pass - elif phase == 'forced_choice': - row_end = 1 - elif phase == 'free_choice': - row_start = 2 - elif phase == 'forced_choice_left': - row_end = 0 - elif phase == 'forced_choice_right': - row_start = 1 - row_end = 1 - block_map = self.block[block_key] - row_index = random.randint(row_start, row_end) - print(str(row_index)) - card = block_map[row_index] - - return card -# print(TaskInformation().draw_card(2,'free_choice')) diff --git a/obsolete/task_information_lick.py b/obsolete/task_information_lick.py deleted file mode 100644 index cb639b1..0000000 --- a/obsolete/task_information_lick.py +++ /dev/null @@ -1,134 +0,0 @@ -# Python3: task_information_2022_02_14.py -import collections -import itertools -import random - -task_information = collections.OrderedDict() -task_information['experiment_setup'] = 'headfixed' -task_information['treadmill_setup'] = {'present': True} - -# if task_information['treadmill_setup']['present']: -# task_information['treadmill_setup']['distance_initiation'] = 5 # cm -# task_information['treadmill_setup']['distance_short'] = 7 # cm -# task_information['treadmill_setup']['distance_long'] = 30 # cm -# else: -# task_information['treadmill_setup'] = None -# -# task_information['error_repeat'] = True -# if task_information['error_repeat']: -# task_information['error_repeat_max'] = 3 - -# condition setup -task_information['cue'] = ['sound', 'LED', 'sound+LED'] -# task_information['state'] = ['distance_short', 'distance_long'] # treadmill distance -# task_information['choice'] = ['right', 'left'] # lick port -# task_information['reward'] = ['small', 'large'] # reward size -task_information['reward_size'] = {'small': 5, 'large': 10} - -# define timeout during each condition -task_information['initiation_timeout'] = 5 # s -task_information['standby_wait'] = 1 -task_information['cue_timeout'] = 5 -task_information['reward_timeout'] = 5 -task_information["reward_wait"] = 5 -task_information["punishment_timeout"] = 1 - -# # block setup -# task_information['block'] = {} -# task_information['block'][1] = [ -# # block_1 forced component -# (1, 0, 0, 1), # forced choice block 1 -# (1, 1, 1, 1), # 0, 1 index for corresponding condition setup -# (0, 0, 1, 0), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount -# (0, 1, 0, 0), # each row is a combination of the condition parameter for block 1 -# # block_1 free component -# (2, 0, 0, 1), # free choice block 1 -# (2, 0, 1, 0), # 0, 1 index for corresponding condition setup, 2 in column 0 -# (2, 1, 0, 0), # means both cues are on -# (2, 1, 0, 1)] # each row is a combination of the condition parameter for block 1 -# -# task_information['block'][2] = [ -# # block_2 forced component -# (1, 0, 0, 0), # forced choice block 2 -# (1, 1, 1, 0), # 0, 1 index for corresponding condition setup -# (0, 0, 1, 1), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount -# (0, 1, 0, 1), # each row is a combination of the condition parameter for block 1 -# # block_2 free component -# (2, 0, 0, 0), # free choice block 2 -# (2, 0, 1, 1), # 0, 1 index for corresponding condition setup, None in column 0 -# (2, 1, 0, 1), # means both cues are on -# (2, 1, 0, 0)] # each row is a combination of the condition parameter for block 1 -# -# # define block_duration and initial block to start the session -# block_duration = 2 # each block has this amount of repetition -# block_variety = 2 -# if block_variety > 1: -# initial_block = 1 -# -# # now shuffle and make a deck for this session -# # shuffle requirement -# -# # # allowing user defined initial_block and initial setup for conditions? -# # task_information["initial_block"] = 1 -# # -# # allowing consecutive repeated trial? -# consecutive_control = True -# if consecutive_control: -# consecutive_max = 3 -# -# -# def generate_block_sequence(number_block, sequence_length, initial_character): -# if not initial_character: -# initial_character = random.randint(1, 2) -# if number_block == 1: -# sequence = [initial_character] -# else: -# if initial_character - 1: -# sequence = [initial_character, initial_character - 1] -# else: -# sequence = [initial_character, initial_character + 1] -# sequence = sequence * sequence_length -# return sequence -# -# # -# # the block list is used for 1) generate a shuffled deck; 2) a list for keeping track of what block is the -# # current card is located -# block_list = generate_block_sequence(block_variety, block_duration, initial_block) -# -# -# task_information["block_list"] = list( -# itertools.chain.from_iterable(itertools.repeat(iterate, block_duration) for iterate in block_list)) -# -# -# def generate_deck(duration, consecutive_permit, repetition_max): -# consecutive_count = 0 -# row_buffer = -1 -# deck_list = [] -# for iteration in range(duration): -# row_index = random.randrange(0, 8) -# while True: -# if row_index == row_buffer and consecutive_permit: -# if consecutive_count >= repetition_max: -# row_index = random.randrange(0, 8) -# else: -# break -# else: -# break -# row_buffer = row_index -# deck_list.append(row_index) -# return deck_list -# -# -# def shuffle(block_sequence, duration_block): -# deck = [] -# for block in block_sequence: -# deck_list_buffer = generate_deck(duration_block, consecutive_control, consecutive_max) -# current_deck = [] -# block_map = task_information['block'][block] -# for row_index in deck_list_buffer: -# current_deck.append(block_map[row_index]) -# deck.extend(current_deck) -# return deck -# -# -# task_information["deck"] = shuffle(block_list, block_duration) diff --git a/obsolete/task_information_phase_1.py b/obsolete/task_information_phase_1.py deleted file mode 100644 index 45738e9..0000000 --- a/obsolete/task_information_phase_1.py +++ /dev/null @@ -1,158 +0,0 @@ -# Python3: task_information_2022_02_14.py -import collections -import itertools -import random - -task_information = collections.OrderedDict() -task_information['experiment_setup'] = 'headfixed' -task_information['treadmill_setup'] = {'present': True} -task_information['phase'] = 1 - -if task_information['treadmill_setup']['present']: - task_information['treadmill_setup']['distance_initiation'] = 5 # cm - task_information['treadmill_setup']['distance_short'] = 7 # cm - task_information['treadmill_setup']['distance_long'] = 30 # cm -else: - task_information['treadmill_setup'] = None - -task_information['error_repeat'] = True -if task_information['error_repeat']: - task_information['error_repeat_max'] = 3 - -# define timeout during each condition -task_information['initiation_timeout'] = 5 # s -task_information['cue_timeout'] = 5 -task_information['reward_timeout'] = 5 -task_information["reward_wait"] = 5 -task_information["punishment_timeout"] = 1 -# condition setup -task_information['reward_size'] = {'small': 5, 'large': 10} - -# condition parameters -task_information['cue'] = ['sound', 'LED', 'sound+LED'] -task_information['state'] = ['distance_short', 'distance_long'] # treadmill distance -task_information['choice'] = ['right', 'left'] # lick port -task_information['reward'] = ['small', 'large'] # reward size - - -if task_information['phase'] == 1: - task_information['reward_size'] = {'small': 5, 'large': 5} - -# define block_duration and initial block to start the session -block_duration = 2 # each block has this amount of repetition -block_variety = 1 -initial_block = 1 - -# allowing consecutive repeated trial? -consecutive_control = True -consecutive_max = 3 - -# below is static -# block setup -task_information['block'] = {} -task_information['block'][1] = [ - # block_1 forced component - (1, 0, 0, 1), # forced choice block 1 - (1, 1, 1, 1)#, # 0, 1 index for corresponding condition setup - #(0, 0, 1, 0), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount - #(0, 1, 0, 0)#, # each row is a combination of the condition parameter for block 1 - # # block_1 free component - # (2, 0, 0, 1), # free choice block 1 - # (2, 0, 1, 0), # 0, 1 index for corresponding condition setup, 2 in column 0 - # (2, 1, 0, 0), # means both cues are on - # (2, 1, 0, 1)] # each row is a combination of the condition parameter for block 1 - ] - -task_information['block'][2] = [ - # block_2 forced component - (1, 0, 0, 0), # forced choice block 2 - (1, 1, 1, 0)#, # 0, 1 index for corresponding condition setup - #(0, 0, 1, 1), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount - #(0, 1, 0, 1)#, # each row is a combination of the condition parameter for block 1 - # # block_2 free component - # (2, 0, 0, 0), # free choice block 2 - # (2, 0, 1, 1), # 0, 1 index for corresponding condition setup, None in column 0 - # (2, 1, 0, 1), # means both cues are on - # (2, 1, 0, 0)] # each row is a combination of the condition parameter for block 1 - ] - -if initial_block is False: - initial_block = random.randrange(1, 2) - -# now shuffle and make a deck for this session -# shuffle requirement - -# # allowing user defined initial_block and initial setup for conditions? -# task_information["initial_block"] = 1 -# - - -# if block_variety == 1: -# consecutive_control = False -# consecutive_max = 0 - - - -def generate_block_sequence(number_block, sequence_length, initial_character): - # if not initial_character: - # initial_character = random.randint(1, 2) - if block_variety == 1: - sequence = [initial_character] * sequence_length - else: - if number_block == 1: - sequence = [initial_character] - else: - if initial_character - 1: - sequence = [initial_character, initial_character - 1] - else: - sequence = [initial_character, initial_character + 1] - sequence = sequence * sequence_length - return sequence - - -# the block list is used for 1) generate a shuffled deck; 2) a list for keeping track of what block is the -# current card is located -block_list = generate_block_sequence(block_variety, block_duration, initial_block) - - -task_information["block_list"] = list( - itertools.chain.from_iterable(itertools.repeat(iterate, block_duration) for iterate in block_list)) - - -def generate_deck(duration, consecutive_permit, repetition_max): - consecutive_count = 0 - row_buffer = -1 - deck_list = [] - for iteration in range(duration): - row_index = random.randrange(0, 2) # for forced choice only - # row_index = random.randrange(0, 8) - # while True: - if row_index == row_buffer and consecutive_permit: - consecutive_count += 1 - if consecutive_count > repetition_max: - while row_index == row_buffer: - row_index = random.randrange(0, 2) # for forced choice only - # row_index = random.randrange(0, 8) - # else: - # break - # else: - # break - row_buffer = row_index - deck_list.append(row_index) - return deck_list - - -def shuffle(block_sequence, duration_block): - deck = [] - for block in block_sequence: - deck_list_buffer = generate_deck(duration_block, consecutive_control, consecutive_max) - current_deck = [] - block_map = task_information['block'][block] - for row_index in deck_list_buffer: - current_deck.append(block_map[row_index]) - deck.extend(current_deck) - return deck - - -task_information["deck"] = shuffle(block_list, block_duration) -print(task_information["deck"]) \ No newline at end of file diff --git a/obsolete/test_session_info.py b/obsolete/test_session_info.py deleted file mode 100755 index ac12b2c..0000000 --- a/obsolete/test_session_info.py +++ /dev/null @@ -1,23 +0,0 @@ -# fake test_session_info file (used for testing) - -import collections, socket -from datetime import datetime - -test_session_info = collections.OrderedDict() -test_session_info['mouse_name'] = 'testmouse' -test_session_info['basedir'] = '/home/pi/video' -test_session_info['date'] = datetime.now().strftime("%Y-%m-%d") -test_session_info['time'] = datetime.now().strftime('%H%M%S') -test_session_info['datetime'] = test_session_info['date'] + '_' + test_session_info['time'] -test_session_info['basename'] = test_session_info['mouse_name'] + '_' + test_session_info['datetime'] -test_session_info['box_name'] = socket.gethostname() -test_session_info['dir_name'] = test_session_info['basedir'] + "/" + test_session_info['mouse_name'] + "_" + test_session_info['datetime'] -# test_session_info['config'] = 'freely_moving_v1' -test_session_info['config'] = 'head_fixed_v1' -test_session_info['timeout_length'] = 5 # in seconds -test_session_info['reward_size'] = 10 # in microliters - -# visual stimulus -test_session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -test_session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.grat', '/home/pi/gratings/second_grating.grat'] -test_session_info['vis_raws'] = [] \ No newline at end of file diff --git a/obsolete/testing_visualstim.py b/obsolete/testing_visualstim.py deleted file mode 100755 index 0fe5b29..0000000 --- a/obsolete/testing_visualstim.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 - -# testing the visual stim class - -import logging -from visualstim import VisualStim -import time -import collections, pysistence -import socket -from datetime import datetime - - -logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.StreamHandler() - ] -) - - -# defining immutable mouse dict (once defined for a mouse, this should never change) -mouse_info = pysistence.make_dict({'mouse_name': 'mouse01', - 'fake_field': 'fake_info', - }) - -# making fake session_info -session_info = collections.OrderedDict() -session_info['mouse_name'] = mouse_info['mouse_name'] -#session_info['trainingPhase'] = 4 -session_info['basedir'] = '/home/pi/fakedata' -session_info['weight'] = 32.18 -session_info['manual_date'] = '2021-01-27' -session_info['date'] = datetime.now().strftime("%Y-%m-%d") -session_info['time'] = datetime.now().strftime('%H%M%S') -session_info['datetime'] = session_info['date'] + '_' + session_info['time'] -session_info['basename'] = mouse_info['mouse_name'] + '_' + session_info['datetime'] -session_info['box_name'] = socket.gethostname() -session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info['datetime'] -# session_info['config'] = 'freely_moving_v1' -session_info['config'] = 'head_fixed_v1' - -# visual stimulus -session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.grat', '/home/pi/gratings/second_grating.grat'] -session_info['vis_raws'] = [] - - -logging.info("initiating vstim") -screen = VisualStim(session_info) -# screen.load_stimulus_dir('/home/pi/gratings') - -screen.show_stimulus('first_grating.grat') - -# proof that the threading works - note that other stuff is done while the -# stimulus is playing -for i in range(21): - logging.info("these should be slightly more than 200 ms apart") - time.sleep(0.2) - - - - diff --git a/obsolete/visualization_task.py b/obsolete/visualization_task.py deleted file mode 100644 index d22f21a..0000000 --- a/obsolete/visualization_task.py +++ /dev/null @@ -1,182 +0,0 @@ -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class VisualizationTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - # if kwargs.get("session_info", None) is None: - # print( - # Fore.RED - # + Style.BRIGHT - # + "Warning: no session_info supplied; making fake one" - # + Style.RESET_ALL - # ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - # else: - # self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - Timeout( - name="cue", - on_enter=["enter_cue"], - on_exit=["exit_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_start", "standby", "reward_available"], - ["active_poke", "reward_available", "cue"], - ["timeup", "cue", "standby"], - ] - - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - # self.pump = behavbox.Pump() - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - self.box.check_plot() - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - # self.box.sound1.blink(0.5, 0.1, 1) - # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - # self.box.cueLED4.on() - # self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - # self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - # self.pump.reward("1", self.session_info["reward_size"]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - # self.pump.reward("3", self.session_info["reward_size"]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - # self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - # self.box.video_stop() - # self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/obsolete/walk_task.py b/obsolete/walk_task.py deleted file mode 100644 index b64a61a..0000000 --- a/obsolete/walk_task.py +++ /dev/null @@ -1,461 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu -date: 2023-01-26 -name: walk_task.py -goal: model_based reinforcement learning behavioral training task structure - a simplified version of the headfixed task -description: - an updated test version of soyoun_task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class WalkTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.session_info["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.session_info["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'initiate'], # format: ['trigger', 'origin', 'destination'] - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.early_lick_error = False - self.initiate_error = False - self.cue_state_error = False - self.wrong_choice_error = False - self.multiple_choice_error = False - self.error_repeat = False - self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False - - self.current_cue = None - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - - self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - self.distance_buffer = None - self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - # there can only be lick during the reward available state - # if lick detected prior to reward available state - # the trial will restart and transition to standby - if self.event_name is "left_IR_entry" or self.event_name == "right_IR_entry": - # print("EVENT NAME !!!!!! " + self.event_name) - if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": - pass - else: - # print("beeeeeeep") # debug signal - self.early_lick_error = True - self.error_repeat = True - self.restart() - if self.state == "standby": - pass - elif self.state == "initiate": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.initiate_error = False - self.start_cue() - else: - self.initiate_error = True - elif self.state == "cue_state": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_cue: - self.cue_state_error = False - self.evaluate_reward() - else: - self.cue_state_error = True - elif self.state == "reward_available": - if not self.reward_times_up: - if self.reward_time_start: - if time.time() >= self.reward_time_start + self.reward_time: - self.restart() - # first detect the lick signal: - cue_state_choice = self.current_cue - side_mice = None - if self.event_name == "left_IR_entry": - side_mice = 'left' - self.left_poke_count += 1 - self.left_poke_count_list.append(self.left_poke_count) - self.timeline_left_poke.append(time.time()) - elif self.event_name == "right_IR_entry": - side_mice = 'right' - self.right_poke_count += 1 - self.right_poke_count_list.append(self.right_poke_count) - self.timeline_right_poke.append(time.time()) - if side_mice: - self.side_mice_buffer = side_mice - if cue_state_choice == "left": - pump_num = "1" - if cue_state_choice == "right": - pump_num = "2" - reward_size = self.session_info["reward_size"] - if side_mice == cue_state_choice: # if the animal chose correctly - print("Number of lick detected: " + str(self.lick_count)) - if self.lick_count == 0: # if this is the first lick - # self.side_mice_buffer = side_mice - self.pump.reward(pump_num, reward_size) - self.total_reward += 1 - self.reward_time_start = time.time() - print("Reward time start" + str(self.reward_time_start)) - self.lick_count += 1 - - elif self.side_mice_buffer: - if self.lick_count == 0: - # self.reward_error = True - self.check_cue('sound2') - self.wrong_choice_error = True - self.restart() - else: # multiple choice error - # self.reward_error = True - self.check_cue('sound2') - self.multiple_choice_error = True - self.restart() - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - self.cue_off('all') - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - if self.early_lick_error: - self.error_list.append("early_lick_error") - self.early_lick_error = False - self.lick_count = 0 - self.side_mice_buffer = None - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.box.event_list.clear() - pass - - def enter_initiate(self): - # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes - # check error_repeat - logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) - self.check_cue('sound1') - self.trial_running = True - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) - self.cue_off('sound1') - print("EVENT NAME: " + str(self.box.event_list)) - if self.initiate_error: - self.error_list.append('initiate_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) - self.error_count += 1 - - def enter_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) - self.check_cue(self.current_cue) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) - self.cue_off(self.current_cue) - if self.cue_state_error: - self.check_cue("sound2") - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") - # self.check_cue('sound2') - self.cue_off(self.current_cue) - self.reward_times_up = False - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - # self.cue_off('sound2') - self.reward_times_up = True - self.pump.reward("vaccum", 0) - if self.wrong_choice_error: - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - self.error_repeat = True - self.error_list.append('wrong_choice_error') - self.wrong_choice_error = False - elif self.multiple_choice_error: - logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) - self.error_repeat = False - self.error_list.append('multiple_choice_error') - self.multiple_choice_error = False - elif self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.error_repeat = True - self.error_list.append('no_choice_error') - else: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.error_list.append('correct_trial') - self.lick_count = 0 - self.reward_time_start = None - - def check_cue(self, cue): - if cue == 'sound1': - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) - self.box.sound1.on() - if cue == 'sound2': - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) - self.box.sound2.blink(1,0.1,1) - elif cue == 'left': - self.box.cueLED1.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED1_on;" + str(self.error_repeat)) - elif cue == 'right': - # self.LED_blink = True - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED2_on; " + str(self.error_repeat)) - - def cue_off(self, cue): - if cue == 'all': - self.box.sound1.off() - # self.box.sound2.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - if cue == 'sound1': - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) - elif cue == 'sound2': - self.box.sound2.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) - elif cue == 'left': - self.box.cueLED1.off() - self.LED_blink = False - logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) - elif cue == 'right': - self.box.cueLED2.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) - - def get_distance(self): - try: - distance = self.treadmill.distance_cm - except Exception as e: - logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) - self.treadmill = self.box.treadmill - distance = self.treadmill.distance_cm - return distance - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - print(type(fig)) - - ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file From 764462df68d122e2689c2406c30bb08ea8dad72a Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Mon, 13 Nov 2023 18:53:23 -0500 Subject: [PATCH 105/135] refactored for separation of different task types, matching main branch. Main files also updated. --- essential/behavbox.py | 395 ++++----------- main.py | 223 +++++++++ session_info.py | 90 ++++ task_protocol/EFO_task/EFO_task.py | 203 -------- task_protocol/EFO_task/__init__.py | 1 - .../alternating_latent/task_model.py | 343 +++++++++++++ task_protocol/callbacks.py | 175 +++++++ task_protocol/gui.py | 190 +++++++ task_protocol/headfixed_task/__init__.py | 1 - .../headfixed_independent_reward_task.py | 471 ------------------ .../headfixed_task/headfixed_task.py | 470 ----------------- .../run_headfixed_independent_reward_task.py | 265 ---------- .../headfixed_task/run_headfixed_task.py | 265 ---------- ...ssion_info_headfixed_independent_reward.py | 130 ----- .../session_info_headfixed_task.py | 131 ----- .../task_information_headfixed.py | 46 -- .../task_information_independent_reward.py | 46 -- task_protocol/kelly_task/__init__.py | 1 - task_protocol/kelly_task/kelly_record_task.py | 60 --- task_protocol/kelly_task/kelly_task.py | 183 ------- task_protocol/kelly_task/run_kelly_task.py | 126 ----- task_protocol/kelly_task/run_record_task.py | 100 ---- .../session_info_year-month-date.py | 65 --- task_protocol/self_admin_task/__init__.py | 1 - .../self_admin_task/remi_self_admin_task.py | 374 -------------- .../run_remi_self_admin_task.py | 134 ----- .../self_admin_task/run_self_admin_task.py | 134 ----- .../self_admin_task/self_admin_task.py | 310 ------------ .../session_info_self_admin.py | 66 --- task_protocol/task_presenter.py | 191 +++++++ 30 files changed, 1322 insertions(+), 3868 deletions(-) create mode 100644 main.py create mode 100644 session_info.py delete mode 100644 task_protocol/EFO_task/EFO_task.py delete mode 100644 task_protocol/EFO_task/__init__.py create mode 100644 task_protocol/alternating_latent/task_model.py create mode 100644 task_protocol/callbacks.py create mode 100644 task_protocol/gui.py delete mode 100644 task_protocol/headfixed_task/__init__.py delete mode 100644 task_protocol/headfixed_task/headfixed_independent_reward_task.py delete mode 100644 task_protocol/headfixed_task/headfixed_task.py delete mode 100644 task_protocol/headfixed_task/run_headfixed_independent_reward_task.py delete mode 100644 task_protocol/headfixed_task/run_headfixed_task.py delete mode 100644 task_protocol/headfixed_task/session_info_headfixed_independent_reward.py delete mode 100644 task_protocol/headfixed_task/session_info_headfixed_task.py delete mode 100644 task_protocol/headfixed_task/task_information_headfixed.py delete mode 100644 task_protocol/headfixed_task/task_information_independent_reward.py delete mode 100644 task_protocol/kelly_task/__init__.py delete mode 100755 task_protocol/kelly_task/kelly_record_task.py delete mode 100755 task_protocol/kelly_task/kelly_task.py delete mode 100755 task_protocol/kelly_task/run_kelly_task.py delete mode 100755 task_protocol/kelly_task/run_record_task.py delete mode 100755 task_protocol/kelly_task/session_info_year-month-date.py delete mode 100644 task_protocol/self_admin_task/__init__.py delete mode 100644 task_protocol/self_admin_task/remi_self_admin_task.py delete mode 100644 task_protocol/self_admin_task/run_remi_self_admin_task.py delete mode 100644 task_protocol/self_admin_task/run_self_admin_task.py delete mode 100644 task_protocol/self_admin_task/self_admin_task.py delete mode 100644 task_protocol/self_admin_task/session_info_self_admin.py create mode 100644 task_protocol/task_presenter.py diff --git a/essential/behavbox.py b/essential/behavbox.py index d8aebf2..9e4186e 100755 --- a/essential/behavbox.py +++ b/essential/behavbox.py @@ -17,20 +17,13 @@ import socket import time from collections import deque -import pygame -import pygame.display - -import numpy as np -import matplotlib -matplotlib.use('module://pygame_matplotlib.backend_pygame') -import matplotlib.pyplot as plt -import matplotlib.figure as fg import logging from colorama import Fore, Style from visualstim import VisualStim import scipy.io, pickle +from typing import Protocol import Treadmill import ADS1x15 @@ -39,6 +32,57 @@ from FlipperOutput import FlipperOutput +class Presenter(Protocol): + + def IR_1_entry_callback(self): + ... + + def IR_2_entry_callback(self): + ... + + def IR_3_entry_callback(self): + ... + + def IR_4_entry_callback(self): + ... + + def IR_5_entry_callback(self): + ... + + def IR_1_exit_callback(self): + ... + + def IR_2_exit_callback(self): + ... + + def IR_3_exit_callback(self): + ... + + def IR_4_exit_callback(self): + ... + + def IR_5_exit_callback(self): + ... + + def lick1_pressed_callback(self): + ... + + def lick2_pressed_callback(self): + ... + + def lick3_pressed_callback(self): + ... + + def lick1_released_callback(self): + ... + + def lick2_released_callback(self): + ... + + def lick3_released_callback(self): + ... + + class BehavBox(object): event_list = ( deque() @@ -78,12 +122,6 @@ def __init__(self, session_info): IP_address_video_list[-1] = "2" self.IP_address_video = "".join(IP_address_video_list) - ############################################################################################### - # event list trigger by the interaction between the RPi and the animal for visualization - # interact_list: lick, choice interaction between the board and the animal for visualization - ############################################################################################### - self.interact_list = [] - ############################################################################################### # below are all the pin numbers for Yi's breakout board # cue LEDs - setting PWM frequency of 200 Hz @@ -112,17 +150,7 @@ def __init__(self, session_info): self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use - # link nosepoke event detections to callbacks - self.IR_rx1.when_pressed = self.IR_1_entry - self.IR_rx2.when_pressed = self.IR_2_entry - self.IR_rx3.when_pressed = self.IR_3_entry - self.IR_rx4.when_pressed = self.IR_4_entry - self.IR_rx5.when_pressed = self.IR_5_entry - self.IR_rx1.when_released = self.IR_1_exit - self.IR_rx2.when_released = self.IR_2_exit - self.IR_rx3.when_released = self.IR_3_exit - self.IR_rx4.when_released = self.IR_4_exit - self.IR_rx5.when_released = self.IR_5_exit + ############################################################################################### # close circuit detection - for ground pin circuit lick detection ############################################################################################### @@ -131,20 +159,6 @@ def __init__(self, session_info): self.lick3 = Button(15, None, True) #self.reserved_rx1 = Button(13, None, True) # for mitch #self.reserved_rx2 = Button(16, None, True) # for mitch - # - # # link nosepoke event detections to callbacks - self.lick1.when_pressed = self.left_exit - self.lick2.when_pressed = self.right_exit - self.lick3.when_pressed = self.center_exit - - self.lick1.when_released = self.left_entry - self.lick2.when_released = self.right_entry - self.lick3.when_released = self.center_entry - - # self.reserved_rx1.when_pressed = self.reserved_rx1_pressed - # self.reserved_rx2.when_pressed = self.reserved_rx2_pressed - # self.reserved_rx1.when_released = self.reserved_rx1_released - # self.reserved_rx2.when_released = self.reserved_rx2_released ############################################################################################### # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors @@ -159,11 +173,6 @@ def __init__(self, session_info): self.sound1 = LED(23) # branch new_lick modification self.sound2 = LED(24) # branch new_lick modification - ############################################################################################### - # pump: trigger signal output to a driver board induce the solenoid valve to deliver reward - ############################################################################################### - self.pump = Pump(self.session_info) - ############################################################################################### # flipper strobe signal (previously called camera strobe signal) ############################################################################################### @@ -209,120 +218,27 @@ def __init__(self, session_info): else: self.treadmill = False print("No treadmill I2C connection detected!") - ############################################################################################### - # pygame window setup and keystroke handler - ############################################################################################### - try: - pygame.init() - self.main_display = pygame.display.set_mode((800, 600)) - pygame.display.set_caption(session_info["box_name"]) - fig, axes = plt.subplots(1, 1, ) - axes.plot() - self.check_plot(fig) - print( - "\nKeystroke handler initiated. In order for keystrokes to register, the pygame window" - ) - print("must be in the foreground. Keys are as follows:\n") - print( - Fore.YELLOW - + " 1: left poke 2: center poke 3: right poke" - ) - print( - " Q: pump_1 W: pump_2 E: pump_3 R: pump_4" - ) - print( - Fore.CYAN - + " Esc: close key capture window\n" - + Style.RESET_ALL - ) - print( - Fore.GREEN - + Style.BRIGHT - + " TO EXIT, CLICK THE MAIN TEXT WINDOW AND PRESS CTRL-C " - + Fore.RED - + "ONCE\n" - + Style.RESET_ALL - ) - self.keyboard_active = True - except Exception as error_message: - print("pygame issue\n") - print(str(error_message)) - ############################################################################################### - # check for data visualization - uses pygame window to show behavior progress - ############################################################################################### - """ - 1. show a blank window. (change in the pygame initiation part) - 2. show a x,y axis with a count of trial - """ - def check_plot(self, figure=None, FPS=144): - if figure: - FramePerSec = pygame.time.Clock() - figure.canvas.draw() - self.main_display.blit(figure, (0, 0)) - pygame.display.update() - FramePerSec.tick(FPS) - else: - print("No figure available") - - ############################################################################################### - # check for key presses - uses pygame window to simulate nosepokes and licks - ############################################################################################### - - def check_keybd(self): - reward_size = self.session_info['reward_size'] - # pump = Pump() - if self.keyboard_active: - # event = pygame.event.get() - for event in pygame.event.get(): - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - self.keyboard_active = False - elif event.key == pygame.K_1: - self.left_entry() - self.left_IR_entry() - logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") - elif event.key == pygame.K_2: - self.center_entry() - self.center_IR_entry() - logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") - elif event.key == pygame.K_3: - self.right_entry() - self.right_IR_entry() - logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") - # elif event.key == pygame.K_4: - # self.reserved_rx1_pressed() - # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") - # elif event.key == pygame.K_5: - # self.reserved_rx2_pressed() - # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") - elif event.key == pygame.K_q: - # print("Q down: syringe pump 1 moves") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") - self.pump.reward("key_1", self.session_info["key_reward_amount"]) - elif event.key == pygame.K_w: - # print("W down: syringe pump 2 moves") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") - self.pump.reward("key_2", self.session_info["key_reward_amount"]) - elif event.key == pygame.K_e: - # print("E down: syringe pump 3 moves") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") - self.pump.reward("key_3", self.session_info["key_reward_amount"]) - elif event.key == pygame.K_r: - # print("R down: syringe pump 4 moves") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") - self.pump.reward("key_4", self.session_info["key_reward_amount"]) - elif event.key == pygame.K_t: - # print("T down: vacuum on") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") - self.pump.reward("key_vacuum", 1) - elif event.type == pygame.KEYUP: - if event.key == pygame.K_1: - self.left_exit() - elif event.key == pygame.K_2: - self.center_exit() - elif event.key == pygame.K_3: - self.right_exit() + def set_callbacks(self, Presenter): + # link nosepoke event detections to callbacks + self.IR_rx1.when_pressed = Presenter.IR_1_entry_callback + self.IR_rx2.when_pressed = Presenter.IR_2_entry_callback + self.IR_rx3.when_pressed = Presenter.IR_3_entry_callback + self.IR_rx4.when_pressed = Presenter.IR_4_entry_callback + self.IR_rx5.when_pressed = Presenter.IR_5_entry_callback + self.IR_rx1.when_released = Presenter.IR_1_exit_callback + self.IR_rx2.when_released = Presenter.IR_2_exit_callback + self.IR_rx3.when_released = Presenter.IR_3_exit_callback + self.IR_rx4.when_released = Presenter.IR_4_exit_callback + self.IR_rx5.when_released = Presenter.IR_5_exit_callback + + self.lick1.when_pressed = Presenter.lick1_pressed_callback + self.lick2.when_pressed = Presenter.lick2_pressed_callback + self.lick3.when_pressed = Presenter.lick3_pressed_callback + + self.lick1.when_released = Presenter.lick1_released_callback + self.lick2.when_released = Presenter.lick2_released_callback + self.lick3.when_released = Presenter.lick3_released_callback ############################################################################################### # methods to start and stop video @@ -442,195 +358,104 @@ def video_stop(self): ) print("rsync finished!") # print("Control-C to quit (ignore the error for now)") + except Exception as e: print(e) - ############################################################################################### - # callbacks - ############################################################################################### - def left_entry(self): - self.event_list.append("left_entry") - self.interact_list.append((time.time(), "left_entry")) - logging.info(";" + str(time.time()) + ";[action];left_entry") - - def center_entry(self): - self.event_list.append("center_entry") - self.interact_list.append((time.time(), "center_entry")) - logging.info(";" + str(time.time()) + ";[action];center_entry") - - def right_entry(self): - self.event_list.append("right_entry") - self.interact_list.append((time.time(), "right_entry")) - logging.info(";" + str(time.time()) + ";[action];right_entry") - - def left_exit(self): - self.event_list.append("left_exit") - self.interact_list.append((time.time(), "left_exit")) - logging.info(";" + str(time.time()) + ";[action];left_exit") - - def center_exit(self): - self.event_list.append("center_exit") - self.interact_list.append((time.time(), "center_exit")) - logging.info(";" + str(time.time()) + ";[action];center_exit") - - def right_exit(self): - self.event_list.append("right_exit") - self.interact_list.append((time.time(), "right_exit")) - logging.info(";" + str(time.time()) + ";[action];right_exit") - - # def reserved_rx1_pressed(self): - # self.event_list.append("reserved_rx1_pressed") - # self.interact_list.append((time.time(), "reserved_rx1_pressed")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") - # - # def reserved_rx2_pressed(self): - # self.event_list.append("reserved_rx2_pressed") - # self.interact_list.append((time.time(), "reserved_rx2_pressed")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") - # - # def reserved_rx1_released(self): - # self.event_list.append("reserved_rx1_released") - # self.interact_list.append((time.time(), "reserved_rx1_released")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") - # - # def reserved_rx2_released(self): - # self.event_list.append("reserved_rx2_released") - # self.interact_list.append((time.time(), "reserved_rx2_released")) - # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") - def IR_1_entry(self): - self.event_list.append("IR_1_entry") - logging.info(str(time.time()) + ", IR_1_entry") - - def IR_2_entry(self): - self.event_list.append("IR_2_entry") - logging.info(str(time.time()) + ", IR_2_entry") - - def IR_3_entry(self): - self.event_list.append("IR_3_entry") - logging.info(str(time.time()) + ", IR_3_entry") - - def IR_4_entry(self): - self.event_list.append("IR_4_entry") - logging.info(str(time.time()) + ", IR_4_entry") - - def IR_5_entry(self): - self.event_list.append("IR_5_entry") - logging.info(str(time.time()) + ", IR_5_entry") - - def IR_1_exit(self): - self.event_list.append("IR_1_exit") - logging.info(str(time.time()) + ", IR_1_exit") - - def IR_2_exit(self): - self.event_list.append("IR_2_exit") - # self.cueLED2.off() - logging.info(str(time.time()) + ", IR_2_exit") - - def IR_3_exit(self): - self.event_list.append("IR_3_exit") - logging.info(str(time.time()) + ", IR_3_exit") - - def IR_4_exit(self): - self.event_list.append("IR_4_exit") - logging.info(str(time.time()) + ", IR_4_exit") - - def IR_5_exit(self): - self.event_list.append("IR_5_exit") - logging.info(str(time.time()) + ", IR_5_exit") # this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) # currently. BoxLED.set_value is the saved intensity value that determines how bright the # LED will be if BoxLED.on() is called. This is better than the original PWMLED class. class BoxLED(PWMLED): set_value = 1 # the intensity value, ranging from 0-1 - - def on( - self, - ): # unlike PWMLED, here the on() function sets the intensity to set_value, + def on(self): # unlike PWMLED, here the on() function sets the intensity to set_value, # not to full intensity self.value = self.set_value +############################################################################################### +# pump: trigger signal output to a driver board induce the solenoid valve to deliver reward +############################################################################################### class Pump(object): def __init__(self, session_info): - self.session_info = session_info self.pump1 = LED(19) self.pump2 = LED(20) self.pump3 = LED(21) self.pump4 = LED(7) self.pump_air = LED(8) self.pump_vacuum = LED(25) - self.reward_list = [] # a list of tuple (pump_x, reward_amount) with information of reward history for data + + # this needs to move to the controller + self.reward_list = [] # a list of tuple (pump_x, reward_amount) with information of reward history for data # visualization - def reward(self, which_pump, reward_size): - # import coefficient from the session_information - coefficient_p1 = self.session_info["calibration_coefficient"]['1'] - coefficient_p2 = self.session_info["calibration_coefficient"]['2'] - coefficient_p3 = self.session_info["calibration_coefficient"]['3'] - coefficient_p4 = self.session_info["calibration_coefficient"]['4'] - duration_air = self.session_info['air_duration'] - duration_vac = self.session_info["vacuum_duration"] + self.coefficient_p1 = session_info["calibration_coefficient"]['1'] + self.coefficient_p2 = session_info["calibration_coefficient"]['2'] + self.coefficient_p3 = session_info["calibration_coefficient"]['3'] + self.coefficient_p4 = session_info["calibration_coefficient"]['4'] + self.duration_air = session_info['air_duration'] + self.duration_vac = session_info["vacuum_duration"] + def reward(self, which_pump, reward_size): if which_pump == "1": - duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 5) # linear function + duration = round((self.coefficient_p1[0] * (reward_size / 1000) + self.coefficient_p1[1]), 5) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient_p1) + + logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(self.coefficient_p1) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "2": - duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function + duration = round((self.coefficient_p2[0] * (reward_size / 1000) + self.coefficient_p2[1]), 5) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient_p2) + + logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(self.coefficient_p2) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "3": - duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function + duration = round((self.coefficient_p3[0] * (reward_size / 1000) + self.coefficient_p3[1]), 5) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient_p3) + + logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(self.coefficient_p3) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "4": - duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function + duration = round((self.coefficient_p4[0] * (reward_size / 1000) + self.coefficient_p4[1]), 5) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient_p4) + + logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(self.coefficient_p4) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "air_puff": - self.pump_air.blink(duration_air, 0.1, 1) + self.pump_air.blink(self.duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": - self.pump_vacuum.blink(duration_vac, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) + self.pump_vacuum.blink(self.duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(self.duration_vac)) elif which_pump == "key_1": - duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 5) # linear function + duration = round((self.coefficient_p1[0] * (reward_size / 1000) + self.coefficient_p1[1]), 5) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump1_reward(reward_coeff: " + str(coefficient_p1) + + logging.info(";" + str(time.time()) + ";[key];pump1_reward(reward_coeff: " + str(self.coefficient_p1) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_2": - duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function + duration = round((self.coefficient_p2[0] * (reward_size / 1000) + self.coefficient_p2[1]), 5) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump2_reward(reward_coeff: " + str(coefficient_p2) + + logging.info(";" + str(time.time()) + ";[key];pump2_reward(reward_coeff: " + str(self.coefficient_p2) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_3": - duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function + duration = round((self.coefficient_p3[0] * (reward_size / 1000) + self.coefficient_p3[1]), 5) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump3_reward(reward_coeff: " + str(coefficient_p3) + + logging.info(";" + str(time.time()) + ";[key];pump3_reward(reward_coeff: " + str(self.coefficient_p3) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_4": - duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function + duration = round((self.coefficient_p4[0] * (reward_size / 1000) + self.coefficient_p4[1]), 5) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump4_reward(reward_coeff: " + str(coefficient_p4) + + logging.info(";" + str(time.time()) + ";[key];pump4_reward(reward_coeff: " + str(self.coefficient_p4) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_air_puff": - self.pump_air.blink(duration_air, 0.1, 1) + self.pump_air.blink(self.duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[key];pump4_reward_" + str(reward_size)) elif which_pump == "key_vacuum": - self.pump_vacuum.blink(duration_vac, 0.1, 1) - logging.info(";" + str(time.time()) + ";[key];pump_vacuum" + str(duration_vac)) \ No newline at end of file + self.pump_vacuum.blink(self.duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[key];pump_vacuum" + str(self.duration_vac)) diff --git a/main.py b/main.py new file mode 100644 index 0000000..f6f10c7 --- /dev/null +++ b/main.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python +# coding: utf-8 + +#!/usr/bin/env -S ipython3 -i + +""" +author: Matthew Chin +date: 2023-11-10 +name: main.py +""" + +from icecream import ic +from datetime import datetime +import os +import importlib +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep +import sys +import logging +import logging.config +import numpy as np +from pathlib import Path + + +sys.path.insert(0,'./essential') + +debug_startup = True +debug_task = False +if debug_startup or debug_task: + from essential import dummy_box as behavbox +else: + import essential + from essential.visualstim import VisualStim + import essential.Treadmill as Treadmill + import essential.ADS1x15 as ADS1x15 + from essential.FlipperOutput import FlipperOutput + from essential import behavbox + +debug_enable = False +seed = 0 +np.random.seed(seed) + + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + + +# if debug_enable: +# # enabling debugger +# from IPython import get_ipython +# ipython = get_ipython() +# ipython.magic("pdb on") +# ipython.magic("xmode Verbose") + +# import your task class here +sys.path.insert(0,'./task_protocol') +from task_protocol import task_presenter +from task_protocol.gui import GUI + + +def confirm_options(session_info: dict) -> bool: + print("The following options are set for this session:") + print("Mouse name: " + session_info['mouse_name']) + print("Task type: " + session_info['task_config']) + print("Is this correct? (y/n)") + + correct = False + user_input = input() + if user_input in ['n', 'N']: + print("Please edit the session_info file and try again") + quit() + elif user_input in ['y', 'Y']: + correct = True + print("Starting session") + else: + print("Invalid input") + return correct + + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + # full_module_name = 'session_info_' + datestr + full_module_name = 'session_info' + + # want to edit this bit for debugging + session_info_path = './' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + if debug_startup or debug_task: + session_info['basename'] = '' + session_info['dir_name'] = "./outputs/" + else: + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + # make data directory and initialize logfile + if not os.path.exists(session_info['dir_name']): + os.makedirs(session_info['dir_name']) + + if debug_startup or debug_task: + session_info['file_basename'] = 'test_debug' + else: + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + log_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '.log') + session_info_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '_session_info.pkl') + mat_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '_session_info.mat') + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(log_path), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + # query user to confirm current options + options_correct = False + while not options_correct: + options_correct = confirm_options(session_info) + + gui = GUI(session_info=session_info) + # make dummy box and pump objects for testing, all functions should say "pass" + box = behavbox.BehavBox(session_info=session_info) + pump = behavbox.Pump(session_info=session_info) + + ### allow different tasks to be loaded ### + task_type = session_info['task_config'] + if task_type == 'alternating_latent': + from task_protocol.alternating_latent import task_model + task = task_model.AlternateLatent(session_info=session_info) + Presenter = task_presenter.AlternatingLatentPresenter + name = 'alternating_latent_task' + elif task_type == 'A_B_task': + pass + elif task_type == 'C1_C2_task': + pass + elif task_type == 'A_B_C1_C2_task': + pass + else: + raise RuntimeError('[***] Specified task not recognized!! [***]') + + presenter = Presenter(name=name, + task=task, + box=box, + pump=pump, + gui=gui, + session_info=session_info) + gui.set_callbacks(presenter=presenter) + + # start session + scipy.io.savemat(mat_path, {'session_info': session_info}) + with open(session_info_path, 'wb') as f: + pickle.dump(session_info, f) + + presenter.start_session() + if debug_startup: + pass + else: + # sleep(5) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + run = True + task.sample_next_block() + while run: + if time.time() < t_end: + presenter.run() # breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + else: + run = False + print("Times up, finishing up") + + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + if 'presenter' in locals(): + try: + ic('Calling end_session()') + presenter.end_session() + ic('Call to end_session() was successful') + except: + ic('could not call end_session()') + else: + pass + + # save dicts to disk + ic('Saving files to disk') + scipy.io.savemat(mat_path, {'session_info': session_info}) + with open(session_info_path, 'wb') as f: + pickle.dump(session_info, f) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(mat_path, {'session_info': session_info}) + with open(session_info_path, 'wb') as f: + pickle.dump(session_info, f) + presenter.end_session() + diff --git a/session_info.py b/session_info.py new file mode 100644 index 0000000..da879ad --- /dev/null +++ b/session_info.py @@ -0,0 +1,90 @@ +# put all of your mouse and session info in here + +import pysistence, collections +import socket +from datetime import datetime + + +### PARAMETERS - Rig and defaults (should not change between sessions) ### + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'TM001', + 'fake_field': 'fake_info', + }) + +# Parameters: mouse, session type + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['weight'] = 30 # in grams +session_info['date'] = datetime.now().strftime("%Y-%m-%d") # for example, '2023-09-28' +session_info['task_config'] = 'alternating_latent' + +# behavior parameters - ideally set these to a default for each session type, which is adjustable +session_info['max_trial_number'] = 100 +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 2 +session_info['reward_time_delay'] = 20 + +session_info['initiation_timeout'] = 120 # s + +session_info['entry_interval'] = 1 # this is the one that delays between choices +session_info['timeout_time'] = 3 +session_info['ContextA_reward_probability'] = 1 +session_info['ContextB_reward_probability'] = 1 + +session_info['correct_reward_probability'] = 1 +session_info['incorrect_reward_probability'] = 0 + +session_info["ContextA_time"] = 30 # todo - revise this or make adjustable by mouse performance +session_info["ContextB_time"] = 30 +session_info["ContextC_time"] = 30 + +# Reward pump parameters +session_info["reward_pump1"] = '2' +session_info['reward_pump2'] = '1' + +session_info['reward_size_large'] = [3, 3] +session_info['reward_size_small'] = [0, 0] +session_info['errors_to_reward_delivery'] = 5 +session_info['key_reward_amount'] = 3 + +# Parameters - file saving +session_info['file_basename'] = 'place_holder' +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' + +# Parameters - box and rig +session_info['box_name'] = socket.gethostname() + +session_info["visual_stimulus"] = False +session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +session_info['vis_gratings'] = ['/home/pi/gratings/context_a.dat', + '/home/pi/gratings/context_b.dat'] +session_info['vis_raws'] = [] + +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True + + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 10 # cm + session_info['treadmill_setup']['distance_cue'] = 25 # cm +else: + session_info['treadmill_setup'] = None + + +### DEPRECATED / NOT CURRENTLY IN USE ### +session_info['LED_duration'] = 3 + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +session_info["reward_pump"] = '2' +session_info['reward_size'] = 1 \ No newline at end of file diff --git a/task_protocol/EFO_task/EFO_task.py b/task_protocol/EFO_task/EFO_task.py deleted file mode 100644 index 5b86cde..0000000 --- a/task_protocol/EFO_task/EFO_task.py +++ /dev/null @@ -1,203 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Tue Oct 11 18:02:34 2022 -First tentative to do a new 2 AFC task that has 4 pokes, with the 4th poke being -the reward that is delivered to the animal separate from the choices -@author: eliezyer -""" - - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled -# updated with reorganization (on 7/11/2023) -import sys -sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class EFOTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - # Task has the following states: standby, trial_available, cue, choice_available, and reward_available (punishment?) - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="trial_available", - on_enter=["enter_trial_available"], - on_exit=["exit_trial_available"], - ), - Timeout( - name="start_cue", - on_enter=["enter_start_cue"], - on_exit=["exit_start_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - Timeout( - name="choice_available", - on_enter=["enter_choice_available"], - on_exit=["exit_choice_available"], - ), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_available", "standby", "start_cue"], - ["choice_available", "start_cue", "reward_available"], - ["reward_available", "choice_available", "standby"], - ] - # EFO: STOPPED HERE ON 10/11/2022 - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = behavbox.Pump() - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - self.box.sound1.blink(0.5, 0.1, 1) - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - self.box.cueLED4.on() - self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - self.pump.reward("1", self.session_info["reward_size"]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - self.pump.reward("3", self.session_info["reward_size"]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() - self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/EFO_task/__init__.py b/task_protocol/EFO_task/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/task_protocol/EFO_task/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/task_protocol/alternating_latent/task_model.py b/task_protocol/alternating_latent/task_model.py new file mode 100644 index 0000000..826d420 --- /dev/null +++ b/task_protocol/alternating_latent/task_model.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python +# coding: utf-8 + +# python3: lick_task_left_and_right_alternate.py +""" +author: Mitch Farrell; edited Matthew Chin +date: 2023-06-30 (to be updated) +name: lick_task_left_and_right_alternate.py +""" +from numpy import ndarray +from transitions import State, Machine +from transitions.extensions.states import add_state_features, Timeout + +from icecream import ic +import logging +import time + +import random +import numpy as np + +import logging.config +from collections import deque +from typing import Protocol, List, Tuple, Union +from collections import defaultdict + +""" +Model for the task - i.e. only sees the the task state machine and status, necessary parameters, and presenter messages. +""" + +RIGHT_IX = 0 +LEFT_IX = 1 + +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class AlternateLatent(object): + + def __init__(self, session_info: dict): # name and session_info should be provided as kwargs + """ + Refactoring: + Hold performance (choices, correct history, choice time) in the model + No params class encapsulation, not enough params to make that worth it + + TODO - + - transitions to new blocks; adjusting event list clearing + - setup automation of training rewards + - logging? here or in the controller? + + """ + + # TASK + BEHAVIOR STATUS + self.right_active = True + self.trial_running = False + self.trial_number = 0 # I don't think stopping at max trials is implemented - do that + + self.last_choice_time = 0.0 + self.rewards_earned_in_block = 0 + self.rewards_available_in_block = random.randint(1, 4) + + # Lick detection + self.lick_side_buffer = np.zeros(2) + + ### TRAINING REWARDS PARAMETERS ### + self.automate_training_rewards = False # keep here, use in controller + self.give_training_reward = False # keep here, use in controller + self.error_count = 0 + self.errors_to_reward = 5 + + # These can't be refactored, session parameters needed for behavbox + # maybe move them into a parameters class + self.choice_interval = session_info['entry_interval'] + self.lick_threshold = session_info['lick_threshold'] + self.machine = self.make_state_machine(session_info['timeout_time']) + self.last_state_fxn = self.switch_to_standby + self.block_type_counter = np.zeros(2) + + # revise these later to make sure you need them + self.trial_choice_list: list = [] + self.trial_correct_list: list = [] + self.trial_choice_times: list = [] + self.trial_reward_given: list = [] + self.event_list = deque() + self.t_session = time.time() + + def make_state_machine(self, timeout_time: float): + states = [ + State(name='standby', + on_enter=['switch_to_reward_available'], + on_exit=["exit_standby"]), + State(name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"]), + State(name="right_active", + on_enter=["enter_right_active"], + on_exit=['exit_right_active']), + State(name="left_active", + on_enter=["enter_left_active"], + on_exit=['exit_left_active']), + Timeout(name='timeout', + on_enter=['enter_timeout'], + timeout=timeout_time, + on_timeout=['exit_timeout'])] + + # all of these transition functions are created automatically + transitions = [ + # ['start_trial_logic', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] + + ['switch_to_standby', ['reward_available', 'right_active', 'left_active'], 'standby'], + ['switch_to_reward_available', ['standby', 'timeout'], 'reward_available'], + ['switch_to_left_active', '*', 'left_active'], + ['switch_to_right_active', '*', 'right_active'], + + + ['switch_to_timeout', ['reward_available', 'right_active', 'left_active'], 'timeout'], + ['end_task', ['reward_available', 'timeout', 'right_active', 'left_active'], 'standby']] + + machine = TimedStateMachine( + model=self, + states=states, + transitions=transitions, + initial='standby' + ) + return machine + + def start_trial_logic(self): + p = np.random.random_sample() + if p < 0.5: + # right sample + if self.state != 'right_active': + self.block_type_counter *= 0 + else: + self.block_type_counter[0] += 1 + + + self.switch_to_right_active() + else: + self.switch_to_left_active() + + def enter_standby(self): # This function should also call for updating the plot??? + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str("")) + self.trial_running = False + self.event_list.clear() + # self.last_state_fxn = self.switch_to_standby + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str("")) + # self.last_state = self.state + self.reset_counters() + + def exit_right_active(self): + logging.info(";" + str(time.time()) + ";[transition];exit_right_active;" + str("")) + # self.last_state_fxn = self.switch_to_right_active + # self.reset_counters() + + def exit_left_active(self): + logging.info(";" + str(time.time()) + ";[transition];exit_left_active;" + str("")) + # self.last_state_fxn = self.switch_to_left_active + # self.reset_counters() + + def enter_right_active(self): + self.right_active = True + self.trial_running = True + self.last_state_fxn = self.switch_to_right_active + logging.info(";" + str(time.time()) + ";[transition];enter_right_active;" + str("")) + + def enter_left_active(self): + self.right_active = False + self.trial_running = True + self.last_state_fxn = self.switch_to_left_active + logging.info(";" + str(time.time()) + ";[transition];enter_left_active;" + str("")) + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str("")) + self.last_state_fxn = self.switch_to_reward_available + self.trial_running = True + + def exit_reward_available(self): + self.last_state = self.state + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str("")) + self.reset_counters() + + def enter_timeout(self): + # log the entrance to timeout; reset counters + self.event_list.clear() + self.lick_side_buffer *= 0 + self.trial_running = False + logging.info(";" + str(time.time()) + ";[transition];enter_timeout;" + str("")) + + def exit_timeout(self): + # logs the exit-timeout; doesn't do anything else + self.event_list.clear() + self.lick_side_buffer *= 0 + logging.info(";" + str(time.time()) + ";[transition];exit_timeout;" + str("")) + if self.rewards_earned_in_block >= self.rewards_available_in_block: + self.sample_next_block() + else: + self.last_state_fxn() + + def sample_next_block(self): + self.reset_counters() + self.rewards_available_in_block = random.randint(1, 4) + print('sampling_next_block') + if random.randint(0, 1) == 0: + if self.state != 'right_active': + self.block_type_counter *= 0 + else: + self.block_type_counter[0] += 1 + + if self.block_type_counter[0] >= 2: + self.switch_to_left_active() + else: + self.switch_to_right_active() + + else: + if self.state != 'left_active': + self.block_type_counter *= 0 + else: + self.block_type_counter[1] += 1 + + if self.block_type_counter[1] >= 2: + self.switch_to_right_active() + else: + self.switch_to_left_active() + + def reset_counters(self): + self.lick_side_buffer *= 0 + self.rewards_earned_in_block = 0 + self.error_count = 0 + self.event_list.clear() + + def determine_choice(self) -> Union[int, ndarray[int]]: + """Determine whether there has been a choice to the left ports, right ports, or a switch.""" + + sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides + if sides_licked > 1: + # made a switch, reset the counter + self.lick_side_buffer *= 0 + return -1 + + if np.amax(self.lick_side_buffer) >= self.lick_threshold: + choice_ix = np.argmax(self.lick_side_buffer) # either 0 or 1 + # choice = ['right', 'left'][choice_ix] + self.lick_side_buffer *= 0 + return choice_ix + else: + return -1 # no choice made/not enough licks + + def run_event_loop(self) -> Tuple[str, bool, float]: + choice_correct = '' # ['correct', 'incorrect', 'switch', ''] + give_training_reward = False + cur_time = time.time() + time_since_start = cur_time - self.t_session + dt = cur_time - self.last_choice_time + + if self.event_list: + event = self.event_list.popleft() + else: + event = '' + + if self.state in ['reward_available', 'left_active', 'right_active']: + if dt < self.choice_interval: + self.lick_side_buffer *= 0 + return choice_correct, give_training_reward, time_since_start # check keyboard in controller, not here + + if event == "right_entry": + self.lick_side_buffer[RIGHT_IX] += 1 + elif event == 'left_entry': + self.lick_side_buffer[LEFT_IX] += 1 + + choice_side = self.determine_choice() + # if no choice made, don't mark anything but maybe give reward + if choice_side == 0: #'right': + self.last_choice_time = cur_time + if self.right_active: + choice_correct = 'correct' + self.correct_choice_updates(choice_side, time_since_start) + else: + choice_correct = 'incorrect' + self.incorrect_choice_updates(choice_side, time_since_start) + + elif choice_side == 1: #'left': + self.last_choice_time = cur_time + if not self.right_active: + choice_correct = 'correct' + self.correct_choice_updates(choice_side, time_since_start) + else: + choice_correct = 'incorrect' + self.incorrect_choice_updates(choice_side, time_since_start) + + # elif choice_side == ['switch', 'none']: # no updates unless giving reward + # self.incorrect_choice_updates(choice_side, cur_time) + # give_reward = self.incorrect_choice_updates(choice_side, cur_time) + + elif (self.error_count >= self.errors_to_reward and self.automate_training_rewards)\ + or self.give_training_reward: + self.last_choice_time = cur_time + give_training_reward = True + if self.right_active: + choice_side = 0 + else: + choice_side = 1 + self.training_reward_updates(choice_side, time_since_start) + + self.give_training_reward = False + return choice_correct, give_training_reward, time_since_start + + else: + self.give_training_reward = False + return choice_correct, give_training_reward, time_since_start + + def correct_choice_updates(self, choice: int, event_time: float) -> None: + self.trial_choice_list.append(choice) + self.trial_choice_times.append(event_time) + self.trial_correct_list.append(True) + self.error_count = 0 + + def incorrect_choice_updates(self, choice: int, event_time: float) -> None: + self.trial_choice_list.append(choice) + self.trial_choice_times.append(event_time) + self.trial_correct_list.append(False) + self.error_count += 1 + + def training_reward_updates(self, choice: int, event_time: float) -> None: + self.trial_choice_list.append(choice) + self.trial_choice_times.append(event_time) + self.trial_correct_list.append(False) + self.error_count = 0 + + +def main(): + session_info = defaultdict(list) + session_info['timeout_time'] = 1 + task = AlternateLatent(session_info) + # task.switch_to_left_active() + # task.exit_standby() + # task.switch_to_reward_available() + task.sample_next_block() + print(task.state) + + +if __name__ == '__main__': + main() diff --git a/task_protocol/callbacks.py b/task_protocol/callbacks.py new file mode 100644 index 0000000..efd6293 --- /dev/null +++ b/task_protocol/callbacks.py @@ -0,0 +1,175 @@ +import logging +import time +from typing import List, Tuple, Protocol + +""" +Mixin functions for use with the Presenter of the behavbox model-view-presenter. +""" + + +class Pump(Protocol): + def reward(self, pump_key: str, reward_size: float): + ... + + +class Task(Protocol): + event_list: List[str] + automate_training_rewards: bool + give_training_reward: bool + + def switch_to_timeout(self): + ... + + +class GUI(Protocol): + keyboard_active: bool + + +class Callbacks: + + interact_list: List[Tuple[float, str]] + pump: Pump + task: Task + gui: GUI + + def deliver_reward(self, pump_key: str, reward_size: int) -> None: + self.pump.reward(pump_key, reward_size) + # self.task.switch_to_timeout() + + def left_entry(self) -> None: + self.task.event_list.append("left_entry") + self.interact_list.append((time.time(), "left_entry")) + logging.info(";" + str(time.time()) + ";[action];left_entry") + + def center_entry(self) -> None: + self.task.event_list.append("center_entry") + self.interact_list.append((time.time(), "center_entry")) + logging.info(";" + str(time.time()) + ";[action];center_entry") + + def right_entry(self) -> None: + self.task.event_list.append("right_entry") + self.interact_list.append((time.time(), "right_entry")) + logging.info(";" + str(time.time()) + ";[action];right_entry") + + def left_exit(self) -> None: + self.task.event_list.append("left_exit") + self.interact_list.append((time.time(), "left_exit")) + logging.info(";" + str(time.time()) + ";[action];left_exit") + + def center_exit(self) -> None: + self.task.event_list.append("center_exit") + self.interact_list.append((time.time(), "center_exit")) + logging.info(";" + str(time.time()) + ";[action];center_exit") + + def right_exit(self) -> None: + self.task.event_list.append("right_exit") + self.interact_list.append((time.time(), "right_exit")) + logging.info(";" + str(time.time()) + ";[action];right_exit") + + def IR_1_entry(self) -> None: + self.task.event_list.append("IR_1_entry") + logging.info(str(time.time()) + ", IR_1_entry") + + def IR_2_entry(self) -> None: + self.task.event_list.append("IR_2_entry") + logging.info(str(time.time()) + ", IR_2_entry") + + def IR_3_entry(self) -> None: + self.task.event_list.append("IR_3_entry") + logging.info(str(time.time()) + ", IR_3_entry") + + def IR_4_entry(self) -> None: + self.task.event_list.append("IR_4_entry") + logging.info(str(time.time()) + ", IR_4_entry") + + def IR_5_entry(self) -> None: + self.task.event_list.append("IR_5_entry") + logging.info(str(time.time()) + ", IR_5_entry") + + def IR_1_exit(self) -> None: + self.task.event_list.append("IR_1_exit") + logging.info(str(time.time()) + ", IR_1_exit") + + def IR_2_exit(self) -> None: + self.task.event_list.append("IR_2_exit") + # self.cueLED2.off() + logging.info(str(time.time()) + ", IR_2_exit") + + def IR_3_exit(self) -> None: + self.task.event_list.append("IR_3_exit") + logging.info(str(time.time()) + ", IR_3_exit") + + def IR_4_exit(self) -> None: + self.task.event_list.append("IR_4_exit") + logging.info(str(time.time()) + ", IR_4_exit") + + def IR_5_exit(self) -> None: + self.task.event_list.append("IR_5_exit") + logging.info(str(time.time()) + ", IR_5_exit") + + def K_escape_callback(self) -> None: + self.gui.keyboard_active = False + + def K_1_down_callback(self) -> None: + logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") + self.left_entry() + + def K_2_down_callback(self) -> None: + logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") + self.center_entry() + + def K_3_down_callback(self) -> None: + logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") + self.right_entry() + + def K_1_up_callback(self) -> None: + logging.info(";" + str(time.time()) + ";[action];key_released_left_entry()") + self.left_exit() + + def K_2_up_callback(self) -> None: + logging.info(";" + str(time.time()) + ";[action];key_released_center_entry()") + self.center_exit() + + def K_3_up_callback(self) -> None: + logging.info(";" + str(time.time()) + ";[action];key_released_right_entry()") + self.right_exit() + + def K_q_callback(self) -> None: + # print("Q down: syringe pump 1 moves") + logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") + self.pump.reward("key_1", self.session_info["key_reward_amount"]) + + def K_w_callback(self) -> None: + # print("W down: syringe pump 2 moves") + logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") + self.pump.reward("key_2", self.session_info["key_reward_amount"]) + + def K_e_callback(self) -> None: + # print("E down: syringe pump 3 moves") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") + # self.pump.reward("key_3", self.session_info["key_reward_amount"]) + pass + + def K_r_callback(self) -> None: + # print("R down: syringe pump 4 moves") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") + # self.pump.reward("key_4", self.session_info["key_reward_amount"]) + pass + + def K_t_callback(self) -> None: + # print("T down: vacuum on") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") + # self.pump.reward("key_vacuum", 1) + pass + + def K_a_callback(self) -> None: + # toggle automated training rewards + self.task.automate_training_rewards = not self.task.automate_training_rewards + + def K_g_callback(self) -> None: + # give training reward + self.task.give_training_reward = True + logging.info(";" + str(time.time()) + ";[action];set_give_reward_true") + + + diff --git a/task_protocol/gui.py b/task_protocol/gui.py new file mode 100644 index 0000000..ea0ced9 --- /dev/null +++ b/task_protocol/gui.py @@ -0,0 +1,190 @@ +import pygame +import pygame.display +from colorama import Fore, Style + +import matplotlib +matplotlib.use('module://pygame_matplotlib.backend_pygame') +import matplotlib.pyplot as plt +from typing import Protocol + + +RIGHT_IX = 0 +LEFT_IX = 1 + + +class Presenter(Protocol): + + def K_1_down_callback(self): + ... + + def K_2_down_callback(self): + ... + + def K_3_down_callback(self): + ... + + def K_1_up_callback(self): + ... + + def K_2_up_callback(self): + ... + + def K_3_up_callback(self): + ... + + def K_q_callback(self): + ... + + def K_w_callback(self): + ... + + def K_e_callback(self): + ... + + def K_r_callback(self): + ... + + def K_t_callback(self): + ... + + def K_a_callback(self): + ... + + def K_g_callback(self): + ... + + +class PerformanceFigure: + + def __init__(self, right_ix: int, left_ix: int): + fig, ax = plt.subplots() + self.figure = fig + self.correct_line = ax.plot([], color='g', marker="o", label='Correct', linestyle='', markersize=10)[0] + self.error_line = ax.plot([], color='r', marker="o", label='Error', linestyle='', markersize=10)[0] + self.reward_line = ax.plot([], color='b', marker="v", label='Reward given', linestyle='', markersize=5)[0] + ax.set_yticks([right_ix, left_ix]) + ax.set_yticklabels(['right lick', 'left lick']) + plt.ylim([right_ix - .5, left_ix + .5]) + + +class GUI: + + def __init__(self, session_info: dict): + + self.figure_window = PerformanceFigure(RIGHT_IX, LEFT_IX) + self.fig_name = session_info['basedir'] + "/" + session_info['basename'] + "/" + \ + session_info['basename'] + "_choice_plot" + '.png' + + ############################################################################################### + # pygame window setup and keystroke handler + ############################################################################################### + try: + pygame.init() + self.main_display = pygame.display.set_mode((800, 600)) + pygame.display.set_caption(session_info["box_name"]) + self.check_plot(self.figure_window.figure) + + print( + "\nKeystroke handler initiated. In order for keystrokes to register, the pygame window" + ) + print("must be in the foreground.\n") + print( + Fore.GREEN + + Style.BRIGHT + + " TO EXIT, CLICK THE MAIN TEXT WINDOW AND PRESS CTRL-C " + + Fore.RED + + "ONCE\n" + + Style.RESET_ALL + ) + self.keyboard_active = True + + except Exception as error_message: + print("pygame issue\n") + print(str(error_message)) + + ############################################################################################### + # check for data visualization - uses pygame window to show behavior progress + ############################################################################################### + + def check_plot(self, figure=None, FPS=144, savefig=False): + if figure: + FramePerSec = pygame.time.Clock() + figure.canvas.draw() + self.main_display.blit(figure, (0, 0)) + pygame.display.update() + FramePerSec.tick(FPS) + + if savefig: + plt.figure(figure.number) + plt.savefig(self.fig_name) + + else: + print("No figure available") + + def set_callbacks(self, presenter: Presenter): + """ + Put the callbacks in the presenter; add references to them here. + :param Presenter: + :return: + """ + self.K_escape_callback = presenter.K_escape_callback + + self.K_1_down_callback = presenter.K_1_down_callback + self.K_2_down_callback = presenter.K_2_down_callback + self.K_3_down_callback = presenter.K_3_down_callback + + self.K_1_up_callback = presenter.K_1_up_callback + self.K_2_up_callback = presenter.K_2_up_callback + self.K_3_up_callback = presenter.K_3_up_callback + + self.K_q_callback = presenter.K_q_callback + self.K_w_callback = presenter.K_w_callback + self.K_e_callback = presenter.K_e_callback + self.K_r_callback = presenter.K_r_callback + self.K_t_callback = presenter.K_t_callback + self.K_a_callback = presenter.K_a_callback + self.K_g_callback = presenter.K_g_callback + + ############################################################################################### + # check for key presses - uses pygame window to simulate nosepokes and licks + ############################################################################################### + + def check_keyboard(self): + + if self.keyboard_active: + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + self.K_escape_callback() + + # lick port interaction buttons + elif event.key == pygame.K_1: + self.K_1_down_callback() + elif event.key == pygame.K_2: + self.K_2_down_callback() + elif event.key == pygame.K_3: + self.K_3_down_callback() + + # interactive training functions + elif event.key == pygame.K_q: + self.K_q_callback() + elif event.key == pygame.K_w: + self.K_w_callback() + elif event.key == pygame.K_e: + self.K_e_callback() + elif event.key == pygame.K_r: + self.K_r_callback() + elif event.key == pygame.K_t: + self.K_t_callback() + elif event.key == pygame.K_a: + self.K_a_callback() + elif event.key == pygame.K_g: + self.K_g_callback() + + elif event.type == pygame.KEYUP: + if event.key == pygame.K_1: + self.K_1_up_callback() + elif event.key == pygame.K_2: + self.K_2_up_callback() + elif event.key == pygame.K_3: + self.K_3_up_callback() diff --git a/task_protocol/headfixed_task/__init__.py b/task_protocol/headfixed_task/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/task_protocol/headfixed_task/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/task_protocol/headfixed_task/headfixed_independent_reward_task.py b/task_protocol/headfixed_task/headfixed_independent_reward_task.py deleted file mode 100644 index 9484671..0000000 --- a/task_protocol/headfixed_task/headfixed_independent_reward_task.py +++ /dev/null @@ -1,471 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training task structure -description: - an updated test version of headfixed_task.py & add foraging reward condition - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import sys -sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class HeadfixedIndependentRewardTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.session_info["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.session_info["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["wait_for_choice"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'initiate'], - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.correct_trial_number = 0 - self.actual_trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.early_lick_error = False - self.initiate_error = False - self.cue_state_error = False - self.wrong_choice_error = True - self.multiple_choice_error = False - self.error_repeat = False - - self.pump_num = None - self.reward_size = None - self.current_reward = None - self.reward_check = False - self.reward_size_offset = self.session_info['reward_size_offset'] - - self.block_count = 0 - self.blocknumber = self.session_info["block_number"] - self.current_card = None - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - - self.treadmill = self.box.treadmill - - self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - self.distance_buffer = None - self.distance_diff = 0 - - # for foragaing parameters - self.side_choice = None # whether free choice is left or right - self.cue_state = None - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - # there can only be lick during the reward available state - # if lick detected prior to reward available state - # the trial will restart and transition to standby - if self.event_name is "left_entry" or self.event_name == "right_entry": - # print("EVENT NAME !!!!!! " + self.event_name) - if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": - pass - else: - self.early_lick_error = True - self.error_repeat = True - self.restart() - if self.state == "standby": - pass - elif self.state == "initiate": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.initiate_error = False - self.start_cue() - else: - self.initiate_error = True - elif self.state == "cue_state": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_cue: - self.cue_state_error = False - self.evaluate_reward() - else: - self.cue_state_error = True - elif self.state == "reward_available": - cue_state = self.current_card[0] - side_mice = None - if self.event_name == "left_entry": - side_mice = 'left' - self.left_poke_count += 1 - self.left_poke_count_list.append(self.left_poke_count) - self.timeline_left_poke.append(time.time()) - elif self.event_name == "right_entry": - side_mice = 'right' - self.right_poke_count += 1 - self.right_poke_count_list.append(self.right_poke_count) - self.timeline_right_poke.append(time.time()) - if side_mice: - self.side_mice_buffer = side_mice - self.cue_state = cue_state # cue state for foraging - if cue_state == 'all': - side_choice = side_mice - if side_choice == 'left': - self.pump_num = self.current_card[2][0] - self.reward_size = self.current_reward[0] - print("self.current_reward[0]: " + str(self.current_reward[0])) - elif side_choice == 'right': - self.pump_num = self.current_card[2][1] - self.reward_size = self.current_reward[1] - print("self.current_reward[0]: " + str(self.current_reward[1])) - elif cue_state == 'LED_L': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[0] - elif cue_state == 'LED_R': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[1] - print("!!!!!!!!CUE_STATE: " + str(cue_state)) - if side_mice == side_choice: # if the animal chose correctly - self.side_mice_buffer = side_mice - if side_mice == side_choice: # if the animal chose correctly - if self.lick_count == 0: # if this is the first lick - self.side_choice = side_choice # foraging task - self.wrong_choice_error = False - self.reward_check = True - self.lick_count += 1 - self.restart() - elif self.side_mice_buffer: - if self.lick_count == 0: - self.wrong_choice_error = True - self.lick_count += 1 - self.restart() - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - if self.early_lick_error: - self.error_list.append("early_lick_error") - logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.early_lick_error = False - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.lick_count = 0 - self.side_mice_buffer = None - self.box.event_list.clear() - pass - - def enter_initiate(self): - # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes - # check error_repeat - logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) - self.check_cue('sound1') - self.trial_running = True - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) - print("EVENT NAME: " + str(self.box.event_list)) - self.cue_off('sound1') - if self.initiate_error: - self.error_list.append('initiate_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) - self.error_count += 1 - - def enter_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) - # turn on the cue according to the current card - self.check_cue(self.current_card[0]) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) - self.cue_off(self.current_card[0]) - if not self.early_lick_error: - if self.cue_state_error: - self.check_cue("sound2") - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - if self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('no_choice_error') - elif self.wrong_choice_error: - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('wrong_choice_error') - elif self.reward_check: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.pump.reward(self.pump_num, self.reward_size) - self.error_repeat = False - self.total_reward += 1 - self.reward_check = False - self.error_list.append('correct_trial') - self.pump_num = None - self.reward_size = None - self.wrong_choice_error = False - - - def check_cue(self, cue): - if cue == 'sound1': - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) - self.box.sound1.on() - if cue == 'sound2': - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) - self.box.sound2.blink(1, 0.1, 1) - elif cue == 'LED_L': - self.box.cueLED1.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) - elif cue == 'all': - self.box.cueLED1.on() - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) - - def cue_off(self, cue): - if cue == 'all': - self.box.cueLED1.off() - self.box.cueLED2.off() - elif cue == 'sound1': - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) - elif cue == 'sound2': - self.box.sound2.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) - elif cue == 'LED_L': - self.box.cueLED1.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) - - def get_distance(self): - try: - distance = self.treadmill.distance_cm - except Exception as e: - logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) - self.treadmill = self.box.treadmill - distance = self.treadmill.distance_cm - return distance - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - print(type(fig)) - - ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/headfixed_task/headfixed_task.py b/task_protocol/headfixed_task/headfixed_task.py deleted file mode 100644 index 76c6da0..0000000 --- a/task_protocol/headfixed_task/headfixed_task.py +++ /dev/null @@ -1,470 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: headfixed2FC_task.py -goal: model_free reinforcement learning behavioral training task structure -description: - an updated test version of headfixed_task.py & add foraging reward condition - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled -import sys -sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class HeadfixedTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name="initiate", - on_enter=["enter_initiate"], - on_exit=["exit_initiate"], - timeout=self.session_info["initiation_timeout"], - on_timeout=["restart"]), - Timeout(name='cue_state', - on_enter=["enter_cue_state"], - on_exit=["exit_cue_state"], - timeout=self.session_info["cue_timeout"], - on_timeout=["restart"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["wait_for_choice"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'initiate'], - ['start_cue', 'initiate', 'cue_state'], - ['evaluate_reward', 'cue_state', 'reward_available'], - ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.correct_trial_number = 0 - self.actual_trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.early_lick_error = False - self.initiate_error = False - self.cue_state_error = False - self.wrong_choice_error = True - self.multiple_choice_error = False - self.error_repeat = False - - self.pump_num = None - self.reward_size = None - self.current_reward = None - self.reward_check = False - self.reward_size_offset = self.session_info['reward_size_offset'] - - self.block_count = 0 - self.blocknumber = self.session_info["block_number"] - self.current_card = None - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - - self.treadmill = self.box.treadmill - - self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - self.distance_buffer = None - self.distance_diff = 0 - - # for foragaing parameters - self.side_choice = None # whether free choice is left or right - self.cue_state = None - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - # there can only be lick during the reward available state - # if lick detected prior to reward available state - # the trial will restart and transition to standby - if self.event_name is "left_entry" or self.event_name == "right_entry": - # print("EVENT NAME !!!!!! " + self.event_name) - if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": - pass - else: - self.early_lick_error = True - self.error_repeat = True - self.restart() - if self.state == "standby": - pass - elif self.state == "initiate": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_initiation: - self.initiate_error = False - self.start_cue() - else: - self.initiate_error = True - elif self.state == "cue_state": - self.distance_diff = self.get_distance() - self.distance_buffer - if self.distance_diff >= self.distance_cue: - self.cue_state_error = False - self.evaluate_reward() - else: - self.cue_state_error = True - elif self.state == "reward_available": - cue_state = self.current_card[0] - side_mice = None - if self.event_name == "left_entry": - side_mice = 'left' - self.left_poke_count += 1 - self.left_poke_count_list.append(self.left_poke_count) - self.timeline_left_poke.append(time.time()) - elif self.event_name == "right_entry": - side_mice = 'right' - self.right_poke_count += 1 - self.right_poke_count_list.append(self.right_poke_count) - self.timeline_right_poke.append(time.time()) - if side_mice: - self.side_mice_buffer = side_mice - self.cue_state = cue_state # cue state for foraging - if cue_state == 'all': - side_choice = side_mice - if side_choice == 'left': - self.pump_num = self.current_card[2][0] - self.reward_size = self.current_reward[0] - print("self.current_reward[0]: " + str(self.current_reward[0])) - elif side_choice == 'right': - self.pump_num = self.current_card[2][1] - self.reward_size = self.current_reward[1] - print("self.current_reward[0]: " + str(self.current_reward[1])) - elif cue_state == 'LED_L': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[0] - elif cue_state == 'LED_R': - side_choice = self.current_card[1] - self.pump_num = self.current_card[2] - self.reward_size = self.current_reward[1] - print("!!!!!!!!CUE_STATE: " + str(cue_state)) - if side_mice == side_choice: # if the animal chose correctly - self.side_mice_buffer = side_mice - if side_mice == side_choice: # if the animal chose correctly - if self.lick_count == 0: # if this is the first lick - self.side_choice = side_choice # foraging task - self.wrong_choice_error = False - self.reward_check = True - self.lick_count += 1 - self.restart() - elif self.side_mice_buffer: - if self.lick_count == 0: - self.wrong_choice_error = True - self.lick_count += 1 - self.restart() - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - if self.early_lick_error: - self.error_list.append("early_lick_error") - logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.early_lick_error = False - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.lick_count = 0 - self.side_mice_buffer = None - self.box.event_list.clear() - pass - - def enter_initiate(self): - # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes - # check error_repeat - logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) - self.check_cue('sound1') - self.trial_running = True - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_initiate(self): - # check the flag to see whether to shuffle or keep the original card - logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) - print("EVENT NAME: " + str(self.box.event_list)) - self.cue_off('sound1') - if self.initiate_error: - self.error_list.append('initiate_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) - self.error_count += 1 - - def enter_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) - # turn on the cue according to the current card - self.check_cue(self.current_card[0]) - # wait for treadmill signal and process the treadmill signal - self.distance_buffer = self.get_distance() - logging.info( - ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) - - def exit_cue_state(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) - self.cue_off(self.current_card[0]) - if not self.early_lick_error: - if self.cue_state_error: - self.check_cue("sound2") - self.error_list.append('cue_state_error') - self.error_repeat = True - logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) - self.error_count += 1 - self.cue_state_error = False - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - if self.lick_count == 0: - logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('no_choice_error') - elif self.wrong_choice_error: - logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) - self.check_cue('sound2') - self.error_repeat = True - self.error_count += 1 - self.error_list.append('wrong_choice_error') - elif self.reward_check: - logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) - self.pump.reward(self.pump_num, self.reward_size) - self.error_repeat = False - self.total_reward += 1 - self.reward_check = False - self.error_list.append('correct_trial') - self.pump_num = None - self.reward_size = None - self.wrong_choice_error = False - - - def check_cue(self, cue): - if cue == 'sound1': - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) - self.box.sound1.on() - if cue == 'sound2': - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) - self.box.sound2.blink(1, 0.1, 1) - elif cue == 'LED_L': - self.box.cueLED1.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) - elif cue == 'all': - self.box.cueLED1.on() - self.box.cueLED2.on() - logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) - - def cue_off(self, cue): - if cue == 'all': - self.box.cueLED1.off() - self.box.cueLED2.off() - elif cue == 'sound1': - self.box.sound1.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) - elif cue == 'sound2': - self.box.sound2.off() - logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) - elif cue == 'LED_L': - self.box.cueLED1.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) - elif cue == 'LED_R': - self.box.cueLED2.off() - logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) - - def get_distance(self): - try: - distance = self.treadmill.distance_cm - except Exception as e: - logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) - self.treadmill = self.box.treadmill - distance = self.treadmill.distance_cm - return distance - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.left_poke_count_list - time_left = self.timeline_left_poke - trajectory_right = self.right_poke_count_list - time_right = self.timeline_right_poke - print(type(fig)) - - ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py b/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py deleted file mode 100644 index 1957312..0000000 --- a/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env -S ipython3 -i -# run_headfixed2FC_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: run_headfixed_independent_reward_task.py -goal: model_free reinforcement learning behavioral training run task file -description: - an updated test version of run_headfixed_task.py & add foraging task - -""" -import random -import numpy as np -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from headfixed_independent_reward_task import HeadfixedIndependentRewardTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - - import sys - - session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - from task_information_independent_reward import TaskInformation - task_information = TaskInformation() - # print("Imported task_information_headfixed: " + str(task_information.name)) - task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) - - - def cumsum_positive(input_list): - for index in range(len(input_list)): - if index == 0 and input_list[index] < 0: - input_list[index] = -input_list[index] - elif input_list[index] + input_list[index - 1] < 0: - input_list[index] = input_list[index] - input_list[index - 1] - else: - input_list[index] = input_list[index] + input_list[index - 1] - return input_list - - def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): - # initial reward (need to be random) - rewards_L = [1] - rewards_R = [1] - for a in np.arange(np.round(ntrials / change_point)): - temp = np.random.randn(change_point) * scale - rewards_L.append(cumsum_positive(temp) + offset) - temp = np.random.randn(change_point) * scale - rewards_R.append(cumsum_positive(temp) + offset) - rewards_L = np.hstack(rewards_L) - rewards_R = np.hstack(rewards_R) - # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') - reward_LR = [rewards_L, rewards_R] - reward_LR = np.transpose(np.array(reward_LR)) - reward_LR = reward_LR[0:ntrials, :] - # print(reward_LR) - return reward_LR - - def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only - session_start = random.uniform(0, period_width) - session_end = session_start + session_length - value_input = np.arange(session_start, session_end, increment) - - sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale - negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale - left_side_reward = np.random.normal(sine_output, deviation) - right_side_reward = np.random.normal(negative_sine_output, deviation) - reward_list = list(zip(left_side_reward, right_side_reward)) - return reward_list - - if session_info['phase'] == "independent_reward": - # from reward_distribution import generate_reward_trajectory - scale = session_info['independent_reward']['scale'] - offset = session_info['independent_reward']['offset'] - change_point = session_info['independent_reward']['change_point'] - ntrials = session_info['independent_reward']['ntrials'] - reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) - elif session_info['phase'] == "forced_choice": - reward_size = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - session_length = session_info["sine_reward"]["session_length"] - increment = session_info["sine_reward"]["increment"] - period_width = session_info["sine_reward"]["period_width"] - amplitude_offset = session_info["sine_reward"]["amplitude_offset"] - amplitude_scale = session_info["sine_reward"]["amplitude_scale"] - deviation = session_info["sine_reward"]["deviation"] - reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, - amplitude_scale, deviation, session_length) - elif session_info['phase'] == 'foraging_reward': - offset = session_info['foraging_reward']['offset'] - max_reward = session_info['foraging_reward']['max_reward'] - increment = session_info['foraging_reward']['increment'] - reward_distribution = (3,3) - - - first_trial_of_the_session = True - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info - t_end = time.time() + 60 * t_minute - while time.time() < t_end: # time check - if task.error_repeat: # error repeat check - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - print("Trial " + str(task.actual_trial_number) + " \n") - task.actual_trial_number += 1 - print("*******************************\n") - print("*error_repeat trial* \n" + - " - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - else: - if not first_trial_of_the_session: - print("reward_time_out: " + str(session_info["reward_timeout"])) - sleep(session_info["reward_timeout"]) - else: - first_trial_of_the_session = False - # setup the beginning of a new trial - task.error_count = 0 # reset the error count if previous trial is correct - print("Trial " + str(task.actual_trial_number) + " \n") - task.correct_trial_number += 1 - task.actual_trial_number += 1 - print("*******************************\n") - # acquire new reward contingency and cue association - #print("fraction " + str(session_info['fraction']) + " \n") - task.current_card = task_information.draw_card(session_info['phase'], session_info['fraction']) - if session_info['phase'] == "independent_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) - elif session_info['phase'] == "forced_choice": - task.current_reward = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] - elif session_info['phase'] == 'foraging_reward': - reward_L = reward_distribution[0] - reward_R = reward_distribution[1] - task.current_reward = reward_distribution - if task.cue_state == 'all': - if task.side_choice == 'left': - reward_L = reward_L - increment - reward_R = reward_R + increment - if reward_L < 0: - reward_L = 0 - if reward_R > max_reward: - reward_R = max_reward - elif task.side_choice == 'right': - reward_R = reward_R - increment - reward_L = reward_L + increment - if reward_R < 0: - reward_R = 0 - if reward_L > max_reward: - reward_L = max_reward - reward_distribution = (reward_L, reward_R) - task.current_reward = reward_distribution - - - logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + - ";current_reward_" + str(task.current_reward)[1:-1]) - - print(" - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() \ No newline at end of file diff --git a/task_protocol/headfixed_task/run_headfixed_task.py b/task_protocol/headfixed_task/run_headfixed_task.py deleted file mode 100644 index be08437..0000000 --- a/task_protocol/headfixed_task/run_headfixed_task.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env -S ipython3 -i -# run_headfixed2FC_task.py -""" -author: tian qiu & Soyoun Kim -date: 2023-02-16 -name: run_headfixed_independent_reward_task.py -goal: model_free reinforcement learning behavioral training run task file -description: - an updated test version of run_headfixed_task.py & add foraging task - -""" -import random -import numpy as np -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from headfixed_task import HeadfixedTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - - import sys - - session_info_path = '/home/pi/experiment_info/headfixed_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - from task_information_independent_reward import TaskInformation - task_information = TaskInformation() - # print("Imported task_information_headfixed: " + str(task_information.name)) - task = HeadfixedTask(name="headfixed_task", session_info=session_info) - - - def cumsum_positive(input_list): - for index in range(len(input_list)): - if index == 0 and input_list[index] < 0: - input_list[index] = -input_list[index] - elif input_list[index] + input_list[index - 1] < 0: - input_list[index] = input_list[index] - input_list[index - 1] - else: - input_list[index] = input_list[index] + input_list[index - 1] - return input_list - - def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): - # initial reward (need to be random) - rewards_L = [1] - rewards_R = [1] - for a in np.arange(np.round(ntrials / change_point)): - temp = np.random.randn(change_point) * scale - rewards_L.append(cumsum_positive(temp) + offset) - temp = np.random.randn(change_point) * scale - rewards_R.append(cumsum_positive(temp) + offset) - rewards_L = np.hstack(rewards_L) - rewards_R = np.hstack(rewards_R) - # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') - reward_LR = [rewards_L, rewards_R] - reward_LR = np.transpose(np.array(reward_LR)) - reward_LR = reward_LR[0:ntrials, :] - # print(reward_LR) - return reward_LR - - def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only - session_start = random.uniform(0, period_width) - session_end = session_start + session_length - value_input = np.arange(session_start, session_end, increment) - - sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale - negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale - left_side_reward = np.random.normal(sine_output, deviation) - right_side_reward = np.random.normal(negative_sine_output, deviation) - reward_list = list(zip(left_side_reward, right_side_reward)) - return reward_list - - if session_info['phase'] == "independent_reward": - # from reward_distribution import generate_reward_trajectory - scale = session_info['independent_reward']['scale'] - offset = session_info['independent_reward']['offset'] - change_point = session_info['independent_reward']['change_point'] - ntrials = session_info['independent_reward']['ntrials'] - reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) - elif session_info['phase'] == "forced_choice": - reward_size = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - session_length = session_info["sine_reward"]["session_length"] - increment = session_info["sine_reward"]["increment"] - period_width = session_info["sine_reward"]["period_width"] - amplitude_offset = session_info["sine_reward"]["amplitude_offset"] - amplitude_scale = session_info["sine_reward"]["amplitude_scale"] - deviation = session_info["sine_reward"]["deviation"] - reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, - amplitude_scale, deviation, session_length) - elif session_info['phase'] == 'foraging_reward': - offset = session_info['foraging_reward']['offset'] - max_reward = session_info['foraging_reward']['max_reward'] - increment = session_info['foraging_reward']['increment'] - reward_distribution = (3,3) - - - first_trial_of_the_session = True - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info - t_end = time.time() + 60 * t_minute - while time.time() < t_end: # time check - if task.error_repeat: # error repeat check - task.error_repeat = False - print("punishment_time_out: " + str(session_info["punishment_timeout"])) - sleep(session_info["punishment_timeout"]) - print("Trial " + str(task.actual_trial_number) + " \n") - task.actual_trial_number += 1 - print("*******************************\n") - print("*error_repeat trial* \n" + - " - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - else: - if not first_trial_of_the_session: - print("reward_time_out: " + str(session_info["reward_timeout"])) - sleep(session_info["reward_timeout"]) - else: - first_trial_of_the_session = False - # setup the beginning of a new trial - task.error_count = 0 # reset the error count if previous trial is correct - print("Trial " + str(task.actual_trial_number) + " \n") - task.correct_trial_number += 1 - task.actual_trial_number += 1 - print("*******************************\n") - # acquire new reward contingency and cue association - #print("fraction " + str(session_info['fraction']) + " \n") - task.current_card = task_information.draw_card(session_info['phase'], session_info['fraction']) - if session_info['phase'] == "independent_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) - elif session_info['phase'] == "forced_choice": - task.current_reward = session_info['reward_size'] - elif session_info['phase'] == "sine_reward": - task.current_reward = reward_distribution_list[task.correct_trial_number] - elif session_info['phase'] == 'foraging_reward': - reward_L = reward_distribution[0] - reward_R = reward_distribution[1] - task.current_reward = reward_distribution - if task.cue_state == 'all': - if task.side_choice == 'left': - reward_L = reward_L - increment - reward_R = reward_R + increment - if reward_L < 0: - reward_L = 0 - if reward_R > max_reward: - reward_R = max_reward - elif task.side_choice == 'right': - reward_R = reward_R - increment - reward_L = reward_L + increment - if reward_R < 0: - reward_R = 0 - if reward_L > max_reward: - reward_L = max_reward - reward_distribution = (reward_L, reward_R) - task.current_reward = reward_distribution - - - logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + - ";current_reward_" + str(task.current_reward)[1:-1]) - - print(" - Current card condition: \n" + - "*******************************\n" + - "*reward_side: " + str(task.current_card[0]) + "\n" + - "*reward_size: " + str(task.current_reward)[1:-1] + "\n") - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() \ No newline at end of file diff --git a/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py b/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py deleted file mode 100644 index 4c4bbf1..0000000 --- a/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py +++ /dev/null @@ -1,130 +0,0 @@ -from datetime import datetime -import os -import pysistence, collections -import socket -import pandas as pd -import numpy as np - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -# session_info['basedir'] = '/home/pi/video' -session_info['weight'] = 0.0 -session_info['manual_date'] = '2023-07-13' -session_info['box_name'] = socket.gethostname() -session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts - -session_info['config'] = 'headfixed2FC' - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info["lick_threshold"] = 1 -# visual stimulus -session_info["visual_stimulus"] = False - -session_info['config'] = 'headfixed2FC' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True -session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice -session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' - - - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_cue'] = 5 # cm - session_info['treadmill_setup']['distance_initiation'] = 10 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info['cue'] = ['LED_L', 'LED_R', 'all'] -# session_info['state'] = ['block1', 'block2'] # -session_info['choice'] = ['right', 'left'] # lick port -session_info['air_duration'] = 0 -session_info["vacuum_duration"] = 1 - -""" solenoid calibration information configuration """ - -solenoid_coeff = None -def get_coefficient(): - df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") - pump_coefficient = {} - - for pump_num in range(1, 5): - df_pump = df_calibration[df_calibration['pump_number'] == pump_num] - mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) - on_time = df_pump['on_time'] - - fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first - pump_coefficient[str(pump_num)] = fit_calibration - return pump_coefficient - -try: - solenoid_coeff = get_coefficient() -except Exception as e: - print(e) - -session_info["calibration_coefficient"] = {} - -if solenoid_coeff: - session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] - session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] - session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] - session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] -else: - print("No coefficients, generate the default") - # solenoid valve linear fit coefficient for each pump - session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first - session_info["calibration_coefficient"]['2'] = [0.13, 0] - session_info["calibration_coefficient"]['3'] = [0.13, 0.0] - session_info["calibration_coefficient"]['4'] = [0.13, 0.0] - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['wait_for_choice'] = 60 -session_info['reward_timeout'] = 1 -session_info["punishment_timeout"] = 3 - -session_info["key_reward_amount"] = 2 -session_info['reward_size_offset'] = 2 -session_info['reward_size'] = (5, 5) - -if session_info["phase"] == 'independent_reward': - session_info['independent_reward'] = {} - session_info['independent_reward']['scale'] = 0.5 - session_info['independent_reward']['offset'] = 3.0 - session_info['independent_reward']['change_point'] = 20 - session_info['independent_reward']['ntrials'] = 1000 -elif session_info["phase"] == 'sine_reward': - session_info["sine_reward"] = {} - session_info["sine_reward"]["increment"] = 1 - session_info["sine_reward"]["period_width"] = 40 - session_info["sine_reward"]["amplitude_offset"] = 2 - session_info["sine_reward"]["amplitude_scale"] = 3 - session_info["sine_reward"]["deviation"] = 0 -elif session_info['phase'] == 'foraging_reward': - session_info["foraging_reward"] = {} - session_info["foraging_reward"]["increment"] = 0.25 - session_info["foraging_reward"]["offset"] = 3 - session_info["foraging_reward"]["max_reward"] = 10 - - -session_info['consecutive_control'] = False -if session_info['consecutive_control']: - session_info['consecutive_max'] = 3 \ No newline at end of file diff --git a/task_protocol/headfixed_task/session_info_headfixed_task.py b/task_protocol/headfixed_task/session_info_headfixed_task.py deleted file mode 100644 index 5b8795d..0000000 --- a/task_protocol/headfixed_task/session_info_headfixed_task.py +++ /dev/null @@ -1,131 +0,0 @@ -from datetime import datetime -import os -import pysistence, collections -import socket -import pandas as pd -import numpy as np - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -# session_info['basedir'] = '/home/pi/video' -session_info['weight'] = 0.0 -session_info['manual_date'] = '2023-07-13' -session_info['box_name'] = socket.gethostname() -session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts - -session_info['config'] = 'headfixed2FC' - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info["lick_threshold"] = 1 -# visual stimulus -session_info["visual_stimulus"] = False - -session_info['config'] = 'headfixed2FC' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True -session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice -session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' - - - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_cue'] = 5 # cm - session_info['treadmill_setup']['distance_initiation'] = 10 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info['cue'] = ['LED_L', 'LED_R', 'all'] -# session_info['state'] = ['block1', 'block2'] # -session_info['choice'] = ['right', 'left'] # lick port -session_info['air_duration'] = 0 -session_info["vacuum_duration"] = 1 - -""" solenoid calibration information configuration """ - -solenoid_coeff = None -def get_coefficient(): - df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") - pump_coefficient = {} - - for pump_num in range(1, 5): - df_pump = df_calibration[df_calibration['pump_number'] == pump_num] - mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) - on_time = df_pump['on_time'] - - fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first - pump_coefficient[str(pump_num)] = fit_calibration - return pump_coefficient - -try: - solenoid_coeff = get_coefficient() -except Exception as e: - print(e) - -session_info["calibration_coefficient"] = {} - -if solenoid_coeff: - session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] - session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] - session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] - session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] -else: - print("No coefficients, generate the default") - # solenoid valve linear fit coefficient for each pump - session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first - session_info["calibration_coefficient"]['2'] = [0.13, 0] - session_info["calibration_coefficient"]['3'] = [0.13, 0.0] - session_info["calibration_coefficient"]['4'] = [0.13, 0.0] - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['wait_for_choice'] = 60 -session_info['reward_timeout'] = 1 -session_info["punishment_timeout"] = 3 - -session_info["key_reward_amount"] = 2 -session_info['reward_size_offset'] = 2 -session_info['reward_size'] = (5, 5) - -if session_info["phase"] == 'independent_reward': - session_info['independent_reward'] = {} - session_info['independent_reward']['scale'] = 0.5 - session_info['independent_reward']['offset'] = 3.0 - session_info['independent_reward']['change_point'] = 20 - session_info['independent_reward']['ntrials'] = 1000 -elif session_info["phase"] == 'sine_reward': - session_info["sine_reward"] = {} - session_info["sine_reward"]["increment"] = 1 - session_info["sine_reward"]["period_width"] = 40 - session_info["sine_reward"]["amplitude_offset"] = 2 - session_info["sine_reward"]["amplitude_scale"] = 3 - session_info["sine_reward"]["deviation"] = 0 -elif session_info['phase'] == 'foraging_reward': - session_info["foraging_reward"] = {} - session_info["foraging_reward"]["increment"] = 0.25 - session_info["foraging_reward"]["offset"] = 3 - session_info["foraging_reward"]["max_reward"] = 10 - - -session_info['consecutive_control'] = False -if session_info['consecutive_control']: - session_info['consecutive_max'] = 3 - diff --git a/task_protocol/headfixed_task/task_information_headfixed.py b/task_protocol/headfixed_task/task_information_headfixed.py deleted file mode 100644 index ddcf184..0000000 --- a/task_protocol/headfixed_task/task_information_headfixed.py +++ /dev/null @@ -1,46 +0,0 @@ -import random - - -class TaskInformation(object): - def __init__(self, **kwargs): - self.name = "model_based_reinforcement_learning_task" - self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ] - - def draw_card(self, phase="independent_reward", fraction=0.5): - row_start = 0 - row_end = len(self.deck)-1 - - if phase == 'forced_choice': - row_end = 1 - elif phase == 'free_choice': - row_start = 9 - elif phase == 'forced_choice_left': - row_end = 0 - elif phase == 'forced_choice_right': - row_start = 1 - row_end = 1 - else: - if fraction == 0.5: - row_start = 8 - row_end = 11 - elif fraction == 0.7: - row_start = 6 - elif fraction == 0.3: - row_end = 13 - elif fraction == 1: - row_start = 11 - - card = self.deck[random.randint(row_start, row_end)] - return card - -# print(TaskInformation().draw_card()) diff --git a/task_protocol/headfixed_task/task_information_independent_reward.py b/task_protocol/headfixed_task/task_information_independent_reward.py deleted file mode 100644 index a423b6d..0000000 --- a/task_protocol/headfixed_task/task_information_independent_reward.py +++ /dev/null @@ -1,46 +0,0 @@ -import random - - -class TaskInformation(object): - def __init__(self, **kwargs): - self.name = "model_based_reinforcement_learning_task" - self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), - ] - - def draw_card(self, phase="independent_reward", fraction=0.5): - row_start = 0 - row_end = len(self.deck)-1 - - if phase == 'forced_choice': - row_end = 1 - elif phase == 'free_choice': - row_start = 9 - elif phase == 'forced_choice_left': - row_end = 0 - elif phase == 'forced_choice_right': - row_start = 1 - row_end = 1 - else: - if fraction == 0.5: - row_start = 8 - row_end = 11 - elif fraction == 0.7: - row_start = 6 - elif fraction == 0.3: - row_end = 13 - elif fraction == 1: - row_start = 11 - - card = self.deck[random.randint(row_start, row_end)] - return card - -# print(TaskInformation().draw_card()) \ No newline at end of file diff --git a/task_protocol/kelly_task/__init__.py b/task_protocol/kelly_task/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/task_protocol/kelly_task/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/task_protocol/kelly_task/kelly_record_task.py b/task_protocol/kelly_task/kelly_record_task.py deleted file mode 100755 index a149eb8..0000000 --- a/task_protocol/kelly_task/kelly_record_task.py +++ /dev/null @@ -1,60 +0,0 @@ -# Kelly recording task -# This task is designed for recording freely moving animal behavioral task - -import logging -from datetime import datetime -import os -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -# updated with reorganization (on 7/11/2023) -import sys -sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') -import behavbox -class KellyRecordTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - print(self.session_info) - - # initialize behavior box - # self.box = behavbox_test.BehavBoxTest(self.session_info) - self.box = behavbox.BehavBox(self.session_info) - def start_session(self): - print("Start recording video") - self.box.video_start() - - def end_session(self): - print("Stop recording video") - self.box.video_stop() diff --git a/task_protocol/kelly_task/kelly_task.py b/task_protocol/kelly_task/kelly_task.py deleted file mode 100755 index f3ce1f1..0000000 --- a/task_protocol/kelly_task/kelly_task.py +++ /dev/null @@ -1,183 +0,0 @@ -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled -# updated with reorganization (on 7/11/2023) -import sys -sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class KellyTask(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - ######################################################################## - # Task has three possible states: standby, reward_available, and cue - ######################################################################## - self.states = [ - State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), - Timeout( - name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - ), - Timeout( - name="cue", - on_enter=["enter_cue"], - on_exit=["exit_cue"], - timeout=self.session_info["timeout_length"], - on_timeout=["timeup"], - ), - ] - # can set later with task.machine.states['cue'].timeout etc. - - ######################################################################## - # list of possible transitions between states - # format is: [event_name, source_state, destination_state] - ######################################################################## - self.transitions = [ - ["trial_start", "standby", "reward_available"], - ["active_poke", "reward_available", "cue"], - ["timeup", "cue", "standby"], - ] - - ######################################################################## - # initialize state machine and behavior box - ######################################################################## - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial="standby", - ) - self.trial_running = False - - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = behavbox.Pump() - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def enter_standby(self): - print("entering standby") - # self.box.sound2.blink(0.5, 0.1, 1) - self.trial_running = False - - def exit_standby(self): - pass - - def enter_reward_available(self): - print("entering reward_available") - print("start white noise") - self.box.sound1.blink(0.5, 0.1, 1) - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) - self.trial_running = True - - def exit_reward_available(self): - print("stop white noise") - - def enter_cue(self): - print("deliver reward") - self.box.cueLED4.on() - self.box.sound3.blink(0.5, 0.1, 1) - # self.pump.reward("left", self.session_info["reward_size"]) - print("start cue") - self.box.cueLED4.off() - # self.box.cueLED1.on() - - - def exit_cue(self): - print("stop cue") - # self.box.sound3.blink(0.5, 0.1, 1) - # self.box.cueLED1.off() - - ######################################################################## - # call the run() method repeatedly in a while loop in the main session - # script it will process all detected events from the behavior box (e.g. - # nosepokes and licks) and trigger the appropriate state transitions - ######################################################################## - def run(self): - - # read in name of an event the box has detected - if self.box.event_list: - event_name = self.box.event_list.popleft() - else: - event_name = "" - - if self.state == "standby": - pass - - elif self.state == "reward_available": - if event_name == "left_IR_entry": - # self.box.sound2.blink(0.5,0.1,1) - self.pump.reward("1", self.session_info["reward_size"]) - self.active_poke() # triggers state transition - if event_name == "right_IR_entry": - self.pump.reward("3", self.session_info["reward_size"]) - # self.box.sound2.blink(0.5,0.1,1) - self.active_poke() # triggers state transition - elif self.state == "cue": - # self.box.sound3.blink(0.5, 0.1, 1) - pass - - # look for keystrokes - self.box.check_keybd() - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.box.video_stop() - self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/kelly_task/run_kelly_task.py b/task_protocol/kelly_task/run_kelly_task.py deleted file mode 100755 index 2c03e74..0000000 --- a/task_protocol/kelly_task/run_kelly_task.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -from icecream import ic -import logging -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from kelly_task import KellyTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - task_info_path = '/home/pi/experiment_info/kelly_task/session_info' - sys.path.insert(0, task_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - # initiate task object\ - task = KellyTask(name="fentanyl_task", session_info=session_info) - - # # you can change various parameters if you want - # task.machine.states['cue'].timeout = 2 - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - sleep(10) - # loop over trials - for i in range(2): - logging.info(str("##############################\n" + - str(time.time())) + ", starting_trial, " + str(i) + - str("\n##############################")) - - task.trial_start() - - while task.trial_running: - task.run() - - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - pygame.quit() - - -# # exit because of error -# except (RuntimeError) as ex: -# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) -# # save dicts to disk -# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) -# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - - - - diff --git a/task_protocol/kelly_task/run_record_task.py b/task_protocol/kelly_task/run_record_task.py deleted file mode 100755 index 66c7e31..0000000 --- a/task_protocol/kelly_task/run_record_task.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env -S ipython3 -i - -debug_enable = False - -import logging -from datetime import datetime -import os -import logging.config -import socket -import importlib -import colorama -from colorama import Fore, Style -import scipy.io, pickle -from time import sleep - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from kelly_record_task import KellyRecordTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - # There should be a session_info module corresponding to this before running this file - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - task_info_path = '/home/pi/experiment_info/record_task/session_info' - sys.path.insert(0, task_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info[ - 'datetime'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # initiate task object\ - task = KellyRecordTask(name="fentanyl_task", session_info=session_info) - - # start session - print("start_session") - duration_buffer = 10 # it takes 8 seconds for the camera and the video_start function to be set up - duration = int(input("Enter the time in seconds: ")) + duration_buffer - task.start_session() - sleep(duration) - task.end_session() - dir_name = session_info['dir_name'] - basename = session_info['basename'] - file_name = dir_name + "/" + basename - base_dir = '/mnt/hd/' - hd_dir = base_dir + basename - - # Per Kelly's request, remove all the files except the video file from the hard drive -# print("Remove mat - ") -# os.system("rm -r " + hd_dir + "/*.mat") -# print("Remove pkl - ") -# os.system("rm -r " + hd_dir + "/*.pkl") -# print("Remove log -") -# os.system("rm -r " + hd_dir + "/*.log") - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - task.end_session() - # # save dicts to disk - # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) - # # pygame.quit() - - -# exit because of error -except (RuntimeError) as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # # save dicts to disk - # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) - # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) diff --git a/task_protocol/kelly_task/session_info_year-month-date.py b/task_protocol/kelly_task/session_info_year-month-date.py deleted file mode 100755 index 5abf3e8..0000000 --- a/task_protocol/kelly_task/session_info_year-month-date.py +++ /dev/null @@ -1,65 +0,0 @@ -# put all of your mouse and session info in here -import random -from datetime import datetime -import os -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] -# session_info['trainingPhase'] = 4 -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' -# for actual data save to this dir: -# session_info['basedir'] = '/home/pi/video' -session_info['weight'] = 32.18 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -# session_info['config'] = 'freely_moving_v1' -session_info['experiment_setup'] = 'head_fixed' -session_info['treadmill'] = True -session_info['treadmill_setup'] = {} -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 5 # cm - session_info['treadmill_setup']['distance_short'] = 7 # cm - session_info['treadmill_setup']['distance_long'] = 30 # cm - -# behavior parameters -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['cue_timeout'] = 120 -session_info['reward_timeout'] = 5 -session_info["reward_wait"] = 5 -session_info["punishment_timeout"] = 0 - -# error repeat -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_repeat_max'] = 3 - -# reward parameters -# session_info['reward_size'] = 10 # in microliters -session_info['reward_size'] = {'small': 5, 'large': 10} # in microliters - -# visual stimulus -session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.dat', -# '/home/pi/gratings/second_grating.dat'] -session_info['vis_gratings'] = [] -session_info['vis_raws'] = [] - -# define block_duration and initial block to start the session -session_info['block_duration'] = 2 # each block has this amount of repetition -session_info['block_variety'] = 2 -if session_info['block_variety'] > 1: - initial_block = 1 diff --git a/task_protocol/self_admin_task/__init__.py b/task_protocol/self_admin_task/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/task_protocol/self_admin_task/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/task_protocol/self_admin_task/remi_self_admin_task.py b/task_protocol/self_admin_task/remi_self_admin_task.py deleted file mode 100644 index 76db1a1..0000000 --- a/task_protocol/self_admin_task/remi_self_admin_task.py +++ /dev/null @@ -1,374 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - - -# remifentanil self-administration task - -# NOTE: THIS TASK WILL BE NEARLY IDENTICAL TO THE SUCROSE SA TASK, EXCEPT THE MOUSE WILL -# OBTAIN AN INTRAVENOUS INFUSION OF REMIFENTANIL INSTEAD OF SUCROSE -# I MOSTLY NEED ASSISTANCE WITH THE ivsa_syringe_pump class (which will presumably end up in the behavbox code, not this code) - -# python3: headfixed_task.py -""" -author: tian qiu -date: 2023-02-28 -name: remi_self_admin_task.py -goal: self administration task adpated via Mitch's instruction -description: - an updated test version of self_admin_Task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled -# updated with reorganization (on 7/11/2023) -import sys -sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') -import behavbox -# import ivsa_syringe_pump # I will need to add the ivsa_syringe_pump class to the behavbox code - - -#######################ivsa_syringe_pump code below######################### -""" -class ivsa_syringe_pump(object,session_info): # changed this to syringe pump - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - self.syringe_pump = LED(23) - self.reward_list = [] - - # COMMENTS ON REWARD LOGIC# - # Syringe pump will be turned on depending on the weight of the mouse - # For a 30g mouse, the syringe pump will be on for 1 second - # For <30g mouse, the syringe pump will be on for <1s - # For >30g mouse, the syringe pump will be on for >1s - def reward(self): # prototype mouse weight equals 30 - infusion_duration = (self.session_info['mouse_weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial - self.syringe_pump.blink(infusion_duration, 0.1, - 1) # season's edit: this is a shorter implement without having a function - self.reward_list.append(("syringe_pump_reward", infusion_duration)) - logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) - # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration - -""" -# COMMENTS ON INJECT LOGIC# -# this code will turn on the syringe pump, sleep for 'infusion_duration', then turn off the syringe pump with a 2nd pulse -# def inject(self, duration): # season's' edit: a function requires the input - infusion duration -# self.on() -# sleep(duration) # season's' edit: a function requires the input - infusion duration -# self.off() -############################################################################ - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class RemiSelfAdminTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] - ['restart', 'reward_available', 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.lever_pressed_time = 0.0 - self.lever_press_interval = self.session_info["lever_press_interval"] - # self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False - self.reward_time_delay = self.session_info["reward_time_delay"] - self.reward_time_recent = time.time() - self.reward_pump = self.session_info["reward_pump"] - self.reward_size = self.session_info["reward_size"] - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - - # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - # self.distance_buffer = None - # self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - # for the reward function - self.syringe_pump = LED(23) - self.reward_list = [] - - def reward(self): # prototype mouse weight equals 30 - infusion_duration = (self.session_info['weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial - self.syringe_pump.blink(infusion_duration, 0.1, - 1) # season's edit: this is a shorter implement without having a function - self.reward_list.append(("syringe_pump_reward", infusion_duration)) - logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) - # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - if self.state == "standby": - pass - elif self.state == "reward_available": - if self.event_name == "reserved_rx1_pressed": - lever_pressed_time_temp = time.time() - lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time - if lever_pressed_dt >= self.lever_press_interval and (time.time() - self.reward_time_recent > self.reward_time_delay): - self.reward() - self.lever_pressed_time = lever_pressed_time_temp - self.reward_time_recent = time.time() - self.total_reward += 1 - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - # self.cue_off('all') - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - # if self.early_lick_error: - # self.error_list.append("early_lick_error") - # self.early_lick_error = False - self.lick_count = 0 - self.side_mice_buffer = None - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - # self.cue_off('all') - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.box.event_list.clear() - pass - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - self.trial_running = True - # self.reward_times_up = False - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - # self.cue_off('sound2') - # self.reward_times_up = True - self.pump.reward("vaccum", 0) - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/self_admin_task/run_remi_self_admin_task.py b/task_protocol/self_admin_task/run_remi_self_admin_task.py deleted file mode 100644 index 5825a8e..0000000 --- a/task_protocol/self_admin_task/run_remi_self_admin_task.py +++ /dev/null @@ -1,134 +0,0 @@ -#run_self_admin.task - -#!/usr/bin/env -S ipython3 -i -# run_self_admin_task.py -""" -author: tian qiu -date: 2023-02-28 -name: run_remi_self_admin_task.py -goal: running the self_admin_Task -description: - adapted from Mitch's run_self_admin_task.py - -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from remi_self_admin_task import RemiSelfAdminTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - - task = RemiSelfAdminTask(name="remi_self_admin_task", session_info=session_info) - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - for i in range(session_info['max_trial_number']): - print("Trial " + str(i) + "\n") - if time.time() >= t_end: - print("Times up, finishing up") - break - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() diff --git a/task_protocol/self_admin_task/run_self_admin_task.py b/task_protocol/self_admin_task/run_self_admin_task.py deleted file mode 100644 index cf52841..0000000 --- a/task_protocol/self_admin_task/run_self_admin_task.py +++ /dev/null @@ -1,134 +0,0 @@ -#run_self_admin.task - -#!/usr/bin/env -S ipython3 -i -# run_self_admin_task.py -""" -author: tian qiu -date: 2023-01-25 -name: run_self_admin_task.py -goal: running the self_admin_Task -description: - adapted from Mitch's run_self_admin_task.py - -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from self_admin_task import SelfAdminTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - - task = SelfAdminTask(name="self_admin_task", session_info=session_info) - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - for i in range(session_info['max_trial_number']): - print("Trial " + str(i) + "\n") - if time.time() >= t_end: - print("Times up, finishing up") - break - logging.info(";" + str(time.time()) + ";[transition];start_trial()") - task.start_trial() # initiate the time state machine, start_trial() is a trigger - while task.trial_running: - task.run() # run command trigger additional functions outside of the state machine - print("error_count: " + str(task.error_count)) - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() diff --git a/task_protocol/self_admin_task/self_admin_task.py b/task_protocol/self_admin_task/self_admin_task.py deleted file mode 100644 index 1f04a15..0000000 --- a/task_protocol/self_admin_task/self_admin_task.py +++ /dev/null @@ -1,310 +0,0 @@ -# python3: headfixed_task.py -""" -author: tian qiu -date: 2023-01-26 -name: self_admin_Task.py -goal: self administration task adpated via Mitch's instruction -description: - an updated test version of self_admin_Task.py - -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled -# updated with reorganization (on 7/11/2023) -import sys -sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class SelfAdminTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_enter=["enter_standby"], - on_exit=["exit_standby"]), - Timeout(name='reward_available', - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"], - timeout=self.session_info["reward_timeout"], - on_timeout=["restart"]) - ] - self.transitions = [ - ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] - ['restart', 'reward_available', 'standby'] - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - self.trial_running = False - - # trial statistics - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.lever_pressed_time = 0.0 - self.lever_press_interval = self.session_info["lever_press_interval"] - # self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward - self.reward_times_up = False - self.reward_pump = self.session_info["reward_pump"] - self.reward_size = self.session_info["reward_size"] - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - - # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] - # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] - # self.distance_buffer = None - # self.distance_diff = 0 - - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - ######################################################################## - # functions called when state transitions occur - ######################################################################## - def run(self): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = "" - if self.state == "standby": - pass - elif self.state == "reward_available": - if self.event_name == "reserved_rx1_pressed": - lever_pressed_time_temp = time.time() - lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time - if lever_pressed_dt >= self.lever_press_interval: - self.pump.reward(self.reward_pump, self.reward_size) - self.lever_pressed_time = lever_pressed_time_temp - self.total_reward += 1 - # self.active_press += 1 - # self.active_press_count_list.append(self.left_poke_count) - # self.timeline_active_press.append(time.time()) - # elif self.event_name == "reserved_rx2_pressed": - # - # self.inactive_press += 1 - # self.inactive_press_count_list.append(self.right_poke_count) - # self.timeline_inactive_press.append(time.time()) - - # Lick detection: - # if self.event_name == "left_IR_entry": - # self.left_poke_count += 1 - # self.left_poke_count_list.append(self.left_poke_count) - # self.timeline_left_poke.append(time.time()) - # self.lick_count += 1 - - # look for keystrokes - self.box.check_keybd() - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) - # self.cue_off('all') - self.update_plot_choice() - # self.update_plot_error() - self.trial_running = False - # self.reward_error = False - # if self.early_lick_error: - # self.error_list.append("early_lick_error") - # self.early_lick_error = False - # self.lick_count = 0 - # self.side_mice_buffer = None - print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) - logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.box.event_list.clear() - pass - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) - self.trial_running = True - # self.reward_times_up = False - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) - # self.cue_off('sound2') - # self.reward_times_up = True - self.pump.reward("vaccum", 0) - # if self.multiple_choice_error: - # logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) - # self.error_repeat = False - # self.error_list.append('multiple_choice_error') - # self.multiple_choice_error = False - # elif self.lick_count == 0: - # logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) - # self.error_repeat = True - # self.error_list.append('no_choice_error') - # self.lick_count = 0 - # self.reward_time_start = None - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ - self.session_info['basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/self_admin_task/session_info_self_admin.py b/task_protocol/self_admin_task/session_info_self_admin.py deleted file mode 100644 index 340fd91..0000000 --- a/task_protocol/self_admin_task/session_info_self_admin.py +++ /dev/null @@ -1,66 +0,0 @@ -# session_info_self_admin.py - -# put all of your mouse and session info in here - -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' - -session_info['weight'] = 32.18 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -# session_info['config'] = 'freely_moving_v1' -session_info['config'] = 'self_admin' - -session_info['max_trial_number'] = 100 - -# behavior parameters -session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters -session_info["lick_threshold"] = 2 -# visual stimulus -session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', -# '/home/pi/second_grating.dat'] -# session_info['vis_raws'] = [] - -# task related information - -session_info['config'] = 'headfixed_walk' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 10 # cm - session_info['treadmill_setup']['distance_cue'] = 25 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -# condition setup -session_info["reward_pump"] = '1' -session_info['reward_size'] = 5 - - -# define timeout during each condition -session_info['initiation_timeout'] = 120 # s -session_info['reward_timeout'] = 60 -# session_info["punishment_timeout"] = 1 diff --git a/task_protocol/task_presenter.py b/task_protocol/task_presenter.py new file mode 100644 index 0000000..9a6a8bd --- /dev/null +++ b/task_protocol/task_presenter.py @@ -0,0 +1,191 @@ +import collections +from typing import Protocol, List, Tuple + +import matplotlib as mpl +import matplotlib.pyplot as plt +import numpy as np + +from icecream import ic +import time +import logging + +import callbacks + +SEED = 0 +rng = np.random.default_rng(seed=SEED) + + +PUMP1_IX = 0 +PUMP2_IX = 1 +trial_choice_map = {'right': 0, 'left': 1} + + +class Task(Protocol): + trial_choice_list: List[int] + trial_correct_list: List[bool] + trial_choice_times: List[float] + trial_reward_given: List[bool] + event_list: collections.deque + + state: str + rewards_earned_in_block: int + rewards_available_in_block: int + + def run_event_loop(self) -> Tuple[str, bool, float]: + ... + + def switch_to_timeout(self): + ... + + def sample_next_block(self): + ... + + +class GUI(Protocol): + correct_line: mpl.lines.Line2D + incorrect_line: mpl.lines.Line2D + reward_line: mpl.lines.Line2D + figure_window: plt.Figure + + def check_keyboard(self) -> None: + ... + + def check_plot(self, figure, save_fig=False) -> None: + ... + + +class Box(Protocol): + def video_start(self): + ... + + def video_stop(self): + ... + + +class Pump(Protocol): + def reward(self, pump_key: str, reward_size: float): + ... + + +class AlternatingLatentPresenter(callbacks.Callbacks): + + def __init__(self, name: str, task: Task, box: Box, pump: Pump, + gui: GUI, session_info: dict): + + self.task: Task = task + self.gui: GUI = gui + self.box = box + self.pump = pump + self.session_info = session_info + self.pump_keys = (session_info["reward_pump1"], session_info['reward_pump2']) + self.reward_size_large = session_info['reward_size_large'] + self.reward_size_small = session_info['reward_size_small'] + + ############################################################################################### + # event list trigger by the interaction between the RPi and the animal for visualization + # interact_list: lick, choice interaction between the board and the animal for visualization + ############################################################################################### + self.interact_list = [] + + self.keypress_training_reward = False + self.automatic_training_rewards = False + + def run(self) -> None: + """ + Process one event, checking GUI and events as needed. + Currently set to give rewards probabilistically (same reward sizes, unequal reward probabilities) + """ + # make this say if correct real choice or incorrect real choice + choice_correct, give_training_reward, cur_time = self.task.run_event_loop() + # goes thru the whole timeout before doing the plotting bits I think + if self.task.state in ['A', 'C1', 'right_active']: + correct_pump = PUMP1_IX + incorrect_pump = PUMP2_IX + elif self.task.state in ['B', 'C2', 'left_active']: + correct_pump = PUMP2_IX + incorrect_pump = PUMP1_IX + else: + raise RuntimeError('state not recognized') + + # give reward if + # 1. training reward/human reward (give reward, regardless of action) + # 2. correct choice and meets correct reward probability + # 3. incorrect but REAL choice (i.e. not a switch) and meets incorrect reward probability + + if give_training_reward: + reward_size = self.reward_size_large[correct_pump] + self.task.rewards_earned_in_block += 1 + self.task.trial_reward_given.append(True) + logging.info(";" + str(time.time()) + ";[reward];giving_reward;" + str("")) + self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) + + elif choice_correct == 'correct': + if rng.random() < self.session_info['correct_reward_probability']: + reward_size = self.reward_size_large[correct_pump] + self.task.rewards_earned_in_block += 1 + self.task.trial_reward_given.append(True) + else: + reward_size = 0 + self.task.trial_reward_given.append(False) + + print('current state: {}; rewards earned in block: {}'.format(self.task.state, self.task.rewards_earned_in_block)) + self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) + + elif choice_correct == 'incorrect': + if rng.random() < self.session_info['incorrect_reward_probability']: + reward_size = self.reward_size_large[incorrect_pump] # can modify these to a single value, reward large and reward small + self.task.rewards_earned_in_block += 1 + self.task.trial_reward_given.append(True) + else: + reward_size = 0 + self.task.trial_reward_given.append(False) + + print('current state: {}; rewards earned in block: {}'.format(self.task.state, self.task.rewards_earned_in_block)) + self.deliver_reward(pump_key=self.pump_keys[incorrect_pump], reward_size=reward_size) + + if self.task.trial_choice_list: + self.update_plot() + + self.gui.check_keyboard() + if self.task.rewards_earned_in_block > self.task.rewards_available_in_block: + self.task.sample_next_block() + # if choice_correct: # is not None + # self.task.switch_to_timeout() + + def update_plot(self, save_fig=False) -> None: + ix = np.array(self.task.trial_correct_list) + choices = np.array(self.task.trial_choice_list) + times = np.array(self.task.trial_choice_times) + rewards = np.array(self.task.trial_reward_given) + + correct_trials = choices[ix] + correct_times = times[ix] + + incorrect_trials = choices[~ix] + incorrect_times = times[~ix] + + reward_trials = choices[rewards] + reward_times = times[rewards] + + self.gui.figure_window.correct_line.set_data(correct_times, correct_trials) + self.gui.figure_window.error_line.set_data(incorrect_times, incorrect_trials) + self.gui.figure_window.reward_line.set_data(reward_times, reward_trials) + # print('correct trials:', correct_trials) + + # update this to show the last 20-ish trials + if times.size > 1: + T = [times[-20:][0], times[-1]] + else: + T = [times[-1]-.5, times[-1]+.5] + plt.xlim(T) + + self.gui.check_plot(figure=self.gui.figure_window.figure, savefig=save_fig) + + def start_session(self) -> None: + ic("TODO: start video") + self.box.video_start() + + def end_session(self) -> None: + ic("TODO: stop video") + self.box.video_stop() + self.update_plot(save_fig=True) From f7002e6f182c8ff65eb71c2cfe6203c1657c683c Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Tue, 14 Nov 2023 11:17:32 -0500 Subject: [PATCH 106/135] removed unneccesary TODO --- task_protocol/alternating_latent/task_model.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/task_protocol/alternating_latent/task_model.py b/task_protocol/alternating_latent/task_model.py index 826d420..6ec8500 100644 --- a/task_protocol/alternating_latent/task_model.py +++ b/task_protocol/alternating_latent/task_model.py @@ -37,18 +37,6 @@ class TimedStateMachine(Machine): class AlternateLatent(object): def __init__(self, session_info: dict): # name and session_info should be provided as kwargs - """ - Refactoring: - Hold performance (choices, correct history, choice time) in the model - No params class encapsulation, not enough params to make that worth it - - TODO - - - transitions to new blocks; adjusting event list clearing - - setup automation of training rewards - - logging? here or in the controller? - - """ - # TASK + BEHAVIOR STATUS self.right_active = True self.trial_running = False From fb6c422f3fd4bc01bc7145e256aa07cbb4b8ca1a Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Fri, 17 Nov 2023 11:27:32 -0500 Subject: [PATCH 107/135] dummy behavbox to run code without physical setup --- essential/dummy_box.py | 21 +++++++++++++++++++++ outputs/__init__.py | 0 2 files changed, 21 insertions(+) create mode 100644 essential/dummy_box.py create mode 100644 outputs/__init__.py diff --git a/essential/dummy_box.py b/essential/dummy_box.py new file mode 100644 index 0000000..b82a03a --- /dev/null +++ b/essential/dummy_box.py @@ -0,0 +1,21 @@ +class BehavBox(object): + + def __init__(self, session_info): + pass + + def set_callbacks(self, Presenter): + pass + + def video_start(self): + pass + + def video_stop(self): + pass + + +class Pump(object): + def __init__(self, session_info): + pass + + def reward(self, which_pump, reward_size): + pass \ No newline at end of file diff --git a/outputs/__init__.py b/outputs/__init__.py new file mode 100644 index 0000000..e69de29 From 36864340d222e0ae630377fd5bf56bfae569d1c3 Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Fri, 8 Dec 2023 13:07:52 -0500 Subject: [PATCH 108/135] updating with sample session files --- .../{callbacks.py => base_presenter.py} | 34 +- task_protocol/gui.py | 3 + task_protocol/session_info_sample.py | 90 +++ task_protocol/task_presenter.py | 6 +- .../to_be_refactored/A_B_C1_C2_task.py | 599 ++++++++++++++++++ task_protocol/to_be_refactored/A_B_task.py | 482 ++++++++++++++ task_protocol/to_be_refactored/C1_C2_task.py | 464 ++++++++++++++ .../latent_inference_forage_task.py | 345 ++++++++++ ...tent_inference_forage_task_three_states.py | 375 +++++++++++ .../to_be_refactored/run_A_B_C1_C2_task.py | 134 ++++ .../to_be_refactored/run_A_B_task.py | 134 ++++ .../to_be_refactored/run_C1_C2_task.py | 134 ++++ 12 files changed, 2795 insertions(+), 5 deletions(-) rename task_protocol/{callbacks.py => base_presenter.py} (89%) create mode 100644 task_protocol/session_info_sample.py create mode 100644 task_protocol/to_be_refactored/A_B_C1_C2_task.py create mode 100644 task_protocol/to_be_refactored/A_B_task.py create mode 100644 task_protocol/to_be_refactored/C1_C2_task.py create mode 100644 task_protocol/to_be_refactored/latent_inference_forage_task.py create mode 100644 task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py create mode 100644 task_protocol/to_be_refactored/run_A_B_C1_C2_task.py create mode 100644 task_protocol/to_be_refactored/run_A_B_task.py create mode 100644 task_protocol/to_be_refactored/run_C1_C2_task.py diff --git a/task_protocol/callbacks.py b/task_protocol/base_presenter.py similarity index 89% rename from task_protocol/callbacks.py rename to task_protocol/base_presenter.py index efd6293..470c250 100644 --- a/task_protocol/callbacks.py +++ b/task_protocol/base_presenter.py @@ -1,9 +1,11 @@ import logging import time from typing import List, Tuple, Protocol +from abc import ABC, abstractmethod +from icecream import ic """ -Mixin functions for use with the Presenter of the behavbox model-view-presenter. +Abstract base class for use with the Presenter of the behavbox model-view-presenter. """ @@ -25,12 +27,22 @@ class GUI(Protocol): keyboard_active: bool -class Callbacks: +class Box(Protocol): + def video_start(self): + ... + + def video_stop(self): + ... + + +class Presenter(ABC): interact_list: List[Tuple[float, str]] pump: Pump task: Task gui: GUI + session_info: dict + box: Box def deliver_reward(self, pump_key: str, reward_size: int) -> None: self.pump.reward(pump_key, reward_size) @@ -171,5 +183,23 @@ def K_g_callback(self) -> None: self.task.give_training_reward = True logging.info(";" + str(time.time()) + ";[action];set_give_reward_true") + def start_session(self) -> None: + ic("TODO: start video") + self.box.video_start() + + def end_session(self) -> None: + ic("TODO: stop video") + self.box.video_stop() + self.update_plot(save_fig=True) + + @abstractmethod + def run(self) -> None: + ... + + @abstractmethod + def update_plot(self, save_fig=False) -> None: + ... + + diff --git a/task_protocol/gui.py b/task_protocol/gui.py index ea0ced9..048f592 100644 --- a/task_protocol/gui.py +++ b/task_protocol/gui.py @@ -14,6 +14,9 @@ class Presenter(Protocol): + def K_escape_callback(self): + ... + def K_1_down_callback(self): ... diff --git a/task_protocol/session_info_sample.py b/task_protocol/session_info_sample.py new file mode 100644 index 0000000..da879ad --- /dev/null +++ b/task_protocol/session_info_sample.py @@ -0,0 +1,90 @@ +# put all of your mouse and session info in here + +import pysistence, collections +import socket +from datetime import datetime + + +### PARAMETERS - Rig and defaults (should not change between sessions) ### + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'TM001', + 'fake_field': 'fake_info', + }) + +# Parameters: mouse, session type + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['weight'] = 30 # in grams +session_info['date'] = datetime.now().strftime("%Y-%m-%d") # for example, '2023-09-28' +session_info['task_config'] = 'alternating_latent' + +# behavior parameters - ideally set these to a default for each session type, which is adjustable +session_info['max_trial_number'] = 100 +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 2 +session_info['reward_time_delay'] = 20 + +session_info['initiation_timeout'] = 120 # s + +session_info['entry_interval'] = 1 # this is the one that delays between choices +session_info['timeout_time'] = 3 +session_info['ContextA_reward_probability'] = 1 +session_info['ContextB_reward_probability'] = 1 + +session_info['correct_reward_probability'] = 1 +session_info['incorrect_reward_probability'] = 0 + +session_info["ContextA_time"] = 30 # todo - revise this or make adjustable by mouse performance +session_info["ContextB_time"] = 30 +session_info["ContextC_time"] = 30 + +# Reward pump parameters +session_info["reward_pump1"] = '2' +session_info['reward_pump2'] = '1' + +session_info['reward_size_large'] = [3, 3] +session_info['reward_size_small'] = [0, 0] +session_info['errors_to_reward_delivery'] = 5 +session_info['key_reward_amount'] = 3 + +# Parameters - file saving +session_info['file_basename'] = 'place_holder' +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' + +# Parameters - box and rig +session_info['box_name'] = socket.gethostname() + +session_info["visual_stimulus"] = False +session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +session_info['vis_gratings'] = ['/home/pi/gratings/context_a.dat', + '/home/pi/gratings/context_b.dat'] +session_info['vis_raws'] = [] + +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True + + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 10 # cm + session_info['treadmill_setup']['distance_cue'] = 25 # cm +else: + session_info['treadmill_setup'] = None + + +### DEPRECATED / NOT CURRENTLY IN USE ### +session_info['LED_duration'] = 3 + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +session_info["reward_pump"] = '2' +session_info['reward_size'] = 1 \ No newline at end of file diff --git a/task_protocol/task_presenter.py b/task_protocol/task_presenter.py index 9a6a8bd..d96a1ea 100644 --- a/task_protocol/task_presenter.py +++ b/task_protocol/task_presenter.py @@ -9,7 +9,7 @@ import time import logging -import callbacks +from base_presenter import Presenter SEED = 0 rng = np.random.default_rng(seed=SEED) @@ -67,7 +67,7 @@ def reward(self, pump_key: str, reward_size: float): ... -class AlternatingLatentPresenter(callbacks.Callbacks): +class AlternatingLatentPresenter(Presenter): def __init__(self, name: str, task: Task, box: Box, pump: Pump, gui: GUI, session_info: dict): @@ -97,7 +97,7 @@ def run(self) -> None: """ # make this say if correct real choice or incorrect real choice choice_correct, give_training_reward, cur_time = self.task.run_event_loop() - # goes thru the whole timeout before doing the plotting bits I think + # goes through the whole timeout before doing the plotting bits I think if self.task.state in ['A', 'C1', 'right_active']: correct_pump = PUMP1_IX incorrect_pump = PUMP2_IX diff --git a/task_protocol/to_be_refactored/A_B_C1_C2_task.py b/task_protocol/to_be_refactored/A_B_C1_C2_task.py new file mode 100644 index 0000000..a220156 --- /dev/null +++ b/task_protocol/to_be_refactored/A_B_C1_C2_task.py @@ -0,0 +1,599 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + +# python3: A_B_C1_C2_task.py +""" +author: Mitch Farrell +date: 2023-06-09 +name: A_B_C1_C2_task.py +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np +import random + +# from IPython.display import display, HTML +# +# display(HTML("")) + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class A_B_C1_C2_task(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + # Function to generate random list with no 3 in a row of same kind and no two consecutive Contexts + self.context_order_list = [] + self.last_element = -1 + while len(self.context_order_list) < 80: + self.k = random.randint(0, 3) + if self.k != self.last_element: + self.context_order_list.append(self.k) + self.last_element = self.k + + self.context_timing_list = [] + self.context_time_pool = [15, 20, 25, 30, 35] * 16 + for i in range(len(self.context_order_list)): + random.shuffle(self.context_time_pool) + self.context_timing_list.append(self.context_time_pool.pop()) + + self.intercontext_interval_time = [10, 15, 20, 25, 30] * 16 + self.intercontext_interval_list = self.intercontext_interval_time + random.shuffle(self.intercontext_interval_list) + + self.context_order_list_names = self.context_order_list.copy() + for idx, element in enumerate(self.context_order_list_names): + if element == 0: + self.context_order_list_names[idx] = 'ContextA' + elif element == 1: + self.context_order_list_names[idx] = 'ContextB' + elif element == 2: + self.context_order_list_names[idx] = 'ContextC1' + elif element == 3: + self.context_order_list_names[idx] = 'ContextC2' + + self.full_task_list = [] + for i in range(len(self.context_order_list)): + self.full_task_list.append(self.context_timing_list[i]) + self.full_task_list.append(self.intercontext_interval_list[i]) + + self.full_task_names_and_times = [] + for i in range(len(self.context_order_list_names)): + self.full_task_names_and_times.append([self.context_order_list_names[i], self.context_timing_list[i]]) + self.full_task_names_and_times.append(['intercontext_interval', self.intercontext_interval_list[i]]) + + self.full_task_names_and_times.append(['task_end', 60]) + + logging.info(self.full_task_names_and_times) + + self.trial_counter = 0 + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_exit=["exit_standby"]), + State(name="ContextA", + on_enter=["enter_ContextA"], + on_exit = ['exit_ContextA']), + State(name="ContextB", + on_enter=["enter_ContextB"], + on_exit=['exit_ContextB']), + State(name="ContextC1", + on_enter=["enter_ContextC1"], + on_exit=['exit_ContextC1']), + State(name="ContextC2", + on_enter=["enter_ContextC2"], + on_exit=['exit_ContextC2']), + State(name="intercontext_interval", + on_enter=["enter_intercontext_interval"], + on_exit=["exit_intercontext_interval"]) + ] + + self.transitions = [ + ['switch_to_intercontext_interval', ['ContextA','ContextB', 'ContextC1','ContextC2'], 'intercontext_interval'], + ['end_task', ['ContextA','ContextB','ContextC1', 'ContextC2', 'intercontext_interval'], 'standby'], + ['switch_to_ContextA', 'intercontext_interval', 'ContextA'], + ['switch_to_ContextB', 'intercontext_interval', 'ContextB'], + ['switch_to_ContextC1', 'intercontext_interval', 'ContextC1'], + ['switch_to_ContextC2', 'intercontext_interval', 'ContextC2'] + + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + + self.machine.add_transition('start_trial_logic', 'standby', 'ContextA', conditions='start_in_ContextA') + self.machine.add_transition('start_trial_logic', 'standby', 'ContextB', conditions='start_in_ContextB') + self.machine.add_transition('start_trial_logic', 'standby', 'ContextC1', conditions='start_in_ContextC1') + self.machine.add_transition('start_trial_logic', 'standby', 'ContextC2', conditions='start_in_ContextC2') + + # trial statistics + self.intercontext_interval_time = 0 + self.current_state_time = 0 + self.random_ITI = 3 + self.LED_delay_time = 0.3 + self.LED_on_time = 0 + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.entry_time = 0.0 + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + + self.reward_size1 = self.session_info["reward_size1"] #large, right + self.reward_size2 = self.session_info['reward_size2'] #small, left + self.reward_size3 = self.session_info['reward_size3'] #large, left + self.reward_size4 = self.session_info['reward_size4'] #small, right + + self.ContextA_time = 0 + self.ContextB_time = 0 + self.ContextC1_time = 0 + self.ContextC2_time = 0 + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + def run(self): + if self.state == "standby": + pass + elif self.state == 'intercontext_interval': + self.trial_running = False + self.intercontext_interval_time = time.time() + while (time.time() - self.intercontext_interval_time) <= self.current_state_time: + pass + self.switch_to_ContextA_B_C1_C2() + elif self.state == 'ContextA': + self.trial_running = False + self.ContextA_time = time.time() + self.LED_bool = False + self.prior_reward_time = 0 + while (time.time() - self.ContextA_time) <= self.current_state_time: # need to be able to jump out of this loop even in a below while loop; runs when ContextB_duration hasn't elapsed + if not self.LED_bool: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextA_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size2) + self.prior_reward_time = time.time() + self.random_ITI = 3 #2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size1) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + if (time.time() - self.ContextA_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + elif self.state == 'ContextB': + self.trial_running = False + self.ContextB_time = time.time() # assign the context switch time to this variable + self.LED_bool = False + self.prior_reward_time = 0 + while (time.time() - self.ContextB_time) <= self.current_state_time: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextB_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size3) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size4) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + if (time.time() - self.ContextB_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + elif self.state == 'ContextC1': + self.trial_running = False + self.ContextC1_time = time.time() + self.LED_bool = False + self.prior_reward_time = 0 + while (time.time() - self.ContextC1_time) <= self.current_state_time: + if not self.LED_bool: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextC1_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size2) + self.prior_reward_time = time.time() + self.random_ITI = 3 #2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size1) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + if (time.time() - self.ContextC1_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + elif self.state == 'ContextC2': + self.trial_running = False + self.ContextC2_time = time.time() # assign the context switch time to this variable + self.LED_bool = False + self.prior_reward_time = 0 + while (time.time() - self.ContextC2_time) <= self.current_state_time: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextC2_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size3) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size4) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + if (time.time() - self.ContextC2_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + def start_in_ContextA(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': + return True + else: + return False + def start_in_ContextB(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': + return True + else: + return False + + def start_in_ContextC1(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': + return True + else: + return False + + def start_in_ContextC2(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': + return True + else: + return False + + def switch_to_ContextA_B_C1_C2(self): + self.trial_counter += 1 + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': + self.switch_to_ContextA() + elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': + self.switch_to_ContextB() + elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': + self.switch_to_ContextC1() + elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': + self.switch_to_ContextC2() + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby") + self.box.event_list.clear() + + def enter_ContextA(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextA") + self.box.sound1.blink(0.1, 0.1) + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + + str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + str(self.full_task_names_and_times[self.trial_counter][1])) + if self.full_task_names_and_times[self.trial_counter][1] == 15: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 20: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[1],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 25: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[2],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 30: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[3],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 35: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[4],0) + self.trial_running = True + + def exit_ContextA(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextA") + self.box.sound1.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + + def enter_ContextB(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextB") + self.box.sound1.blink(0.2, 0.1) + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + + str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + str(self.full_task_names_and_times[self.trial_counter][1])) + if self.full_task_names_and_times[self.trial_counter][1] == 15: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[5],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 20: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[6],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 25: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[7],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 30: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[8],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 35: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[9],0) + self.trial_running = True + + def exit_ContextB(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextB") + self.box.sound1.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + + def enter_ContextC1(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextC1") + self.box.sound2.on() + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + + str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + str(self.full_task_names_and_times[self.trial_counter][1])) + self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) + self.trial_running = True + + def exit_ContextC1(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextC1") + self.box.sound2.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + self.box.visualstim.myscreen.display_greyscale(0) + + def enter_ContextC2(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextC2") + self.box.sound2.on() + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + + str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + str(self.full_task_names_and_times[self.trial_counter][1])) + self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) + self.trial_running = True + + def exit_ContextC2(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextC2") + self.box.sound2.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + self.box.visualstim.myscreen.display_greyscale(0) + + def enter_intercontext_interval(self): + logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval") + # logging.info(";" + str(time.time()) + ";[transition];enter_inter_" + + # str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + # str(self.full_task_names_and_times[self.trial_counter][1])) + self.trial_running = True + + def exit_intercontext_interval(self): + logging.info(";" + str(time.time()) + ";[transition];exit_intercontext_interval") + self.box.event_list.clear() + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() + diff --git a/task_protocol/to_be_refactored/A_B_task.py b/task_protocol/to_be_refactored/A_B_task.py new file mode 100644 index 0000000..1381a8d --- /dev/null +++ b/task_protocol/to_be_refactored/A_B_task.py @@ -0,0 +1,482 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + +# python3: A_B_task.py +""" +author: Mitch Farrell +date: 2023-05-15 +name: A_B_task.py +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +# from IPython.display import display, HTML +# +# display(HTML("")) + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox +import random + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class A_B_task(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + # Initialize duration lists for contexts and intercontext intervals + self.ContextA_durations = [15, 20, 25, 30, 35] * 8 + self.ContextB_durations = [15, 20, 25, 30, 35] * 8 + self.intercontext_interval_durations = [10, 15, 20, 25, 30] * 16 + + # Shuffling duration lists + random.shuffle(self.ContextA_durations) + random.shuffle(self.ContextB_durations) + random.shuffle(self.intercontext_interval_durations) + + # Initialize context names and counts + self.contexts = ['ContextA', 'ContextB'] + self.context_counts = {'ContextA': 0, 'ContextB': 0} + + # Initialize task list and total duration + self.full_task_names_and_times = [] + self.total_duration = 0 + + # Previous two contexts + self.prev_contexts = ['', ''] + + while self.total_duration < 3600: + # Select a context different from the last two (unless we're in the final 10) + while True: + self.context = random.choice(self.contexts) + if (not (self.prev_contexts[0] == self.prev_contexts[1] == self.context) and self.context_counts[self.context] < 40) or ( + (self.context_counts['ContextA'] >= 30 and self.context_counts['ContextB'] >= 30)): + break + + # Update previous context indicators and increment count + self.prev_contexts[0] = self.prev_contexts[1] + self.prev_contexts[1] = self.context + self.context_counts[self.context] += 1 + + # Select a duration for the context if we have any left for this context + if self.context == 'ContextA' and self.ContextA_durations: + self.duration = self.ContextA_durations.pop() + elif self.context == 'ContextB' and self.ContextB_durations: + self.duration = self.ContextB_durations.pop() + else: + continue + + # Ensure total duration does not exceed 3600 + if self.total_duration + self.duration > 3600: + continue + + # Append the context and its duration to the task list + self.full_task_names_and_times.append([self.context, self.duration]) + self.total_duration += self.duration + + # Select a duration for the intercontext interval + if self.intercontext_interval_durations: + self.interval_duration = self.intercontext_interval_durations.pop() + + # Ensure total duration does not exceed 3600 + if self.total_duration + self.interval_duration > 3600: + continue + + # Append the intercontext interval and its duration to the task list + self.full_task_names_and_times.append(['intercontext_interval', self.interval_duration]) + self.total_duration += self.interval_duration + self.full_task_names_and_times.append(['task_end', 60]) + + logging.info(self.full_task_names_and_times) + + self.trial_counter = 0 + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_exit=["exit_standby"]), + State(name="ContextA", + on_enter=["enter_ContextA"], + on_exit=['exit_ContextA']), + State(name="ContextB", + on_enter=["enter_ContextB"], + on_exit=['exit_ContextB']), + State(name="intercontext_interval", + on_enter=["enter_intercontext_interval"], + on_exit=["exit_intercontext_interval"]) + ] + + self.transitions = [ + ['switch_to_intercontext_interval', ['ContextA','ContextB'], 'intercontext_interval'], + ['end_task', ['ContextA','ContextB','intercontext_interval'], 'standby'], + ['switch_to_ContextA', 'intercontext_interval', 'ContextA'], + ['switch_to_ContextB', 'intercontext_interval', 'ContextB']] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + + self.machine.add_transition('start_trial_logic', 'standby', 'ContextA', conditions='start_in_ContextA') + self.machine.add_transition('start_trial_logic', 'standby', 'ContextB', conditions='start_in_ContextB') + + # trial statistics + self.right_entry_bool = True + self.left_entry_bool = True + self.intercontext_interval_time = 0 + self.current_state_time = 0 + self.random_ITI = 3 #random.randint(2, 4) + self.LED_delay_time = 0.3 + self.LED_on_time = 0 + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.entry_time = 0.0 + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + + self.reward_size1 = self.session_info["reward_size1"] #large, right + self.reward_size2 = self.session_info['reward_size2'] #small, left + self.reward_size3 = self.session_info['reward_size3'] #large, left + self.reward_size4 = self.session_info['reward_size4'] #small, right + + self.ContextA_time = 0 + self.ContextB_time = 0 + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + def run(self): + if self.state == "standby": + pass + elif self.state == 'intercontext_interval': + self.trial_running = False + self.intercontext_interval_time = time.time() + while (time.time() - self.intercontext_interval_time) <= self.current_state_time: + pass + self.switch_to_ContextA_B() + elif self.state == 'ContextA': + self.trial_running = False + self.ContextA_time = time.time() + self.LED_bool = False + self.prior_reward_time = 0 + self.left_entry_bool = False + while (time.time() - self.ContextA_time) <= self.current_state_time: + if not self.LED_bool: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextA_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size2) + self.prior_reward_time = time.time() + self.random_ITI = 3 #2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + self.left_entry_bool = True + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size1) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + if (time.time() - self.ContextA_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + elif self.state == 'ContextB': + self.trial_running = False + self.ContextB_time = time.time() # assign the context switch time to this variable + self.LED_bool = False + self.prior_reward_time = 0 + self.right_entry_bool = False + while (time.time() - self.ContextB_time) <= self.current_state_time: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextB_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size3) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size4) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + self.right_entry_bool = True + if (time.time() - self.ContextB_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + def start_in_ContextA(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': + return True + else: + return False + def start_in_ContextB(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': + return True + else: + return False + + def switch_to_ContextA_B(self): + self.trial_counter += 1 + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': + self.switch_to_ContextB() + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': + self.switch_to_ContextA() + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby") + self.box.event_list.clear() + + def enter_ContextA(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextA") + self.box.sound1.blink(0.1, 0.1) + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_ContextA_" + + str(self.full_task_names_and_times[self.trial_counter][1])) + if self.full_task_names_and_times[self.trial_counter][1] == 15: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 20: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[1],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 25: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[2],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 30: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[3],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 35: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[4],0) + self.trial_running = True + + def exit_ContextA(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextA") + self.box.sound1.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + + def enter_ContextB(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextB") + self.box.sound1.blink(0.2, 0.1) + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_ContextB_" + + str(self.full_task_names_and_times[self.trial_counter][1])) + if self.full_task_names_and_times[self.trial_counter][1] == 15: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[5],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 20: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[6],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 25: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[7],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 30: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[8],0) + elif self.full_task_names_and_times[self.trial_counter][1] == 35: + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[9],0) + self.trial_running = True + + def exit_ContextB(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextB") + self.box.sound1.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + + def enter_intercontext_interval(self): + logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval") + # logging.info(";" + str(time.time()) + ";[transition];enter_inter_" + + # str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + # str(self.full_task_names_and_times[self.trial_counter][1])) + self.trial_running = True + + def exit_intercontext_interval(self): + logging.info(";" + str(time.time()) + ";[transition];exit_intercontext_interval") + self.box.event_list.clear() + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/to_be_refactored/C1_C2_task.py b/task_protocol/to_be_refactored/C1_C2_task.py new file mode 100644 index 0000000..52bac21 --- /dev/null +++ b/task_protocol/to_be_refactored/C1_C2_task.py @@ -0,0 +1,464 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + +# python3: A_B_task.py +""" +author: Mitch Farrell +date: 2023-05-15 +name: A_B_task.py +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +# from IPython.display import display, HTML +# +# display(HTML("")) + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox +import random + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class C1_C2_task(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + # Initialize duration lists for contexts and intercontext intervals + self.ContextC1_durations = [15, 20, 25, 30, 35] * 8 + self.ContextC2_durations = [15, 20, 25, 30, 35] * 8 + self.intercontext_interval_durations = [10, 15, 20, 25, 30] * 16 + + # Shuffling duration lists + random.shuffle(self.ContextC1_durations) + random.shuffle(self.ContextC2_durations) + random.shuffle(self.intercontext_interval_durations) + + # Initialize context names and counts + self.contexts = ['ContextC1', 'ContextC2'] + self.context_counts = {'ContextC1': 0, 'ContextC2': 0} + + # Initialize task list and total duration + self.full_task_names_and_times = [] + self.total_duration = 0 + + # Previous two contexts + self.prev_contexts = ['', ''] + + while self.total_duration < 3600: + # Select a context different from the last two (unless we're in the final 10) + while True: + self.context = random.choice(self.contexts) + if (not (self.prev_contexts[0] == self.prev_contexts[1] == self.context) and self.context_counts[ + self.context] < 40) or ( + (self.context_counts['ContextC1'] >= 30 and self.context_counts['ContextC2'] >= 30)): + break + + # Update previous context indicators and increment count + self.prev_contexts[0] = self.prev_contexts[1] + self.prev_contexts[1] = self.context + self.context_counts[self.context] += 1 + + # Select a duration for the context if we have any left for this context + if self.context == 'ContextC1' and self.ContextC1_durations: + self.duration = self.ContextC1_durations.pop() + elif self.context == 'ContextC2' and self.ContextC2_durations: + self.duration = self.ContextC2_durations.pop() + else: + continue + + # Ensure total duration does not exceed 3600 + if self.total_duration + self.duration > 3600: + continue + + # Append the context and its duration to the task list + self.full_task_names_and_times.append([self.context, self.duration]) + self.total_duration += self.duration + + # Select a duration for the intercontext interval + if self.intercontext_interval_durations: + self.interval_duration = self.intercontext_interval_durations.pop() + + # Ensure total duration does not exceed 3600 + if self.total_duration + self.interval_duration > 3600: + continue + + # Append the intercontext interval and its duration to the task list + self.full_task_names_and_times.append(['intercontext_interval', self.interval_duration]) + self.total_duration += self.interval_duration + self.full_task_names_and_times.append(['task_end', 60]) + logging.info(self.full_task_names_and_times) + # print(f"This is the order of the Contexts and intercontext_intervals along with their respective durations: {self.full_task_names_and_times}") + + self.trial_counter = 0 + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_exit=["exit_standby"]), + State(name="ContextC1", + on_enter=["enter_ContextC1"], + on_exit = ['exit_ContextC1']), + State(name="ContextC2", + on_enter=["enter_ContextC2"], + on_exit=['exit_ContextC2']), + State(name="intercontext_interval", + on_enter=["enter_intercontext_interval"], + on_exit=["exit_intercontext_interval"]) + ] + + self.transitions = [ + ['switch_to_intercontext_interval', ['ContextC1','ContextC2'], 'intercontext_interval'], + ['end_task', ['ContextC1','ContextC2','intercontext_interval'], 'standby'], + ['switch_to_ContextC1', 'intercontext_interval', 'ContextC1'], + ['switch_to_ContextC2', 'intercontext_interval', 'ContextC2']] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + + self.machine.add_transition('start_trial_logic', 'standby', 'ContextC1', conditions='start_in_ContextC1') + self.machine.add_transition('start_trial_logic', 'standby', 'ContextC2', conditions='start_in_ContextC2') + + # trial statistics + self.intercontext_interval_time = 0 + self.current_state_time = 0 + self.random_ITI = 3 #random.randint(2, 4) + self.LED_delay_time = 0.3 + self.LED_on_time = 0 + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.entry_time = 0.0 + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + + self.reward_size1 = self.session_info["reward_size1"] #large, right + self.reward_size2 = self.session_info['reward_size2'] #small, left + self.reward_size3 = self.session_info['reward_size3'] #large, left + self.reward_size4 = self.session_info['reward_size4'] #small, right + + self.ContextC1_time = 0 + self.ContextC2_time = 0 + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + def run(self): + if self.state == "standby": + pass + elif self.state == 'intercontext_interval': + self.trial_running = False + self.intercontext_interval_time = time.time() + while (time.time() - self.intercontext_interval_time) <= self.current_state_time: + pass + self.switch_to_ContextC1_C2() + elif self.state == 'ContextC1': + self.trial_running = False + self.ContextC1_time = time.time() + self.LED_bool = False + self.prior_reward_time = 0 + while (time.time() - self.ContextC1_time) <= self.current_state_time: + if not self.LED_bool: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextC1_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size2) + self.prior_reward_time = time.time() + self.random_ITI = 3 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size1) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + if (time.time() - self.ContextC1_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + elif self.state == 'ContextC2': + self.trial_running = False + self.ContextC2_time = time.time() # assign the context switch time to this variable + self.LED_bool = False + self.prior_reward_time = 0 + while (time.time() - self.ContextC2_time) <= self.current_state_time: + if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and time.time() - self.ContextC2_time <= self.current_state_time: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump2, self.reward_size3) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: + self.box.cueLED1.off() + self.box.cueLED2.off() + self.pump.reward(self.reward_pump1, self.reward_size4) + self.prior_reward_time = time.time() + self.random_ITI = 3 # 2,3,4 + logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) + self.LED_bool = False + if (time.time() - self.ContextC2_time) >= self.current_state_time: + self.switch_to_intercontext_interval() + def start_in_ContextC1(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': + return True + else: + return False + def start_in_ContextC2(self): + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': + return True + else: + return False + + def switch_to_ContextC1_C2(self): + self.trial_counter += 1 + if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': + self.switch_to_ContextC1() + elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': + self.switch_to_ContextC2() + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby") + self.box.event_list.clear() + + def enter_ContextC1(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextC1") + self.box.sound2.on() + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + + str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + str(self.full_task_names_and_times[self.trial_counter][1])) + self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) + self.trial_running = True + + def exit_ContextC1(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextC1") + self.box.sound2.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + self.box.visualstim.myscreen.display_greyscale(0) + + def enter_ContextC2(self): + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + logging.info(";" + str(time.time()) + ";[transition];enter_ContextC2") + self.box.sound2.on() + logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + + str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + str(self.full_task_names_and_times[self.trial_counter][1])) + self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) + self.trial_running = True + + def exit_ContextC2(self): + logging.info(";" + str(time.time()) + ";[transition];exit_ContextC2") + self.box.sound2.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.box.event_list.clear() + self.trial_counter += 1 + self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] + self.box.visualstim.myscreen.display_greyscale(0) + + def enter_intercontext_interval(self): + logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval") + # logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval_" + + # str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + + # str(self.full_task_names_and_times[self.trial_counter][1])) + self.trial_running = True + + def exit_intercontext_interval(self): + logging.info(";" + str(time.time()) + ";[transition];exit_intercontext_interval") + self.box.event_list.clear() + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() + diff --git a/task_protocol/to_be_refactored/latent_inference_forage_task.py b/task_protocol/to_be_refactored/latent_inference_forage_task.py new file mode 100644 index 0000000..69dd349 --- /dev/null +++ b/task_protocol/to_be_refactored/latent_inference_forage_task.py @@ -0,0 +1,345 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + + +# python3: latent_inference_forage_task.py +""" +author: Mitch Farrell +date: 2023-09-20 +name: latent_inference_forage_task.py +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +# from IPython.display import display, HTML +# +# display(HTML("")) + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class LatentInferenceForageTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_exit=["exit_standby"]), + State(name="right_patch", + on_enter=["enter_right_patch"], + on_exit=["exit_right_patch"]), + State(name="left_patch", + on_enter=["enter_left_patch"], + on_exit=["exit_left_patch"]) + ] + + self.transitions = [ + ['start_in_right_patch', 'standby', 'right_patch'], + ['start_in_left_patch', 'standby', 'left_patch'], + + ['switch_to_right_patch', 'left_patch', 'right_patch'], + ['switch_to_left_patch', 'right_patch', 'left_patch'], + + ['end_task', ['left_patch','right_patch'], 'standby']] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + + # trial statistics + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.lick_time = 0.0 + self.lick_interval = self.session_info["lick_interval"] + # self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + self.reward_size1 = self.session_info['reward_size1'] + self.reward_size2 = self.session_info['reward_size2'] + self.reward_size3 = self.session_info['reward_size3'] + self.reward_size4 = self.session_info['reward_size4'] + self.ITI = self.session_info['ITI'] + self.p_switch = self.session_info['p_switch'] + self.p_reward = self.session_info['p_reward'] + self.reward_earned = False + + self.ContextA_time = 0 + self.ContextB_time = 0 + self.LED_on_time_plus_LED_duration = 0 + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + self.right_entry_error = False + self.left_entry_error = False + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + self.right_licks = 0 + self.left_licks = 0 + + def run(self): + if self.state == 'standby': + pass + elif self.state == 'right_patch': + self.trial_running = False + self.LED_bool = False + self.prior_choice_time = 0 + self.reward_earned = False + self.box.event_list.clear() + while self.state == 'right_patch': + if not self.LED_bool: + if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == 'right_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + if self.p_reward >= random.random(): + self.pump.reward(self.reward_pump1, self.reward_size1) #1 reward + if self.p_switch >= random.random(): + self.LED_bool = False + time.sleep(1) + self.switch_to_left_patch() + else: + self.pump.reward(self.reward_pump1, self.reward_size2) #0 reward + if self.event_name == 'left_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str(self.error_repeat)) + elif self.state == 'left_patch': + self.trial_running = False + self.LED_bool = False + self.prior_choice_time = 0 + self.reward_earned = False + self.box.event_list.clear() + while self.state == 'left_patch': + if not self.LED_bool: + if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool: + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == 'left_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + if self.p_reward >= random.random(): + self.pump.reward(self.reward_pump2, self.reward_size1) # 1 reward + if self.p_switch >= random.random(): + self.LED_bool = False + time.sleep(1) + self.switch_to_right_patch() + else: + self.pump.reward(self.reward_pump2, self.reward_size2) # 0 reward + if self.event_name == 'right_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_left_patch;" + str(self.error_repeat)) + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + + def enter_right_patch(self): + logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str(self.error_repeat)) + self.trial_running = True + def exit_right_patch(self): + logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str(self.error_repeat)) + + def enter_left_patch(self): + logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str(self.error_repeat)) + self.trial_running = True + def exit_left_patch(self): + logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str(self.error_repeat)) + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() + self.box.cueLED1.off() + self.box.cueLED2.off() + diff --git a/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py b/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py new file mode 100644 index 0000000..824103d --- /dev/null +++ b/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py @@ -0,0 +1,375 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + + +# python3: latent_inference_forage_task_three_states.py +""" +author: Mitch Farrell +date: 2023-10-26 +name: latent_inference_forage_task_three_states.py +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +# from IPython.display import display, HTML +# +# display(HTML("")) + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class LatentInferenceForageTaskThreeStates(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_exit=["exit_standby"]), + State(name="right_patch", + on_enter=["enter_right_patch"], + on_exit=["exit_right_patch"]), + State(name="left_patch", + on_enter=["enter_left_patch"], + on_exit=["exit_left_patch"]), + State(name='dark_period', + on_enter=['enter_dark_period'], + on_exit=['exit_dark_period']) + ] + + self.transitions = [ + ['start_in_right_patch', 'standby', 'right_patch'], + ['start_in_left_patch', 'standby', 'left_patch'], + + ['switch_to_right_patch', ['dark_period', 'left_patch'], 'right_patch'], + ['switch_to_left_patch', ['dark_period', 'right_patch'], 'left_patch'], + + ['switch_to_dark_period', ['left_patch', 'right_patch'], 'dark_period'], + + ['end_task', ['dark_period', 'left_patch','right_patch'], 'standby']] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + + # trial statistics + self.dark_period_times = [10] + self.end_dark_time = 0 + self.next_dark_time = 0 + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.lick_time = 0.0 + self.lick_interval = self.session_info["lick_interval"] + # self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + self.reward_size1 = self.session_info['reward_size1'] + self.reward_size2 = self.session_info['reward_size2'] + self.reward_size3 = self.session_info['reward_size3'] + self.reward_size4 = self.session_info['reward_size4'] + self.ITI = self.session_info['ITI'] + self.p_switch = self.session_info['p_switch'] + self.p_reward = self.session_info['p_reward'] + self.reward_earned = False + + self.ContextA_time = 0 + self.ContextB_time = 0 + self.LED_on_time_plus_LED_duration = 0 + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + self.right_entry_error = False + self.left_entry_error = False + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + self.right_licks = 0 + self.left_licks = 0 + + def run(self): + if self.state == 'standby' or self.state == 'dark_period': + pass + elif self.state == 'right_patch': + self.trial_running = False + self.LED_bool = False + self.prior_choice_time = 0 + self.reward_earned = False + self.box.event_list.clear() + while self.state == 'right_patch' and self.next_dark_time > time.time(): + if not self.LED_bool: + if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and self.next_dark_time > time.time(): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == 'right_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + if self.p_reward >= random.random(): + self.pump.reward(self.reward_pump1, self.reward_size1) #1 reward + if self.p_switch >= random.random(): + self.LED_bool = False + time.sleep(1) + self.switch_to_left_patch() + else: + self.pump.reward(self.reward_pump1, self.reward_size2) #0 reward + if self.event_name == 'left_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str(self.error_repeat)) + if self.next_dark_time < time.time(): + self.switch_to_dark_period() + elif self.state == 'left_patch': + self.trial_running = False + self.LED_bool = False + self.prior_choice_time = 0 + self.reward_earned = False + self.box.event_list.clear() + while self.state == 'left_patch' and self.next_dark_time > time.time(): + if not self.LED_bool: + if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and self.next_dark_time > time.time(): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == 'left_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + if self.p_reward >= random.random(): + self.pump.reward(self.reward_pump2, self.reward_size1) # 1 reward + if self.p_switch >= random.random(): + self.LED_bool = False + time.sleep(1) + self.switch_to_right_patch() + else: + self.pump.reward(self.reward_pump2, self.reward_size2) # 0 reward + if self.event_name == 'right_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_left_patch;" + str(self.error_repeat)) + if self.next_dark_time < time.time(): + self.switch_to_dark_period() + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.end_dark_time = time.time() + self.next_dark_time = self.end_dark_time + 120 + + def enter_right_patch(self): + logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str(self.error_repeat)) + self.trial_running = True + def exit_right_patch(self): + logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str(self.error_repeat)) + + def enter_left_patch(self): + logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str(self.error_repeat)) + self.trial_running = True + def exit_left_patch(self): + logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str(self.error_repeat)) + + def enter_dark_period(self): + logging.info(";" + str(time.time()) + ";[transition];enter_dark_period;" + str(self.error_repeat)) + self.trial_running = False + self.box.cueLED1.off() + self.box.cueLED2.off() + time.sleep(random.choice(self.dark_period_times)) + self.end_dark_time = time.time() + self.next_dark_time = self.end_dark_time + 120 + if random.random() > 0.5: + self.switch_to_left_patch() + else: + self.switch_to_right_patch() + + def exit_dark_period(self): + logging.info(";" + str(time.time()) + ";[transition];exit_dark_period;" + str(self.error_repeat)) + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() + self.box.cueLED1.off() + self.box.cueLED2.off() + diff --git a/task_protocol/to_be_refactored/run_A_B_C1_C2_task.py b/task_protocol/to_be_refactored/run_A_B_C1_C2_task.py new file mode 100644 index 0000000..1474651 --- /dev/null +++ b/task_protocol/to_be_refactored/run_A_B_C1_C2_task.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + +#!/usr/bin/env -S ipython3 -i + +""" +author: Mitch Farrell +date: 2023-06-12 +name: run_A_B_C1_C2_task.py +goal: running the A_B_C1_C2task +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from A_B_C1_C2_task import A_B_C1_C2_task + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/A_B_C1_C2_task/session_info/' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + task = A_B_C1_C2_task(name="A_B_C1_C2_task", session_info=session_info) + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + i = True #running this while loop until break encountered + task.start_trial_logic() #shifts state from standby to Context B + while i: #change this to a while loop to run through repeatedly, but maintain the original while loop for running the trial + if time.time() >= t_end: + i = False + print("Times up, finishing up") + task.end_task() + break + while task.trial_running: #trial running in both standby and reward_available + task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() + diff --git a/task_protocol/to_be_refactored/run_A_B_task.py b/task_protocol/to_be_refactored/run_A_B_task.py new file mode 100644 index 0000000..967be77 --- /dev/null +++ b/task_protocol/to_be_refactored/run_A_B_task.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + +#!/usr/bin/env -S ipython3 -i + +""" +author: Mitch Farrell +date: 2023-05-16 +name: run_A_B_task.py +goal: running the A_B_task +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from A_B_task import A_B_task + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/A_B_task/session_info/' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + task = A_B_task(name="A_B_task", session_info=session_info) + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + i = True #running this while loop until break encountered + task.start_trial_logic() #shifts state from standby to Context B + while i: #change this to a while loop to run through repeatedly, but maintain the original while loop for running the trial + if time.time() >= t_end: + i = False + print("Times up, finishing up") + task.end_task() + break + while task.trial_running: #trial running in both standby and reward_available + task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() + diff --git a/task_protocol/to_be_refactored/run_C1_C2_task.py b/task_protocol/to_be_refactored/run_C1_C2_task.py new file mode 100644 index 0000000..918055c --- /dev/null +++ b/task_protocol/to_be_refactored/run_C1_C2_task.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + +#!/usr/bin/env -S ipython3 -i + +""" +author: Mitch Farrell +date: 2023-05-16 +name: run_C1_C2_task.py +goal: running the C1_C2_task +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from C1_C2_task import C1_C2_task + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/C1_C2_task/session_info/' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + task = C1_C2_task(name="C1_C2_task", session_info=session_info) + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + i = True #running this while loop until break encountered + task.start_trial_logic() #shifts state from standby to Context B + while i: #change this to a while loop to run through repeatedly, but maintain the original while loop for running the trial + if time.time() >= t_end: + i = False + print("Times up, finishing up") + task.end_task() + break + while task.trial_running: #trial running in both standby and reward_available + task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() + From d284db78770e450fc9ccdef9dbbea36c30de1b15 Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Tue, 23 Jan 2024 18:56:30 -0500 Subject: [PATCH 109/135] Debugging of saving .mat file and slight refactor of alternating latent task --- debug/calibrate.py | 28 +++++++++---------- main.py | 23 +++++++++------ session_info.py | 2 +- .../alternating_latent/task_model.py | 4 ++- .../task_presenter.py | 15 ++-------- task_protocol/base_presenter.py | 14 +++++++--- task_protocol/gui.py | 5 ---- 7 files changed, 46 insertions(+), 45 deletions(-) rename task_protocol/{ => alternating_latent}/task_presenter.py (94%) diff --git a/debug/calibrate.py b/debug/calibrate.py index 175d3f0..9aec7c5 100644 --- a/debug/calibrate.py +++ b/debug/calibrate.py @@ -3,7 +3,7 @@ author: tian qiu date: 2023-03-22 name: calibrate.py -goal: calibrating the the pump and log the data entry +goal: calibrating the pump and log the data entry description: """ @@ -63,32 +63,32 @@ def calibration_flush(calibration_filename, calibration_log): pump_number = str(input("Pump Number: ")) # user inputs the pump number they intend to calibrate at the moment on_duration = float(input("on_time: ")) off_duration = float(input("off_time: ")) - pulse_time = float(input("iteration: ")) + n_iterations = int(input("iterations: ")) weight_tube = float(input("weight_tube: ")) # deliver the water using the pump object # pump.reward(pump_number, on_duration, off_duration, pulse_time) if pump_number == "1": - LED(19).blink(on_time, off_time, iteration) - print("pump1, " + str(on_time) + str(off_time) + str(iteration)) + LED(19).blink(on_duration, off_duration, n_iterations) + print("pump1, " + str(on_duration) + str(off_duration) + str(n_iterations)) elif pump_number == "2": - LED(20).blink(on_time, off_time, iteration) - print("pump2, " + str(on_time) + str(off_time) + str(iteration)) + LED(20).blink(on_duration, off_duration, n_iterations) + print("pump2, " + str(on_duration) + str(off_duration) + str(n_iterations)) elif pump_number == "3": - LED(21).blink(on_time, off_time, iteration) - print("pump3, " + str(on_time) + str(off_time) + str(iteration)) + LED(21).blink(on_duration, off_duration, n_iterations) + print("pump3, " + str(on_duration) + str(off_duration) + str(n_iterations)) elif pump_number == "4": - LED(7).blink(on_time, off_time, iteration) - print("pump4, " + str(on_time) + str(off_time) + str(iteration)) - time.sleep((on_duration+off_duration)*pulse_time + 0.1) - print("Please go weight the container with the liquid!\n") + LED(7).blink(on_duration, off_duration, n_iterations) + print("pump4, " + str(on_duration) + str(off_duration) + str(n_iterations)) + time.sleep((on_duration+off_duration)*n_iterations + 0.1) + print("Please go weigh the container with the liquid!\n") weight_total = float(input("weight_total: ")) weight_fluid = weight_total - weight_tube calibration_log.append( (pump_number, on_duration, off_duration, - pulse_time, weight_tube, weight_total, weight_fluid) + n_iterations, weight_tube, weight_total, weight_fluid) ) abort_or_not = str(input("Abort the program?(Y/N) \n")).upper() - if abort_or_not == 'Y': + if abort_or_not.lower() == ['y']: break print("Flushing the calibration data ...\n") diff --git a/main.py b/main.py index f6f10c7..9ab1cef 100644 --- a/main.py +++ b/main.py @@ -17,7 +17,6 @@ import pygame from colorama import Fore, Style import time -from time import sleep import sys import logging import logging.config @@ -25,10 +24,10 @@ from pathlib import Path -sys.path.insert(0,'./essential') +sys.path.insert(0, './essential') -debug_startup = True -debug_task = False +debug_startup = False +debug_task = True if debug_startup or debug_task: from essential import dummy_box as behavbox else: @@ -60,7 +59,6 @@ # import your task class here sys.path.insert(0,'./task_protocol') -from task_protocol import task_presenter from task_protocol.gui import GUI @@ -119,8 +117,16 @@ def confirm_options(session_info: dict) -> bool: session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] log_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '.log') + # stop if log path exists, or delete prior log file + if os.path.exists(log_path): + print(Fore.RED + Style.BRIGHT + 'ERROR: Log file already exists! Exiting now' + Style.RESET_ALL) + quit() + session_info_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '_session_info.pkl') mat_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '_session_info.mat') + session_info['log_path'] = str(log_path) + + logger = logging.getLogger(__name__) logging.basicConfig( level=logging.INFO, @@ -145,7 +151,7 @@ def confirm_options(session_info: dict) -> bool: ### allow different tasks to be loaded ### task_type = session_info['task_config'] if task_type == 'alternating_latent': - from task_protocol.alternating_latent import task_model + from task_protocol.alternating_latent import task_model, task_presenter task = task_model.AlternateLatent(session_info=session_info) Presenter = task_presenter.AlternatingLatentPresenter name = 'alternating_latent_task' @@ -167,7 +173,7 @@ def confirm_options(session_info: dict) -> bool: gui.set_callbacks(presenter=presenter) # start session - scipy.io.savemat(mat_path, {'session_info': session_info}) + scipy.io.savemat(mat_path, session_info) with open(session_info_path, 'wb') as f: pickle.dump(session_info, f) @@ -175,13 +181,14 @@ def confirm_options(session_info: dict) -> bool: if debug_startup: pass else: - # sleep(5) + # time.sleep(5) # loop over trials # Set a timer t_minute = int(input("Enter the time in minutes: ")) t_end = time.time() + 60 * t_minute run = True + presenter.print_controls() task.sample_next_block() while run: if time.time() < t_end: diff --git a/session_info.py b/session_info.py index da879ad..8eb012a 100644 --- a/session_info.py +++ b/session_info.py @@ -87,4 +87,4 @@ session_info['error_max'] = 3 session_info["reward_pump"] = '2' -session_info['reward_size'] = 1 \ No newline at end of file +session_info['reward_size'] = 1 diff --git a/task_protocol/alternating_latent/task_model.py b/task_protocol/alternating_latent/task_model.py index 6ec8500..9c453ea 100644 --- a/task_protocol/alternating_latent/task_model.py +++ b/task_protocol/alternating_latent/task_model.py @@ -34,6 +34,7 @@ class TimedStateMachine(Machine): pass + class AlternateLatent(object): def __init__(self, session_info: dict): # name and session_info should be provided as kwargs @@ -120,7 +121,6 @@ def start_trial_logic(self): else: self.block_type_counter[0] += 1 - self.switch_to_right_active() else: self.switch_to_left_active() @@ -151,12 +151,14 @@ def enter_right_active(self): self.trial_running = True self.last_state_fxn = self.switch_to_right_active logging.info(";" + str(time.time()) + ";[transition];enter_right_active;" + str("")) + print('entering right active') def enter_left_active(self): self.right_active = False self.trial_running = True self.last_state_fxn = self.switch_to_left_active logging.info(";" + str(time.time()) + ";[transition];enter_left_active;" + str("")) + print('entering left active') def enter_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str("")) diff --git a/task_protocol/task_presenter.py b/task_protocol/alternating_latent/task_presenter.py similarity index 94% rename from task_protocol/task_presenter.py rename to task_protocol/alternating_latent/task_presenter.py index d96a1ea..d81906e 100644 --- a/task_protocol/task_presenter.py +++ b/task_protocol/alternating_latent/task_presenter.py @@ -9,7 +9,7 @@ import time import logging -from base_presenter import Presenter +from task_protocol.base_presenter import Presenter SEED = 0 rng = np.random.default_rng(seed=SEED) @@ -50,7 +50,7 @@ class GUI(Protocol): def check_keyboard(self) -> None: ... - def check_plot(self, figure, save_fig=False) -> None: + def check_plot(self, figure, save_fig: bool = False) -> None: ... @@ -152,7 +152,7 @@ def run(self) -> None: # if choice_correct: # is not None # self.task.switch_to_timeout() - def update_plot(self, save_fig=False) -> None: + def update_plot(self, save_fig: bool = False) -> None: ix = np.array(self.task.trial_correct_list) choices = np.array(self.task.trial_choice_list) times = np.array(self.task.trial_choice_times) @@ -180,12 +180,3 @@ def update_plot(self, save_fig=False) -> None: plt.xlim(T) self.gui.check_plot(figure=self.gui.figure_window.figure, savefig=save_fig) - - def start_session(self) -> None: - ic("TODO: start video") - self.box.video_start() - - def end_session(self) -> None: - ic("TODO: stop video") - self.box.video_stop() - self.update_plot(save_fig=True) diff --git a/task_protocol/base_presenter.py b/task_protocol/base_presenter.py index 470c250..a607595 100644 --- a/task_protocol/base_presenter.py +++ b/task_protocol/base_presenter.py @@ -123,14 +123,17 @@ def K_escape_callback(self) -> None: self.gui.keyboard_active = False def K_1_down_callback(self) -> None: + # left entry logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") self.left_entry() def K_2_down_callback(self) -> None: + # center entry logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") self.center_entry() def K_3_down_callback(self) -> None: + # right entry logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") self.right_entry() @@ -183,6 +186,13 @@ def K_g_callback(self) -> None: self.task.give_training_reward = True logging.info(";" + str(time.time()) + ";[action];set_give_reward_true") + def print_controls(self) -> None: + print("Keyboard controls:") + print("1, 2, 3: left/center/right nosepoke entry") + print("q, w, e, r, t: pump 1/2/3/4 reward delivery") + print("a: toggle automated training rewards") + print("g: give training reward") + def start_session(self) -> None: ic("TODO: start video") self.box.video_start() @@ -199,7 +209,3 @@ def run(self) -> None: @abstractmethod def update_plot(self, save_fig=False) -> None: ... - - - - diff --git a/task_protocol/gui.py b/task_protocol/gui.py index 048f592..34b3b3d 100644 --- a/task_protocol/gui.py +++ b/task_protocol/gui.py @@ -125,11 +125,6 @@ def check_plot(self, figure=None, FPS=144, savefig=False): print("No figure available") def set_callbacks(self, presenter: Presenter): - """ - Put the callbacks in the presenter; add references to them here. - :param Presenter: - :return: - """ self.K_escape_callback = presenter.K_escape_callback self.K_1_down_callback = presenter.K_1_down_callback From 87eaa467983f8a80f192e870a27484119417b24e Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Wed, 24 Jan 2024 13:56:35 -0500 Subject: [PATCH 110/135] Minor updates; incomplete refactoring --- main.py | 5 +- task_protocol/alternating_latent/__init__.py | 0 ...k_model.py => alternating_latent_model.py} | 6 +- ...ter.py => alternating_latent_presenter.py} | 0 task_protocol/base_presenter.py | 9 +- .../latent_inference_forage_model.py | 361 ++++++++++++++++++ 6 files changed, 375 insertions(+), 6 deletions(-) create mode 100644 task_protocol/alternating_latent/__init__.py rename task_protocol/alternating_latent/{task_model.py => alternating_latent_model.py} (99%) rename task_protocol/alternating_latent/{task_presenter.py => alternating_latent_presenter.py} (100%) create mode 100644 task_protocol/latent_inference_forage/latent_inference_forage_model.py diff --git a/main.py b/main.py index 9ab1cef..12c8008 100644 --- a/main.py +++ b/main.py @@ -24,7 +24,8 @@ from pathlib import Path -sys.path.insert(0, './essential') +sys.path.insert(0, './essential') # essential holds behavbox and equipment classes +sys.path.insert(0, '.') debug_startup = False debug_task = True @@ -151,7 +152,7 @@ def confirm_options(session_info: dict) -> bool: ### allow different tasks to be loaded ### task_type = session_info['task_config'] if task_type == 'alternating_latent': - from task_protocol.alternating_latent import task_model, task_presenter + from task_protocol.alternating_latent import alternating_latent_model, alternating_latent_presenter task = task_model.AlternateLatent(session_info=session_info) Presenter = task_presenter.AlternatingLatentPresenter name = 'alternating_latent_task' diff --git a/task_protocol/alternating_latent/__init__.py b/task_protocol/alternating_latent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/task_protocol/alternating_latent/task_model.py b/task_protocol/alternating_latent/alternating_latent_model.py similarity index 99% rename from task_protocol/alternating_latent/task_model.py rename to task_protocol/alternating_latent/alternating_latent_model.py index 9c453ea..71510f0 100644 --- a/task_protocol/alternating_latent/task_model.py +++ b/task_protocol/alternating_latent/alternating_latent_model.py @@ -4,10 +4,9 @@ # python3: lick_task_left_and_right_alternate.py """ author: Mitch Farrell; edited Matthew Chin -date: 2023-06-30 (to be updated) +last updated: 2023-06-30 name: lick_task_left_and_right_alternate.py """ -from numpy import ndarray from transitions import State, Machine from transitions.extensions.states import add_state_features, Timeout @@ -30,6 +29,7 @@ RIGHT_IX = 0 LEFT_IX = 1 + @add_state_features(Timeout) class TimedStateMachine(Machine): pass @@ -219,7 +219,7 @@ def reset_counters(self): self.error_count = 0 self.event_list.clear() - def determine_choice(self) -> Union[int, ndarray[int]]: + def determine_choice(self) -> Union[int, np.ndarray[int]]: """Determine whether there has been a choice to the left ports, right ports, or a switch.""" sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides diff --git a/task_protocol/alternating_latent/task_presenter.py b/task_protocol/alternating_latent/alternating_latent_presenter.py similarity index 100% rename from task_protocol/alternating_latent/task_presenter.py rename to task_protocol/alternating_latent/alternating_latent_presenter.py diff --git a/task_protocol/base_presenter.py b/task_protocol/base_presenter.py index a607595..ecf6248 100644 --- a/task_protocol/base_presenter.py +++ b/task_protocol/base_presenter.py @@ -3,6 +3,8 @@ from typing import List, Tuple, Protocol from abc import ABC, abstractmethod from icecream import ic +from transitions import State, Machine +from transitions.extensions.states import add_state_features, Timeout """ Abstract base class for use with the Presenter of the behavbox model-view-presenter. @@ -35,6 +37,11 @@ def video_stop(self): ... +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + class Presenter(ABC): interact_list: List[Tuple[float, str]] @@ -187,7 +194,7 @@ def K_g_callback(self) -> None: logging.info(";" + str(time.time()) + ";[action];set_give_reward_true") def print_controls(self) -> None: - print("Keyboard controls:") + print("[***] KEYBOARD CONTROLS [***]") print("1, 2, 3: left/center/right nosepoke entry") print("q, w, e, r, t: pump 1/2/3/4 reward delivery") print("a: toggle automated training rewards") diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_model.py b/task_protocol/latent_inference_forage/latent_inference_forage_model.py new file mode 100644 index 0000000..55a37d4 --- /dev/null +++ b/task_protocol/latent_inference_forage/latent_inference_forage_model.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python +# coding: utf-8 + +# python3: latent_inference_forage_task_three_states.py +""" +author: Mitch Farrell; edited Matthew Chin +last updated: 2024-01-24 +name: latent_inference_forage_task_three_states.py +""" +from transitions import State, Machine +from transitions.extensions.states import add_state_features, Timeout + +from icecream import ic +import logging +import time + +import random +import numpy as np + +import logging.config +from collections import deque +from typing import Protocol, List, Tuple, Union +from collections import defaultdict + + +import importlib +import pysistence, collections +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg + +rng = np.random.default_rng(12345) + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class LatentInferenceForageTaskThreeStates(object): + + def __init__(self, session_info: dict): + # TASK + BEHAVIOR STATUS + self.right_active = True + self.trial_running = False + self.trial_number = 0 # I don't think stopping at max trials is implemented - do that + + self.last_choice_time = 0.0 + self.rewards_earned_in_block = 0 + self.rewards_available_in_block = random.randint(1, 4) + + # Lick detection + self.lick_side_buffer = np.zeros(2) + + ### TRAINING REWARDS PARAMETERS ### + self.automate_training_rewards = False # keep here, use in controller + self.give_training_reward = False # keep here, use in controller + self.error_count = 0 + self.errors_to_reward = 5 + + # These can't be refactored, session parameters needed for behavbox + # maybe move them into a parameters class + self.choice_interval = session_info['entry_interval'] + self.lick_threshold = session_info['lick_threshold'] + self.machine = self.make_state_machine() + self.last_state_fxn = self.switch_to_standby + self.block_type_counter = np.zeros(2) + + # revise these later to make sure you need them + self.trial_choice_list: list = [] + self.trial_correct_list: list = [] + self.trial_choice_times: list = [] + self.trial_reward_given: list = [] + self.event_list = deque() + self.t_session = time.time() + + def make_state_machine(self): + states = [ + State(name='standby', + on_exit=['exit_standby']), + State(name='right_patch', + on_enter=['enter_right_patch'], + on_exit=['exit_right_patch']), + State(name='left_patch', + on_enter=['enter_left_patch'], + on_exit=['exit_left_patch']), + State(name='dark_period', + on_enter=['enter_dark_period'], + on_exit=['exit_dark_period']) + ] + + # all of these transition functions are created automatically + transitions = [ + ['start_in_right_patch', 'standby', 'right_patch'], + ['start_in_left_patch', 'standby', 'left_patch'], + + ['switch_to_right_patch', ['dark_period', 'left_patch'], 'right_patch'], + ['switch_to_left_patch', ['dark_period', 'right_patch'], 'left_patch'], + + ['switch_to_dark_period', ['left_patch', 'right_patch'], 'dark_period'], + + ['switch_to_standby', '*', 'standby']] + + machine = TimedStateMachine( + model=self, + states=states, + transitions=transitions, + initial='standby' + ) + return machine + + # trial statistics + self.dark_period_times = [10] + self.end_dark_time = 0 + self.next_dark_time = 0 + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.lick_time = 0.0 + self.lick_interval = self.session_info["lick_interval"] + # self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + self.reward_size1 = self.session_info['reward_size1'] + self.reward_size2 = self.session_info['reward_size2'] + self.reward_size3 = self.session_info['reward_size3'] + self.reward_size4 = self.session_info['reward_size4'] + self.ITI = self.session_info['ITI'] + self.p_switch = self.session_info['p_switch'] + self.p_reward = self.session_info['p_reward'] + self.reward_earned = False + + self.ContextA_time = 0 + self.ContextB_time = 0 + self.LED_on_time_plus_LED_duration = 0 + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + self.right_entry_error = False + self.left_entry_error = False + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + self.right_licks = 0 + self.left_licks = 0 + + def run(self): + if self.state == 'standby' or self.state == 'dark_period': + pass + elif self.state == 'right_patch': + self.trial_running = False + self.LED_bool = False + self.prior_choice_time = 0 + self.reward_earned = False + self.box.event_list.clear() + while self.state == 'right_patch' and self.next_dark_time > time.time(): + if not self.LED_bool: + if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and self.next_dark_time > time.time(): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == 'right_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + if self.p_reward >= random.random(): + self.pump.reward(self.reward_pump1, self.reward_size1) #1 reward + if self.p_switch >= random.random(): + self.LED_bool = False + time.sleep(1) + self.switch_to_left_patch() + else: + self.pump.reward(self.reward_pump1, self.reward_size2) #0 reward + if self.event_name == 'left_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str(self.error_repeat)) + if self.next_dark_time < time.time(): + self.switch_to_dark_period() + elif self.state == 'left_patch': + self.trial_running = False + self.LED_bool = False + self.prior_choice_time = 0 + self.reward_earned = False + self.box.event_list.clear() + while self.state == 'left_patch' and self.next_dark_time > time.time(): + if not self.LED_bool: + if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: + self.box.cueLED1.on() + self.box.cueLED2.on() + self.LED_on_time = time.time() + self.LED_bool = True + self.box.event_list.clear() + while self.LED_bool and self.next_dark_time > time.time(): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == 'left_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + if self.p_reward >= random.random(): + self.pump.reward(self.reward_pump2, self.reward_size1) # 1 reward + if self.p_switch >= random.random(): + self.LED_bool = False + time.sleep(1) + self.switch_to_right_patch() + else: + self.pump.reward(self.reward_pump2, self.reward_size2) # 0 reward + if self.event_name == 'right_entry': + self.prior_choice_time = time.time() + self.box.cueLED1.off() + self.box.cueLED2.off() + self.LED_bool = False + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_left_patch;" + str(self.error_repeat)) + if self.next_dark_time < time.time(): + self.switch_to_dark_period() + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.end_dark_time = time.time() + self.next_dark_time = self.end_dark_time + 120 + + def enter_right_patch(self): + logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str(self.error_repeat)) + self.trial_running = True + def exit_right_patch(self): + logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str(self.error_repeat)) + + def enter_left_patch(self): + logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str(self.error_repeat)) + self.trial_running = True + def exit_left_patch(self): + logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str(self.error_repeat)) + + def enter_dark_period(self): + logging.info(";" + str(time.time()) + ";[transition];enter_dark_period;" + str(self.error_repeat)) + self.trial_running = False + self.box.cueLED1.off() + self.box.cueLED2.off() + time.sleep(random.choice(self.dark_period_times)) + self.end_dark_time = time.time() + self.next_dark_time = self.end_dark_time + 120 + if random.random() > 0.5: + self.switch_to_left_patch() + else: + self.switch_to_right_patch() + + def exit_dark_period(self): + logging.info(";" + str(time.time()) + ";[transition];exit_dark_period;" + str(self.error_repeat)) + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_summery" + '.png') + self.box.check_plot(fig) From 9d3131778ab5abd3640df59f9011004b29f04c3a Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Fri, 26 Jan 2024 15:41:03 -0500 Subject: [PATCH 111/135] device-free debugging of the alternating_latent and latent_inference_forage tasks. Next is physical testing and writing of a "flush" program. --- essential/dummy_box.py | 63 ++- main.py | 27 +- session_info.py | 9 +- .../alternating_latent_model.py | 161 +++--- .../alternating_latent_presenter.py | 9 +- .../{base_presenter.py => base_classes.py} | 93 +++- .../latent_inference_forage/__init__.py | 0 .../latent_inference_forage_model.py | 462 ++++++++---------- .../latent_inference_forage_presenter.py | 205 ++++++++ ...tent_inference_forage_task_three_states.py | 5 +- 10 files changed, 650 insertions(+), 384 deletions(-) rename task_protocol/{base_presenter.py => base_classes.py} (71%) create mode 100644 task_protocol/latent_inference_forage/__init__.py create mode 100644 task_protocol/latent_inference_forage/latent_inference_forage_presenter.py diff --git a/essential/dummy_box.py b/essential/dummy_box.py index b82a03a..e075aa7 100644 --- a/essential/dummy_box.py +++ b/essential/dummy_box.py @@ -1,9 +1,31 @@ -class BehavBox(object): +from typing import Protocol +import logging +import time + + +class LED: + def __init__(self): + self.is_on: bool = False + + def blink(self, on_time: float, off_time: float, iteration: int): + pass + + def on(self): + self.is_on = True + + def off(self): + self.is_on = False + + +class BehavBox: + + cueLED1 = LED() + cueLED2 = LED() def __init__(self, session_info): pass - def set_callbacks(self, Presenter): + def set_callbacks(self, presenter): pass def video_start(self): @@ -18,4 +40,39 @@ def __init__(self, session_info): pass def reward(self, which_pump, reward_size): - pass \ No newline at end of file + duration = "n/a" + coefficient = "n/a" + duration_vac = "n/a" + + if which_pump == "1": + logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "2": + logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "3": + logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "4": + logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "air_puff": + logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) + elif which_pump == "vacuum": + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) + elif which_pump == "key_1": + logging.info(";" + str(time.time()) + ";[key];pump1_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_2": + logging.info(";" + str(time.time()) + ";[key];pump2_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_3": + logging.info(";" + str(time.time()) + ";[key];pump3_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_4": + logging.info(";" + str(time.time()) + ";[key];pump4_reward(reward_coeff: " + str(coefficient) + + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") + elif which_pump == "key_air_puff": + logging.info(";" + str(time.time()) + ";[key];pump4_reward_" + str(reward_size)) + elif which_pump == "key_vacuum": + logging.info(";" + str(time.time()) + ";[key];pump_vacuum" + str(duration_vac)) \ No newline at end of file diff --git a/main.py b/main.py index 12c8008..80975a5 100644 --- a/main.py +++ b/main.py @@ -40,8 +40,6 @@ from essential import behavbox debug_enable = False -seed = 0 -np.random.seed(seed) # all modules above this line will have logging disabled @@ -118,8 +116,10 @@ def confirm_options(session_info: dict) -> bool: session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] log_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '.log') - # stop if log path exists, or delete prior log file - if os.path.exists(log_path): + # if not debugging, stop if log path exists + if debug_startup or debug_task: + pass + elif os.path.exists(log_path): print(Fore.RED + Style.BRIGHT + 'ERROR: Log file already exists! Exiting now' + Style.RESET_ALL) quit() @@ -153,8 +153,8 @@ def confirm_options(session_info: dict) -> bool: task_type = session_info['task_config'] if task_type == 'alternating_latent': from task_protocol.alternating_latent import alternating_latent_model, alternating_latent_presenter - task = task_model.AlternateLatent(session_info=session_info) - Presenter = task_presenter.AlternatingLatentPresenter + task = alternating_latent_model.AlternateLatent(session_info=session_info) + Presenter = alternating_latent_presenter.AlternatingLatentPresenter name = 'alternating_latent_task' elif task_type == 'A_B_task': pass @@ -162,11 +162,15 @@ def confirm_options(session_info: dict) -> bool: pass elif task_type == 'A_B_C1_C2_task': pass + elif task_type == 'latent_inference_forage': + from task_protocol.latent_inference_forage import latent_inference_forage_model, latent_inference_forage_presenter + task = latent_inference_forage_model.LatentInferenceForageModel(session_info=session_info) + Presenter = latent_inference_forage_presenter.LatentInferenceForagePresenter + name = 'latent_inference_forage_task' else: raise RuntimeError('[***] Specified task not recognized!! [***]') - presenter = Presenter(name=name, - task=task, + presenter = Presenter(task=task, box=box, pump=pump, gui=gui, @@ -190,7 +194,7 @@ def confirm_options(session_info: dict) -> bool: run = True presenter.print_controls() - task.sample_next_block() + task.start_task() while run: if time.time() < t_end: presenter.run() # breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop @@ -215,7 +219,7 @@ def confirm_options(session_info: dict) -> bool: # save dicts to disk ic('Saving files to disk') - scipy.io.savemat(mat_path, {'session_info': session_info}) + scipy.io.savemat(mat_path, session_info) with open(session_info_path, 'wb') as f: pickle.dump(session_info, f) pygame.quit() @@ -224,7 +228,8 @@ def confirm_options(session_info: dict) -> bool: except RuntimeError as ex: print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) # save dicts to disk - scipy.io.savemat(mat_path, {'session_info': session_info}) + # scipy.io.savemat(mat_path, {'session_info': session_info}) + scipy.io.savemat(mat_path, session_info) with open(session_info_path, 'wb') as f: pickle.dump(session_info, f) presenter.end_session() diff --git a/session_info.py b/session_info.py index 8eb012a..6370452 100644 --- a/session_info.py +++ b/session_info.py @@ -21,7 +21,7 @@ session_info['weight'] = 30 # in grams session_info['date'] = datetime.now().strftime("%Y-%m-%d") # for example, '2023-09-28' -session_info['task_config'] = 'alternating_latent' +session_info['task_config'] = 'latent_inference_forage' # ['alternating_latent', 'latent_inference_forage'] # behavior parameters - ideally set these to a default for each session type, which is adjustable session_info['max_trial_number'] = 100 @@ -29,21 +29,26 @@ session_info['reward_size'] = 10 # in microliters session_info["lick_threshold"] = 2 session_info['reward_time_delay'] = 20 +session_info['intertrial_interval'] = 1 # in seconds session_info['initiation_timeout'] = 120 # s -session_info['entry_interval'] = 1 # this is the one that delays between choices +session_info['entry_interval'] = 1 # this is the one that delays between choices - ITI? or intertrial_interval? or entry_interval? session_info['timeout_time'] = 3 session_info['ContextA_reward_probability'] = 1 session_info['ContextB_reward_probability'] = 1 session_info['correct_reward_probability'] = 1 session_info['incorrect_reward_probability'] = 0 +session_info['switch_probability'] = .1 session_info["ContextA_time"] = 30 # todo - revise this or make adjustable by mouse performance session_info["ContextB_time"] = 30 session_info["ContextC_time"] = 30 +session_info['ITI'] = .5 +session_info['epoch_length'] = 120 + # Reward pump parameters session_info["reward_pump1"] = '2' session_info['reward_pump2'] = '1' diff --git a/task_protocol/alternating_latent/alternating_latent_model.py b/task_protocol/alternating_latent/alternating_latent_model.py index 71510f0..da60d52 100644 --- a/task_protocol/alternating_latent/alternating_latent_model.py +++ b/task_protocol/alternating_latent/alternating_latent_model.py @@ -39,11 +39,10 @@ class AlternateLatent(object): def __init__(self, session_info: dict): # name and session_info should be provided as kwargs # TASK + BEHAVIOR STATUS - self.right_active = True self.trial_running = False self.trial_number = 0 # I don't think stopping at max trials is implemented - do that - self.last_choice_time = 0.0 + self.last_choice_time = -np.inf self.rewards_earned_in_block = 0 self.rewards_available_in_block = random.randint(1, 4) @@ -73,13 +72,11 @@ def __init__(self, session_info: dict): # name and session_info should be provi self.t_session = time.time() def make_state_machine(self, timeout_time: float): + # reward_available is not used - it would allow licking either side but this task does not use that states = [ State(name='standby', on_enter=['switch_to_reward_available'], on_exit=["exit_standby"]), - State(name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"]), State(name="right_active", on_enter=["enter_right_active"], on_exit=['exit_right_active']), @@ -95,14 +92,12 @@ def make_state_machine(self, timeout_time: float): transitions = [ # ['start_trial_logic', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] - ['switch_to_standby', ['reward_available', 'right_active', 'left_active'], 'standby'], - ['switch_to_reward_available', ['standby', 'timeout'], 'reward_available'], + ['switch_to_standby', ['right_active', 'left_active'], 'standby'], ['switch_to_left_active', '*', 'left_active'], ['switch_to_right_active', '*', 'right_active'], - - - ['switch_to_timeout', ['reward_available', 'right_active', 'left_active'], 'timeout'], - ['end_task', ['reward_available', 'timeout', 'right_active', 'left_active'], 'standby']] + ['switch_to_timeout', ['right_active', 'left_active'], 'timeout'], + ['end_task', ['timeout', 'right_active', 'left_active'], 'standby'] + ] machine = TimedStateMachine( model=self, @@ -112,19 +107,6 @@ def make_state_machine(self, timeout_time: float): ) return machine - def start_trial_logic(self): - p = np.random.random_sample() - if p < 0.5: - # right sample - if self.state != 'right_active': - self.block_type_counter *= 0 - else: - self.block_type_counter[0] += 1 - - self.switch_to_right_active() - else: - self.switch_to_left_active() - def enter_standby(self): # This function should also call for updating the plot??? logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str("")) self.trial_running = False @@ -147,29 +129,17 @@ def exit_left_active(self): # self.reset_counters() def enter_right_active(self): - self.right_active = True self.trial_running = True self.last_state_fxn = self.switch_to_right_active logging.info(";" + str(time.time()) + ";[transition];enter_right_active;" + str("")) print('entering right active') def enter_left_active(self): - self.right_active = False self.trial_running = True self.last_state_fxn = self.switch_to_left_active logging.info(";" + str(time.time()) + ";[transition];enter_left_active;" + str("")) print('entering left active') - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str("")) - self.last_state_fxn = self.switch_to_reward_available - self.trial_running = True - - def exit_reward_available(self): - self.last_state = self.state - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str("")) - self.reset_counters() - def enter_timeout(self): # log the entrance to timeout; reset counters self.event_list.clear() @@ -219,22 +189,24 @@ def reset_counters(self): self.error_count = 0 self.event_list.clear() - def determine_choice(self) -> Union[int, np.ndarray[int]]: + # def determine_choice(self) -> Union[int, np.ndarray[int]]: + def determine_choice(self) -> str: """Determine whether there has been a choice to the left ports, right ports, or a switch.""" sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides if sides_licked > 1: # made a switch, reset the counter self.lick_side_buffer *= 0 - return -1 + return 'switch' if np.amax(self.lick_side_buffer) >= self.lick_threshold: choice_ix = np.argmax(self.lick_side_buffer) # either 0 or 1 - # choice = ['right', 'left'][choice_ix] + choice = ['right', 'left'][choice_ix] self.lick_side_buffer *= 0 - return choice_ix + # return choice_ix + return choice else: - return -1 # no choice made/not enough licks + return '' # no choice made/not enough licks def run_event_loop(self) -> Tuple[str, bool, float]: choice_correct = '' # ['correct', 'incorrect', 'switch', ''] @@ -248,75 +220,82 @@ def run_event_loop(self) -> Tuple[str, bool, float]: else: event = '' - if self.state in ['reward_available', 'left_active', 'right_active']: - if dt < self.choice_interval: - self.lick_side_buffer *= 0 - return choice_correct, give_training_reward, time_since_start # check keyboard in controller, not here - - if event == "right_entry": - self.lick_side_buffer[RIGHT_IX] += 1 - elif event == 'left_entry': - self.lick_side_buffer[LEFT_IX] += 1 - - choice_side = self.determine_choice() - # if no choice made, don't mark anything but maybe give reward - if choice_side == 0: #'right': - self.last_choice_time = cur_time - if self.right_active: - choice_correct = 'correct' - self.correct_choice_updates(choice_side, time_since_start) - else: - choice_correct = 'incorrect' - self.incorrect_choice_updates(choice_side, time_since_start) - - elif choice_side == 1: #'left': - self.last_choice_time = cur_time - if not self.right_active: - choice_correct = 'correct' - self.correct_choice_updates(choice_side, time_since_start) - else: - choice_correct = 'incorrect' - self.incorrect_choice_updates(choice_side, time_since_start) - - # elif choice_side == ['switch', 'none']: # no updates unless giving reward - # self.incorrect_choice_updates(choice_side, cur_time) - # give_reward = self.incorrect_choice_updates(choice_side, cur_time) - - elif (self.error_count >= self.errors_to_reward and self.automate_training_rewards)\ - or self.give_training_reward: - self.last_choice_time = cur_time - give_training_reward = True - if self.right_active: - choice_side = 0 - else: - choice_side = 1 - self.training_reward_updates(choice_side, time_since_start) - - self.give_training_reward = False + if self.state in ['standby', 'timeout']: + # self.give_training_reward = False # only toggle this in left/right active??? return choice_correct, give_training_reward, time_since_start - else: - self.give_training_reward = False + # self.state is in ['left_active', 'right_active'] + if dt < self.choice_interval: + self.lick_side_buffer *= 0 return choice_correct, give_training_reward, time_since_start - def correct_choice_updates(self, choice: int, event_time: float) -> None: + if event == 'right_entry': + self.lick_side_buffer[RIGHT_IX] += 1 + elif event == 'left_entry': + self.lick_side_buffer[LEFT_IX] += 1 + + choice_side = self.determine_choice() + # if no choice made, don't mark anything but maybe give reward + if choice_side == 'right': + self.last_choice_time = cur_time + if self.state == 'right_active': + choice_correct = 'correct' + self.log_correct_choice(RIGHT_IX, time_since_start) + else: + choice_correct = 'incorrect' + self.log_incorrect_choice(RIGHT_IX, time_since_start) + + elif choice_side == 'left': + self.last_choice_time = cur_time + if self.state == 'left_active': + choice_correct = 'correct' + self.log_correct_choice(LEFT_IX, time_since_start) + else: + choice_correct = 'incorrect' + self.log_incorrect_choice(LEFT_IX, time_since_start) + + elif choice_side == 'switch': + self.last_choice_time = cur_time # for switches, enter ITI but do not update choices + + # elif choice_side == ['switch', 'none']: # no updates unless giving reward + # self.incorrect_choice_updates(choice_side, cur_time) + # give_reward = self.incorrect_choice_updates(choice_side, cur_time) + + elif (self.error_count >= self.errors_to_reward and self.automate_training_rewards)\ + or self.give_training_reward: + self.last_choice_time = cur_time + give_training_reward = True + if self.state == 'right_active': + choice_side = RIGHT_IX + else: + choice_side = LEFT_IX + self.log_training_reward(choice_side, time_since_start) + + self.give_training_reward = False + return choice_correct, give_training_reward, time_since_start + + def log_correct_choice(self, choice: int, event_time: float) -> None: self.trial_choice_list.append(choice) self.trial_choice_times.append(event_time) self.trial_correct_list.append(True) self.error_count = 0 - def incorrect_choice_updates(self, choice: int, event_time: float) -> None: + def log_incorrect_choice(self, choice: int, event_time: float) -> None: self.trial_choice_list.append(choice) self.trial_choice_times.append(event_time) self.trial_correct_list.append(False) self.error_count += 1 - def training_reward_updates(self, choice: int, event_time: float) -> None: + def log_training_reward(self, choice: int, event_time: float) -> None: self.trial_choice_list.append(choice) self.trial_choice_times.append(event_time) self.trial_correct_list.append(False) self.error_count = 0 + def start_task(self): + """A wrapper function for main function use.""" + self.sample_next_block() + def main(): session_info = defaultdict(list) diff --git a/task_protocol/alternating_latent/alternating_latent_presenter.py b/task_protocol/alternating_latent/alternating_latent_presenter.py index d81906e..4c788f7 100644 --- a/task_protocol/alternating_latent/alternating_latent_presenter.py +++ b/task_protocol/alternating_latent/alternating_latent_presenter.py @@ -9,7 +9,7 @@ import time import logging -from task_protocol.base_presenter import Presenter +from task_protocol.base_classes import Presenter SEED = 0 rng = np.random.default_rng(seed=SEED) @@ -69,7 +69,7 @@ def reward(self, pump_key: str, reward_size: float): class AlternatingLatentPresenter(Presenter): - def __init__(self, name: str, task: Task, box: Box, pump: Pump, + def __init__(self, task: Task, box: Box, pump: Pump, gui: GUI, session_info: dict): self.task: Task = task @@ -128,10 +128,10 @@ def run(self) -> None: reward_size = 0 self.task.trial_reward_given.append(False) - print('current state: {}; rewards earned in block: {}'.format(self.task.state, self.task.rewards_earned_in_block)) self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) - elif choice_correct == 'incorrect': + elif choice_correct == ('incorrect' + ''): if rng.random() < self.session_info['incorrect_reward_probability']: reward_size = self.reward_size_large[incorrect_pump] # can modify these to a single value, reward large and reward small self.task.rewards_earned_in_block += 1 @@ -140,7 +140,6 @@ def run(self) -> None: reward_size = 0 self.task.trial_reward_given.append(False) - print('current state: {}; rewards earned in block: {}'.format(self.task.state, self.task.rewards_earned_in_block)) self.deliver_reward(pump_key=self.pump_keys[incorrect_pump], reward_size=reward_size) if self.task.trial_choice_list: diff --git a/task_protocol/base_presenter.py b/task_protocol/base_classes.py similarity index 71% rename from task_protocol/base_presenter.py rename to task_protocol/base_classes.py index ecf6248..f96eb05 100644 --- a/task_protocol/base_presenter.py +++ b/task_protocol/base_classes.py @@ -1,10 +1,12 @@ import logging import time -from typing import List, Tuple, Protocol +from typing import List, Tuple, Protocol, Union from abc import ABC, abstractmethod from icecream import ic from transitions import State, Machine from transitions.extensions.states import add_state_features, Timeout +import numpy as np + """ Abstract base class for use with the Presenter of the behavbox model-view-presenter. @@ -16,15 +18,6 @@ def reward(self, pump_key: str, reward_size: float): ... -class Task(Protocol): - event_list: List[str] - automate_training_rewards: bool - give_training_reward: bool - - def switch_to_timeout(self): - ... - - class GUI(Protocol): keyboard_active: bool @@ -42,11 +35,89 @@ class TimedStateMachine(Machine): pass +class Model(ABC): + event_list: list[str] + automate_training_rewards: bool + give_training_reward: bool + + trial_choice_list: list[int] = [] + trial_correct_list: list[bool] = [] + trial_choice_times: list[float] = [] + trial_reward_given: list[bool] = [] + + # Lick detection + lick_threshold = 2 + lick_side_buffer = np.zeros(2) + error_count = 0 + rewards_earned_in_block = 0 + + # def determine_choice(self) -> Union[int, np.ndarray[int]]: + # """Determine whether there has been a choice to the left ports, right ports, or a switch.""" + # + # sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides + # if sides_licked > 1: + # # made a switch, reset the counter + # self.lick_side_buffer *= 0 + # return -1 + # + # if np.amax(self.lick_side_buffer) >= self.lick_threshold: + # choice_ix = np.argmax(self.lick_side_buffer) # either 0 or 1 + # # choice = ['right', 'left'][choice_ix] + # self.lick_side_buffer *= 0 + # return choice_ix + # else: + # return -1 # no choice made/not enough licks + + def determine_choice(self) -> str: + """Determine whether there has been a choice to the left ports, right ports, or a switch.""" + + sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides + if sides_licked > 1: + # made a switch, reset the counter + self.lick_side_buffer *= 0 + choice = 'switch' + + elif np.amax(self.lick_side_buffer) >= self.lick_threshold: + choice_ix = np.argmax(self.lick_side_buffer) # either 0 or 1 + choice = ['right', 'left'][choice_ix] + self.lick_side_buffer *= 0 + else: + choice = '' # no choice made/not enough licks + return choice + + def log_correct_choice(self, choice: int, event_time: float) -> None: + self.trial_choice_list.append(choice) + self.trial_choice_times.append(event_time) + self.trial_correct_list.append(True) + self.error_count = 0 + + def log_incorrect_choice(self, choice: int, event_time: float) -> None: + self.trial_choice_list.append(choice) + self.trial_choice_times.append(event_time) + self.trial_correct_list.append(False) + self.error_count += 1 + + def log_training_reward(self, choice: int, event_time: float) -> None: + self.trial_choice_list.append(choice) + self.trial_choice_times.append(event_time) + self.trial_correct_list.append(False) + self.error_count = 0 + + def reset_counters(self) -> None: + self.lick_side_buffer *= 0 + self.rewards_earned_in_block = 0 + self.error_count = 0 + self.event_list.clear() + + def run_event_loop(self): + ... + + class Presenter(ABC): interact_list: List[Tuple[float, str]] pump: Pump - task: Task + task: Model gui: GUI session_info: dict box: Box diff --git a/task_protocol/latent_inference_forage/__init__.py b/task_protocol/latent_inference_forage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_model.py b/task_protocol/latent_inference_forage/latent_inference_forage_model.py index 55a37d4..205d43e 100644 --- a/task_protocol/latent_inference_forage/latent_inference_forage_model.py +++ b/task_protocol/latent_inference_forage/latent_inference_forage_model.py @@ -8,53 +8,39 @@ name: latent_inference_forage_task_three_states.py """ from transitions import State, Machine -from transitions.extensions.states import add_state_features, Timeout +from task_protocol.base_classes import TimedStateMachine, Model from icecream import ic import logging import time -import random import numpy as np import logging.config from collections import deque from typing import Protocol, List, Tuple, Union -from collections import defaultdict - -import importlib -import pysistence, collections -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style import logging.config -from time import sleep import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg - -rng = np.random.default_rng(12345) +rng = np.random.default_rng() +RIGHT_IX = 0 +LEFT_IX = 1 -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass -class LatentInferenceForageTaskThreeStates(object): +class LatentInferenceForageModel(Model): # subclass from base task def __init__(self, session_info: dict): + self.session_info = session_info + # TASK + BEHAVIOR STATUS self.right_active = True self.trial_running = False self.trial_number = 0 # I don't think stopping at max trials is implemented - do that - self.last_choice_time = 0.0 + self.last_choice_time = -np.inf self.rewards_earned_in_block = 0 - self.rewards_available_in_block = random.randint(1, 4) + self.rewards_available_in_block = rng.integers(1, 4) # Lick detection self.lick_side_buffer = np.zeros(2) @@ -67,19 +53,67 @@ def __init__(self, session_info: dict): # These can't be refactored, session parameters needed for behavbox # maybe move them into a parameters class - self.choice_interval = session_info['entry_interval'] + self.ITI = session_info['entry_interval'] self.lick_threshold = session_info['lick_threshold'] self.machine = self.make_state_machine() self.last_state_fxn = self.switch_to_standby self.block_type_counter = np.zeros(2) - # revise these later to make sure you need them self.trial_choice_list: list = [] self.trial_correct_list: list = [] self.trial_choice_times: list = [] self.trial_reward_given: list = [] self.event_list = deque() - self.t_session = time.time() + self.t_session_start = time.time() + + self.presenter_commands = [] + self.ITI_active = False + + self.end_dark_time = 0 + self.next_dark_time = 0 + self.dark_period_times = [10] + + # trial statistics - TODO - edit these away + # self.trial_running = False + # self.innocent = True + # self.trial_number = 0 + # self.error_count = 0 + # self.error_list = [] + # self.error_repeat = False + # self.lick_time = 0.0 + # self.lick_interval = self.session_info["lick_interval"] + # # self.reward_time_start = None # for reward_available state time keeping purpose + # self.reward_time = 10 + # self.reward_times_up = False + # self.reward_pump1 = self.session_info["reward_pump1"] + # self.reward_pump2 = self.session_info['reward_pump2'] + # self.reward_size1 = self.session_info['reward_size1'] + # self.reward_size2 = self.session_info['reward_size2'] + # self.reward_size3 = self.session_info['reward_size3'] + # self.reward_size4 = self.session_info['reward_size4'] + # self.ITI = self.session_info['ITI'] + # self.p_switch = self.session_info['p_switch'] + # self.p_reward = self.session_info['p_reward'] + # self.reward_earned = False + # + # self.ContextA_time = 0 + # self.ContextB_time = 0 + # self.LED_on_time_plus_LED_duration = 0 + # + # self.active_press = 0 + # self.inactive_press = 0 + # self.timeline_active_press = [] + # self.active_press_count_list = [] + # self.timeline_inactive_press = [] + # self.inactive_press_count_list = [] + # + # self.left_poke_count = 0 + # self.right_poke_count = 0 + # self.timeline_left_poke = [] + # self.left_poke_count_list = [] + # self.timeline_right_poke = [] + # self.right_poke_count_list = [] + # self.event_name = "" def make_state_machine(self): states = [ @@ -98,14 +132,11 @@ def make_state_machine(self): # all of these transition functions are created automatically transitions = [ - ['start_in_right_patch', 'standby', 'right_patch'], - ['start_in_left_patch', 'standby', 'left_patch'], - - ['switch_to_right_patch', ['dark_period', 'left_patch'], 'right_patch'], - ['switch_to_left_patch', ['dark_period', 'right_patch'], 'left_patch'], - + # ['start_in_right_patch', 'standby', 'right_patch'], + # ['start_in_left_patch', 'standby', 'left_patch'], + ['switch_to_right_patch', ['standby', 'dark_period', 'left_patch'], 'right_patch'], + ['switch_to_left_patch', ['standby', 'dark_period', 'right_patch'], 'left_patch'], ['switch_to_dark_period', ['left_patch', 'right_patch'], 'dark_period'], - ['switch_to_standby', '*', 'standby']] machine = TimedStateMachine( @@ -116,246 +147,159 @@ def make_state_machine(self): ) return machine - # trial statistics - self.dark_period_times = [10] - self.end_dark_time = 0 - self.next_dark_time = 0 - self.trial_running = False - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.lick_time = 0.0 - self.lick_interval = self.session_info["lick_interval"] - # self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - self.reward_size1 = self.session_info['reward_size1'] - self.reward_size2 = self.session_info['reward_size2'] - self.reward_size3 = self.session_info['reward_size3'] - self.reward_size4 = self.session_info['reward_size4'] - self.ITI = self.session_info['ITI'] - self.p_switch = self.session_info['p_switch'] - self.p_reward = self.session_info['p_reward'] - self.reward_earned = False - - self.ContextA_time = 0 - self.ContextB_time = 0 - self.LED_on_time_plus_LED_duration = 0 - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - self.right_entry_error = False - self.left_entry_error = False - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - self.right_licks = 0 - self.left_licks = 0 - - def run(self): - if self.state == 'standby' or self.state == 'dark_period': - pass - elif self.state == 'right_patch': - self.trial_running = False - self.LED_bool = False - self.prior_choice_time = 0 - self.reward_earned = False - self.box.event_list.clear() - while self.state == 'right_patch' and self.next_dark_time > time.time(): - if not self.LED_bool: - if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and self.next_dark_time > time.time(): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == 'right_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - if self.p_reward >= random.random(): - self.pump.reward(self.reward_pump1, self.reward_size1) #1 reward - if self.p_switch >= random.random(): - self.LED_bool = False - time.sleep(1) - self.switch_to_left_patch() - else: - self.pump.reward(self.reward_pump1, self.reward_size2) #0 reward - if self.event_name == 'left_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str(self.error_repeat)) - if self.next_dark_time < time.time(): + def check_intertrial_interval(self, time_since_choice) -> bool: + if time_since_choice < self.ITI: + self.lick_side_buffer *= 0 + return False + + elif time_since_choice >= self.ITI and self.ITI_active: + # turn on the LED, end the run loop + self.turn_LED_on() + self.lick_side_buffer *= 0 + self.ITI_active = False + return False + + else: + return True + + def check_dark_period(self, cur_time: float) -> bool: + if self.state != 'dark_period' and cur_time >= self.next_dark_time: + self.turn_LED_off() + self.reset_counters() self.switch_to_dark_period() - elif self.state == 'left_patch': - self.trial_running = False - self.LED_bool = False - self.prior_choice_time = 0 - self.reward_earned = False - self.box.event_list.clear() - while self.state == 'left_patch' and self.next_dark_time > time.time(): - if not self.LED_bool: - if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and self.next_dark_time > time.time(): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == 'left_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - if self.p_reward >= random.random(): - self.pump.reward(self.reward_pump2, self.reward_size1) # 1 reward - if self.p_switch >= random.random(): - self.LED_bool = False - time.sleep(1) - self.switch_to_right_patch() - else: - self.pump.reward(self.reward_pump2, self.reward_size2) # 0 reward - if self.event_name == 'right_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_left_patch;" + str(self.error_repeat)) - if self.next_dark_time < time.time(): - self.switch_to_dark_period() + return False + + elif self.state != 'dark_period' and cur_time < self.next_dark_time: + return True + + elif self.state == 'dark_period' and cur_time < self.end_dark_time: + return False + + elif self.state == 'dark_period' and cur_time >= self.end_dark_time: + self.turn_LED_on() + self.reset_counters() + if rng.random() > 0.5: + self.switch_to_left_patch() + else: + self.switch_to_right_patch() + return False + + def run_event_loop(self): + cur_time = time.time() + time_since_start = cur_time - self.t_session_start + time_since_choice = cur_time - self.last_choice_time + + if self.event_list: + event = self.event_list.popleft() + else: + event = '' + + if self.state == 'standby': + return time_since_start + + continue_run = self.check_dark_period(cur_time) + if not continue_run: + return time_since_start + + continue_run = self.check_intertrial_interval(time_since_choice) + if not continue_run: + return time_since_start + + if event == 'right_entry': + self.lick_side_buffer[RIGHT_IX] += 1 + elif event == 'left_entry': + self.lick_side_buffer[LEFT_IX] += 1 + + choice = self.determine_choice() + if choice == 'right': + self.last_choice_time = cur_time + self.turn_LED_off() + if self.state == 'right_patch': + self.log_correct_choice(RIGHT_IX, time_since_start) + self.give_correct_reward() + else: + self.log_incorrect_choice(RIGHT_IX, time_since_start) + self.give_incorrect_reward() + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str()) + + elif choice == 'left': + self.last_choice_time = cur_time + self.turn_LED_off() + if self.state == 'left_patch': + self.log_correct_choice(LEFT_IX, time_since_start) + self.give_correct_reward() + else: + self.log_incorrect_choice(LEFT_IX, time_since_start) + self.give_incorrect_reward() + logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str("")) + + elif choice == 'switch': + self.last_choice_time = cur_time # for switches, enter ITI but do not update choices; decide whether to include this or not + self.turn_LED_off() + + elif (self.error_count >= self.errors_to_reward and self.automate_training_rewards)\ + or self.give_training_reward: + self.last_choice_time = cur_time + self.turn_LED_off() + self.presenter_commands.append('give_training_reward') + + give_training_reward = True + if self.state == 'right_patch': + choice_side = RIGHT_IX + else: + choice_side = LEFT_IX + self.log_training_reward(choice_side, time_since_start) + + self.give_training_reward = False + return time_since_start + + def turn_LED_on(self) -> None: + self.presenter_commands.append('turn_LED_on') + + def turn_LED_off(self) -> None: + self.presenter_commands.append('turn_LED_off') + + def give_correct_reward(self) -> None: + self.presenter_commands.append('give_correct_reward') + + def give_incorrect_reward(self) -> None: + self.presenter_commands.append('give_incorrect_reward') def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.end_dark_time = time.time() - self.next_dark_time = self.end_dark_time + 120 + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str("")) + self.next_dark_time = time.time() + 120 + self.reset_counters() def enter_right_patch(self): - logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str(self.error_repeat)) self.trial_running = True + self.last_state_fxn = self.switch_to_right_patch + logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str("")) + def exit_right_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str(self.error_repeat)) + logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str("")) def enter_left_patch(self): - logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str(self.error_repeat)) self.trial_running = True + self.last_state_fxn = self.switch_to_left_patch + logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str("")) + def exit_left_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str(self.error_repeat)) + logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str("")) def enter_dark_period(self): - logging.info(";" + str(time.time()) + ";[transition];enter_dark_period;" + str(self.error_repeat)) + logging.info(";" + str(time.time()) + ";[transition];enter_dark_period;" + str("")) + self.rewards_earned_in_block = 0 self.trial_running = False - self.box.cueLED1.off() - self.box.cueLED2.off() - time.sleep(random.choice(self.dark_period_times)) - self.end_dark_time = time.time() - self.next_dark_time = self.end_dark_time + 120 - if random.random() > 0.5: + self.end_dark_time = time.time() + rng.choice(self.dark_period_times) + + def exit_dark_period(self): + logging.info(";" + str(time.time()) + ";[transition];exit_dark_period;" + str()) + self.next_dark_time = time.time() + 120 + + def start_task(self): + ic('starting task') + self.next_dark_time = time.time() + 120 + if rng.random() > 0.5: self.switch_to_left_patch() else: self.switch_to_right_patch() - - def exit_dark_period(self): - logging.info(";" + str(time.time()) + ";[transition];exit_dark_period;" + str(self.error_repeat)) - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py b/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py new file mode 100644 index 0000000..e013645 --- /dev/null +++ b/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py @@ -0,0 +1,205 @@ +import collections +from typing import Protocol, List, Tuple + +import matplotlib as mpl +import matplotlib.pyplot as plt +import numpy as np + +from icecream import ic +import time +import logging + +from task_protocol.base_classes import Presenter + +SEED = 0 +rng = np.random.default_rng(seed=SEED) + + +PUMP1_IX = 0 +PUMP2_IX = 1 +trial_choice_map = {'right': 0, 'left': 1} + + +class Task(Protocol): + trial_choice_list: list[int] + trial_correct_list: list[bool] + trial_choice_times: list[float] + trial_reward_given: list[bool] + event_list: collections.deque + + state: str + rewards_earned_in_block: int + rewards_available_in_block: int + + def run_event_loop(self) -> Tuple[str, bool, float]: + ... + + def switch_to_timeout(self): + ... + + def sample_next_block(self): + ... + + +class GUI(Protocol): + correct_line: mpl.lines.Line2D + incorrect_line: mpl.lines.Line2D + reward_line: mpl.lines.Line2D + figure_window: plt.Figure + + def check_keyboard(self) -> None: + ... + + def check_plot(self, figure, save_fig: bool = False) -> None: + ... + + +class Box(Protocol): + def video_start(self): + ... + + def video_stop(self): + ... + + +class Pump(Protocol): + def reward(self, pump_key: str, reward_size: float): + ... + + +class LatentInferenceForagePresenter(Presenter): + + def __init__(self, task: Task, box: Box, pump: Pump, + gui: GUI, session_info: dict): + + self.task: Task = task + self.gui: GUI = gui + self.box = box + self.pump = pump + self.session_info = session_info + self.pump_keys = (session_info["reward_pump1"], session_info['reward_pump2']) + self.reward_size_large = session_info['reward_size_large'] + self.reward_size_small = session_info['reward_size_small'] + + ############################################################################################### + # event list trigger by the interaction between the RPi and the animal for visualization + # interact_list: lick, choice interaction between the board and the animal for visualization + ############################################################################################### + self.interact_list = [] + + self.keypress_training_reward = False + self.automatic_training_rewards = False + + def run(self) -> None: + """ + Process one event, checking GUI and events as needed. + Currently set to give rewards probabilistically (same reward sizes, unequal reward probabilities) + """ + # make this say if correct real choice or incorrect real choice + time_since_start = self.task.run_event_loop() + + # goes through the whole timeout before doing the plotting bits I think + if self.task.state == 'right_patch': + correct_pump = PUMP1_IX + incorrect_pump = PUMP2_IX + elif self.task.state == 'left_patch': + correct_pump = PUMP2_IX + incorrect_pump = PUMP1_IX + else: + raise RuntimeError('state not recognized') + + self.perform_task_commands(correct_pump, incorrect_pump) + + if self.task.trial_choice_list: + self.update_plot() + + self.gui.check_keyboard() + + def perform_task_commands(self, correct_pump: int, incorrect_pump: int) -> None: + # give reward if + # 1. training reward/human reward (give reward, regardless of action) + # 2. correct choice and meets correct reward probability + # 3. incorrect but REAL choice (i.e. not a switch) and meets incorrect reward probability + # state changes if choice is correct and switch probability is met + + for c in self.task.presenter_commands: + if c == 'turn_LED_on': + self.box.cueLED1.on() + self.box.cueLED2.on() + + elif c == 'turn_LED_off': + self.box.cueLED1.off() + self.box.cueLED2.off() + + elif c == 'give_training_reward': + reward_size = self.reward_size_large[correct_pump] + self.task.rewards_earned_in_block += 1 + self.task.trial_reward_given.append(True) + logging.info(";" + str(time.time()) + ";[reward];giving_reward;" + str("")) + self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) + + elif c == 'give_correct_reward': + if rng.random() < self.session_info['correct_reward_probability']: + reward_size = self.reward_size_large[correct_pump] + self.task.rewards_earned_in_block += 1 + self.task.trial_reward_given.append(True) + else: + reward_size = 0 + self.task.trial_reward_given.append(False) + + if rng.random() < self.session_info['switch_probability']: + if self.task.state == 'right_patch': + self.task.switch_to_left_patch() + elif self.task.state == 'left_patch': + self.task.switch_to_right_patch() + else: + raise RuntimeError('state not recognized') + + print('current state: {}; rewards earned in block: {}'.format(self.task.state, + self.task.rewards_earned_in_block)) + self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) + + elif c == 'give_incorrect_reward': + if rng.random() < self.session_info['incorrect_reward_probability']: + reward_size = self.reward_size_large[ + incorrect_pump] # can modify these to a single value, reward large and reward small + self.task.rewards_earned_in_block += 1 + self.task.trial_reward_given.append(True) + else: + reward_size = 0 + self.task.trial_reward_given.append(False) + + print('current state: {}; rewards earned in block: {}'.format(self.task.state, + self.task.rewards_earned_in_block)) + self.deliver_reward(pump_key=self.pump_keys[incorrect_pump], reward_size=reward_size) + + self.task.presenter_commands.clear() + + def update_plot(self, save_fig: bool = False) -> None: + ix = np.array(self.task.trial_correct_list) + choices = np.array(self.task.trial_choice_list) + times = np.array(self.task.trial_choice_times) + rewards = np.array(self.task.trial_reward_given) + + correct_trials = choices[ix] + correct_times = times[ix] + + incorrect_trials = choices[~ix] + incorrect_times = times[~ix] + + reward_trials = choices[rewards] + reward_times = times[rewards] + + self.gui.figure_window.correct_line.set_data(correct_times, correct_trials) + self.gui.figure_window.error_line.set_data(incorrect_times, incorrect_trials) + self.gui.figure_window.reward_line.set_data(reward_times, reward_trials) + # print('correct trials:', correct_trials) + + # update this to show the last 20-ish trials + if times.size > 1: + T = [times[-20:][0], times[-1]] + else: + T = [times[-1]-.5, times[-1]+.5] + plt.xlim(T) + + self.gui.check_plot(figure=self.gui.figure_window.figure, savefig=save_fig) diff --git a/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py b/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py index 824103d..ed49ae2 100644 --- a/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py +++ b/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py @@ -220,8 +220,8 @@ def run(self): self.box.cueLED2.off() self.LED_bool = False logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str(self.error_repeat)) - if self.next_dark_time < time.time(): - self.switch_to_dark_period() + if self.next_dark_time < time.time(): + self.switch_to_dark_period() elif self.state == 'left_patch': self.trial_running = False self.LED_bool = False @@ -277,6 +277,7 @@ def exit_right_patch(self): def enter_left_patch(self): logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str(self.error_repeat)) self.trial_running = True + def exit_left_patch(self): logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str(self.error_repeat)) From a89264911d3217ae52b9a2c05cd881ab73cb52cf Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Mon, 29 Jan 2024 10:20:50 -0500 Subject: [PATCH 112/135] More debugging of latent_inference task. Prep for physical debugging. --- main.py | 10 +- session_info.py | 6 +- task_protocol/base_classes.py | 15 +- task_protocol/gui.py | 2 + .../latent_inference_forage_model.py | 177 +++++++----------- .../latent_inference_forage_presenter.py | 72 +++---- 6 files changed, 123 insertions(+), 159 deletions(-) diff --git a/main.py b/main.py index 80975a5..65f8161 100644 --- a/main.py +++ b/main.py @@ -28,15 +28,10 @@ sys.path.insert(0, '.') debug_startup = False -debug_task = True +debug_task = False if debug_startup or debug_task: from essential import dummy_box as behavbox else: - import essential - from essential.visualstim import VisualStim - import essential.Treadmill as Treadmill - import essential.ADS1x15 as ADS1x15 - from essential.FlipperOutput import FlipperOutput from essential import behavbox debug_enable = False @@ -197,7 +192,7 @@ def confirm_options(session_info: dict) -> bool: task.start_task() while run: if time.time() < t_end: - presenter.run() # breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + presenter.run() else: run = False print("Times up, finishing up") @@ -227,6 +222,7 @@ def confirm_options(session_info: dict) -> bool: # exit because of error except RuntimeError as ex: print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + print(ex) # save dicts to disk # scipy.io.savemat(mat_path, {'session_info': session_info}) scipy.io.savemat(mat_path, session_info) diff --git a/session_info.py b/session_info.py index 6370452..c383e19 100644 --- a/session_info.py +++ b/session_info.py @@ -6,6 +6,7 @@ ### PARAMETERS - Rig and defaults (should not change between sessions) ### +# TODO - get rid of all the redundancy in here # defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) mouse_info = pysistence.make_dict({'mouse_name': 'TM001', @@ -29,7 +30,8 @@ session_info['reward_size'] = 10 # in microliters session_info["lick_threshold"] = 2 session_info['reward_time_delay'] = 20 -session_info['intertrial_interval'] = 1 # in seconds +session_info['intertrial_interval'] = .5 # in seconds +session_info['quiet_ITI'] = False session_info['initiation_timeout'] = 120 # s @@ -46,8 +48,8 @@ session_info["ContextB_time"] = 30 session_info["ContextC_time"] = 30 -session_info['ITI'] = .5 session_info['epoch_length'] = 120 +session_info['dark_period_times'] = [10] # Reward pump parameters session_info["reward_pump1"] = '2' diff --git a/task_protocol/base_classes.py b/task_protocol/base_classes.py index f96eb05..57159ac 100644 --- a/task_protocol/base_classes.py +++ b/task_protocol/base_classes.py @@ -239,20 +239,20 @@ def K_w_callback(self) -> None: def K_e_callback(self) -> None: # print("E down: syringe pump 3 moves") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") - # self.pump.reward("key_3", self.session_info["key_reward_amount"]) + logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") + self.pump.reward("key_3", self.session_info["key_reward_amount"]) pass def K_r_callback(self) -> None: # print("R down: syringe pump 4 moves") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") - # self.pump.reward("key_4", self.session_info["key_reward_amount"]) + logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") + self.pump.reward("key_4", self.session_info["key_reward_amount"]) pass def K_t_callback(self) -> None: # print("T down: vacuum on") - # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") - # self.pump.reward("key_vacuum", 1) + logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") + self.pump.reward("key_vacuum", 1) pass def K_a_callback(self) -> None: @@ -267,7 +267,8 @@ def K_g_callback(self) -> None: def print_controls(self) -> None: print("[***] KEYBOARD CONTROLS [***]") print("1, 2, 3: left/center/right nosepoke entry") - print("q, w, e, r, t: pump 1/2/3/4 reward delivery") + print("q, w, e, r: pump 1/2/3/4 reward delivery") + print("t: vacuum activation") print("a: toggle automated training rewards") print("g: give training reward") diff --git a/task_protocol/gui.py b/task_protocol/gui.py index 34b3b3d..16526e6 100644 --- a/task_protocol/gui.py +++ b/task_protocol/gui.py @@ -65,6 +65,8 @@ def __init__(self, right_ix: int, left_ix: int): self.correct_line = ax.plot([], color='g', marker="o", label='Correct', linestyle='', markersize=10)[0] self.error_line = ax.plot([], color='r', marker="o", label='Error', linestyle='', markersize=10)[0] self.reward_line = ax.plot([], color='b', marker="v", label='Reward given', linestyle='', markersize=5)[0] + self.text = ax.text(0.05, 0.95, '', transform=ax.transAxes, fontsize=14, + verticalalignment='top')#, bbox=props) ax.set_yticks([right_ix, left_ix]) ax.set_yticklabels(['right lick', 'left lick']) plt.ylim([right_ix - .5, left_ix + .5]) diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_model.py b/task_protocol/latent_inference_forage/latent_inference_forage_model.py index 205d43e..f99c3a7 100644 --- a/task_protocol/latent_inference_forage/latent_inference_forage_model.py +++ b/task_protocol/latent_inference_forage/latent_inference_forage_model.py @@ -53,7 +53,7 @@ def __init__(self, session_info: dict): # These can't be refactored, session parameters needed for behavbox # maybe move them into a parameters class - self.ITI = session_info['entry_interval'] + self.ITI = session_info['intertrial_interval'] self.lick_threshold = session_info['lick_threshold'] self.machine = self.make_state_machine() self.last_state_fxn = self.switch_to_standby @@ -68,52 +68,14 @@ def __init__(self, session_info: dict): self.presenter_commands = [] self.ITI_active = False + self.ITI_thread = None self.end_dark_time = 0 self.next_dark_time = 0 - self.dark_period_times = [10] - - # trial statistics - TODO - edit these away - # self.trial_running = False - # self.innocent = True - # self.trial_number = 0 - # self.error_count = 0 - # self.error_list = [] - # self.error_repeat = False - # self.lick_time = 0.0 - # self.lick_interval = self.session_info["lick_interval"] - # # self.reward_time_start = None # for reward_available state time keeping purpose - # self.reward_time = 10 - # self.reward_times_up = False - # self.reward_pump1 = self.session_info["reward_pump1"] - # self.reward_pump2 = self.session_info['reward_pump2'] - # self.reward_size1 = self.session_info['reward_size1'] - # self.reward_size2 = self.session_info['reward_size2'] - # self.reward_size3 = self.session_info['reward_size3'] - # self.reward_size4 = self.session_info['reward_size4'] - # self.ITI = self.session_info['ITI'] - # self.p_switch = self.session_info['p_switch'] - # self.p_reward = self.session_info['p_reward'] - # self.reward_earned = False - # - # self.ContextA_time = 0 - # self.ContextB_time = 0 - # self.LED_on_time_plus_LED_duration = 0 - # - # self.active_press = 0 - # self.inactive_press = 0 - # self.timeline_active_press = [] - # self.active_press_count_list = [] - # self.timeline_inactive_press = [] - # self.inactive_press_count_list = [] - # - # self.left_poke_count = 0 - # self.right_poke_count = 0 - # self.timeline_left_poke = [] - # self.left_poke_count_list = [] - # self.timeline_right_poke = [] - # self.right_poke_count_list = [] - # self.event_name = "" + self.dark_period_thread = None + + # debugging + self.t_ITI_start = 0 def make_state_machine(self): states = [ @@ -132,8 +94,6 @@ def make_state_machine(self): # all of these transition functions are created automatically transitions = [ - # ['start_in_right_patch', 'standby', 'right_patch'], - # ['start_in_left_patch', 'standby', 'left_patch'], ['switch_to_right_patch', ['standby', 'dark_period', 'left_patch'], 'right_patch'], ['switch_to_left_patch', ['standby', 'dark_period', 'right_patch'], 'left_patch'], ['switch_to_dark_period', ['left_patch', 'right_patch'], 'dark_period'], @@ -147,73 +107,38 @@ def make_state_machine(self): ) return machine - def check_intertrial_interval(self, time_since_choice) -> bool: - if time_since_choice < self.ITI: - self.lick_side_buffer *= 0 - return False - - elif time_since_choice >= self.ITI and self.ITI_active: - # turn on the LED, end the run loop - self.turn_LED_on() - self.lick_side_buffer *= 0 - self.ITI_active = False - return False - - else: - return True - - def check_dark_period(self, cur_time: float) -> bool: - if self.state != 'dark_period' and cur_time >= self.next_dark_time: - self.turn_LED_off() - self.reset_counters() - self.switch_to_dark_period() - return False - - elif self.state != 'dark_period' and cur_time < self.next_dark_time: - return True - - elif self.state == 'dark_period' and cur_time < self.end_dark_time: - return False - - elif self.state == 'dark_period' and cur_time >= self.end_dark_time: - self.turn_LED_on() - self.reset_counters() - if rng.random() > 0.5: - self.switch_to_left_patch() - else: - self.switch_to_right_patch() - return False - def run_event_loop(self): cur_time = time.time() time_since_start = cur_time - self.t_session_start - time_since_choice = cur_time - self.last_choice_time if self.event_list: event = self.event_list.popleft() else: event = '' - if self.state == 'standby': - return time_since_start + if event == 'right_entry': + self.lick_side_buffer[RIGHT_IX] += 1 + elif event == 'left_entry': + self.lick_side_buffer[LEFT_IX] += 1 - continue_run = self.check_dark_period(cur_time) - if not continue_run: + if self.state in ['standby', 'dark_period']: + self.lick_side_buffer *= 0 return time_since_start - continue_run = self.check_intertrial_interval(time_since_choice) - if not continue_run: + if self.state in ['left_patch', 'right_patch'] and cur_time >= self.next_dark_time: + self.lick_side_buffer *= 0 + self.activate_dark_period() return time_since_start - if event == 'right_entry': - self.lick_side_buffer[RIGHT_IX] += 1 - elif event == 'left_entry': - self.lick_side_buffer[LEFT_IX] += 1 + if self.ITI_active: + if self.session_info['quiet_ITI'] and self.lick_side_buffer.sum() > 0: + self.ITI_thread.cancel() + self.activate_ITI() + return time_since_start choice = self.determine_choice() if choice == 'right': - self.last_choice_time = cur_time - self.turn_LED_off() + self.activate_ITI() if self.state == 'right_patch': self.log_correct_choice(RIGHT_IX, time_since_start) self.give_correct_reward() @@ -223,8 +148,7 @@ def run_event_loop(self): logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str()) elif choice == 'left': - self.last_choice_time = cur_time - self.turn_LED_off() + self.activate_ITI() if self.state == 'left_patch': self.log_correct_choice(LEFT_IX, time_since_start) self.give_correct_reward() @@ -234,16 +158,12 @@ def run_event_loop(self): logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str("")) elif choice == 'switch': - self.last_choice_time = cur_time # for switches, enter ITI but do not update choices; decide whether to include this or not - self.turn_LED_off() + self.activate_ITI() elif (self.error_count >= self.errors_to_reward and self.automate_training_rewards)\ or self.give_training_reward: - self.last_choice_time = cur_time - self.turn_LED_off() + self.activate_ITI() self.presenter_commands.append('give_training_reward') - - give_training_reward = True if self.state == 'right_patch': choice_side = RIGHT_IX else: @@ -267,7 +187,7 @@ def give_incorrect_reward(self) -> None: def exit_standby(self): logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str("")) - self.next_dark_time = time.time() + 120 + self.next_dark_time = time.time() + self.session_info['epoch_length'] self.reset_counters() def enter_right_patch(self): @@ -290,16 +210,57 @@ def enter_dark_period(self): logging.info(";" + str(time.time()) + ";[transition];enter_dark_period;" + str("")) self.rewards_earned_in_block = 0 self.trial_running = False - self.end_dark_time = time.time() + rng.choice(self.dark_period_times) def exit_dark_period(self): logging.info(";" + str(time.time()) + ";[transition];exit_dark_period;" + str()) - self.next_dark_time = time.time() + 120 + self.next_dark_time = time.time() + self.session_info['epoch_length'] def start_task(self): ic('starting task') - self.next_dark_time = time.time() + 120 + self.next_dark_time = time.time() + self.session_info['epoch_length'] + if rng.random() > 0.5: + self.switch_to_left_patch() + else: + self.switch_to_right_patch() + + def activate_ITI(self): + self.lick_side_buffer *= 0 + self.ITI_active = True + self.turn_LED_off() + t = threading.Timer(interval=self.ITI, function=self.end_ITI) + self.t_ITI_start = time.perf_counter() + t.start() + self.ITI_thread = t + + def end_ITI(self): + ic(time.perf_counter() - self.t_ITI_start) + self.lick_side_buffer *= 0 + self.ITI_active = False + if (self.state + == 'dark_period'): + self.turn_LED_off() + else: + self.turn_LED_on() + + def activate_dark_period(self): + # make sure this overrides ITI, so you don't get an LED turned on after darkmode starts + self.ITI_active = False + if self.ITI_thread: + self.ITI_thread.cancel() + + self.turn_LED_off() + self.reset_counters() + self.switch_to_dark_period() + + t = threading.Timer(rng.choice(self.session_info['dark_period_times']), self.end_dark_period) + t.start() + self.dark_period_thread = t + + def end_dark_period(self): + self.turn_LED_on() + self.reset_counters() if rng.random() > 0.5: self.switch_to_left_patch() else: self.switch_to_right_patch() + diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py b/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py index e013645..056d640 100644 --- a/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py +++ b/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py @@ -95,9 +95,6 @@ def run(self) -> None: Process one event, checking GUI and events as needed. Currently set to give rewards probabilistically (same reward sizes, unequal reward probabilities) """ - # make this say if correct real choice or incorrect real choice - time_since_start = self.task.run_event_loop() - # goes through the whole timeout before doing the plotting bits I think if self.task.state == 'right_patch': correct_pump = PUMP1_IX @@ -106,13 +103,13 @@ def run(self) -> None: correct_pump = PUMP2_IX incorrect_pump = PUMP1_IX else: - raise RuntimeError('state not recognized') + correct_pump = None + incorrect_pump = None + # raise RuntimeError('state not recognized') + time_since_start = self.task.run_event_loop() self.perform_task_commands(correct_pump, incorrect_pump) - - if self.task.trial_choice_list: - self.update_plot() - + self.update_plot() self.gui.check_keyboard() def perform_task_commands(self, correct_pump: int, incorrect_pump: int) -> None: @@ -153,12 +150,13 @@ def perform_task_commands(self, correct_pump: int, incorrect_pump: int) -> None: elif self.task.state == 'left_patch': self.task.switch_to_right_patch() else: - raise RuntimeError('state not recognized') + pass + # raise RuntimeError('state not recognized') print('current state: {}; rewards earned in block: {}'.format(self.task.state, self.task.rewards_earned_in_block)) self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) - + elif c == 'give_incorrect_reward': if rng.random() < self.session_info['incorrect_reward_probability']: reward_size = self.reward_size_large[ @@ -176,30 +174,34 @@ def perform_task_commands(self, correct_pump: int, incorrect_pump: int) -> None: self.task.presenter_commands.clear() def update_plot(self, save_fig: bool = False) -> None: - ix = np.array(self.task.trial_correct_list) - choices = np.array(self.task.trial_choice_list) - times = np.array(self.task.trial_choice_times) - rewards = np.array(self.task.trial_reward_given) - - correct_trials = choices[ix] - correct_times = times[ix] - - incorrect_trials = choices[~ix] - incorrect_times = times[~ix] - - reward_trials = choices[rewards] - reward_times = times[rewards] - - self.gui.figure_window.correct_line.set_data(correct_times, correct_trials) - self.gui.figure_window.error_line.set_data(incorrect_times, incorrect_trials) - self.gui.figure_window.reward_line.set_data(reward_times, reward_trials) - # print('correct trials:', correct_trials) - - # update this to show the last 20-ish trials - if times.size > 1: - T = [times[-20:][0], times[-1]] - else: - T = [times[-1]-.5, times[-1]+.5] - plt.xlim(T) + if self.task.trial_choice_list: + ix = np.array(self.task.trial_correct_list) + choices = np.array(self.task.trial_choice_list) + times = np.array(self.task.trial_choice_times) + rewards = np.array(self.task.trial_reward_given) + + correct_trials = choices[ix] + correct_times = times[ix] + + incorrect_trials = choices[~ix] + incorrect_times = times[~ix] + + reward_trials = choices[rewards] + reward_times = times[rewards] + + self.gui.figure_window.correct_line.set_data(correct_times, correct_trials) + self.gui.figure_window.error_line.set_data(incorrect_times, incorrect_trials) + self.gui.figure_window.reward_line.set_data(reward_times, reward_trials) + # print('correct trials:', correct_trials) + + # update this to show the last 20-ish trials + if times.size > 1: + T = [times[-20:][0], times[-1]] + else: + T = [times[-1]-.5, times[-1]+.5] + plt.xlim(T) + + self.gui.figure_window.text.set_text('State: {}; ITI: {}'.format(self.task.state, + self.task.ITI_active)) self.gui.check_plot(figure=self.gui.figure_window.figure, savefig=save_fig) From faf5a971658fa28f7119e9d8ee12972d5fbf3fe2 Mon Sep 17 00:00:00 2001 From: mattchin35 Date: Mon, 29 Jan 2024 19:25:18 -0500 Subject: [PATCH 113/135] requirements file added --- requirements.txt | 20 +++++++++++++++++++ task_protocol/base_classes.py | 3 --- .../latent_inference_forage_presenter.py | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9289d9c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,20 @@ +Adafruit_GPIO +colorama +colorzero +gpiozero +icecream +ipython +matplotlib +mock +numpy +Pillow +pygame +pygame_ce +pygame_gui +pysistence +pytest +rpg +scipy +setuptools +smbus +transitions diff --git a/task_protocol/base_classes.py b/task_protocol/base_classes.py index 57159ac..601d0d1 100644 --- a/task_protocol/base_classes.py +++ b/task_protocol/base_classes.py @@ -241,19 +241,16 @@ def K_e_callback(self) -> None: # print("E down: syringe pump 3 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") self.pump.reward("key_3", self.session_info["key_reward_amount"]) - pass def K_r_callback(self) -> None: # print("R down: syringe pump 4 moves") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") self.pump.reward("key_4", self.session_info["key_reward_amount"]) - pass def K_t_callback(self) -> None: # print("T down: vacuum on") logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") self.pump.reward("key_vacuum", 1) - pass def K_a_callback(self) -> None: # toggle automated training rewards diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py b/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py index 056d640..e628b68 100644 --- a/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py +++ b/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py @@ -1,5 +1,5 @@ import collections -from typing import Protocol, List, Tuple +from typing import Protocol, Tuple import matplotlib as mpl import matplotlib.pyplot as plt From 07aa7a31aac5c6c43f9ffc192c07a96ef39ec8f6 Mon Sep 17 00:00:00 2001 From: Matthew Chin <35109891+mattchin35@users.noreply.github.com> Date: Tue, 30 Jan 2024 10:11:17 -0500 Subject: [PATCH 114/135] Revert "Merge pull request #71 from mattchin35/matt-behavior" This reverts commit 17a8aa1d46edbab3e170e482609ec3844ac728c0, reversing changes made to b4c190acfc7f374536f672462980176f4283319b. --- .gitattributes | 1 - debug/calibrate.py | 28 +- essential/behavbox.py | 395 ++++++++---- essential/dummy_box.py | 78 --- main.py | 232 ------- obsolete/behavbox_v2.py | 413 ++++++++++++ obsolete/fake_session_info.py | 43 ++ obsolete/headfixed2FC_task_old.py | 461 ++++++++++++++ obsolete/headfixed_task_old.py | 454 +++++++++++++ obsolete/lick_task.py | 182 ++++++ obsolete/pump_task.py | 171 +++++ obsolete/record_run_test.py | 49 ++ obsolete/run_flip_task.py | 27 + obsolete/run_headfixed2FC_task.py | 182 ++++++ obsolete/run_headfixed_task.py | 172 +++++ obsolete/run_lick_task.py | 131 ++++ obsolete/run_season_task.py | 125 ++++ obsolete/run_soyoun_task.py | 137 ++++ obsolete/run_visualization_task.py | 129 ++++ .../run_walk_task.py | 75 ++- obsolete/session_info_headfixed.py | 89 +++ obsolete/session_info_headfixed2FC.py | 88 +++ obsolete/session_info_walk.py | 64 ++ obsolete/soyoun_task.py | 327 ++++++++++ obsolete/task_information_headfixed.py | 77 +++ obsolete/task_information_headfixed2FC.py | 42 ++ obsolete/task_information_lick.py | 134 ++++ obsolete/task_information_phase_1.py | 158 +++++ obsolete/test_session_info.py | 23 + obsolete/testing_visualstim.py | 64 ++ obsolete/visualization_task.py | 182 ++++++ obsolete/walk_task.py | 461 ++++++++++++++ outputs/__init__.py | 0 requirements.txt | 20 - session_info.py | 97 --- task_protocol/EFO_task/EFO_task.py | 203 ++++++ task_protocol/EFO_task/__init__.py | 1 + task_protocol/alternating_latent/__init__.py | 0 .../alternating_latent_model.py | 312 --------- .../alternating_latent_presenter.py | 181 ------ task_protocol/base_classes.py | 287 --------- task_protocol/gui.py | 190 ------ task_protocol/headfixed_task/__init__.py | 1 + .../headfixed_independent_reward_task.py | 471 ++++++++++++++ .../headfixed_task/headfixed_task.py | 470 ++++++++++++++ .../run_headfixed_independent_reward_task.py | 265 ++++++++ .../headfixed_task/run_headfixed_task.py | 265 ++++++++ ...ssion_info_headfixed_independent_reward.py | 130 ++++ .../session_info_headfixed_task.py | 131 ++++ .../task_information_headfixed.py | 46 ++ .../task_information_independent_reward.py | 46 ++ task_protocol/kelly_task/__init__.py | 1 + task_protocol/kelly_task/kelly_record_task.py | 60 ++ task_protocol/kelly_task/kelly_task.py | 183 ++++++ task_protocol/kelly_task/run_kelly_task.py | 126 ++++ task_protocol/kelly_task/run_record_task.py | 100 +++ .../session_info_year-month-date.py | 65 ++ .../latent_inference_forage/__init__.py | 0 .../latent_inference_forage_model.py | 266 -------- .../latent_inference_forage_presenter.py | 207 ------ task_protocol/self_admin_task/__init__.py | 1 + .../self_admin_task/remi_self_admin_task.py | 374 +++++++++++ .../run_remi_self_admin_task.py} | 40 +- .../run_self_admin_task.py} | 40 +- .../self_admin_task/self_admin_task.py | 310 +++++++++ .../session_info_self_admin.py | 66 ++ task_protocol/session_info_sample.py | 90 --- .../to_be_refactored/A_B_C1_C2_task.py | 599 ------------------ task_protocol/to_be_refactored/A_B_task.py | 482 -------------- task_protocol/to_be_refactored/C1_C2_task.py | 464 -------------- .../latent_inference_forage_task.py | 345 ---------- ...tent_inference_forage_task_three_states.py | 376 ----------- 72 files changed, 8091 insertions(+), 4414 deletions(-) delete mode 100644 .gitattributes delete mode 100644 essential/dummy_box.py delete mode 100644 main.py create mode 100644 obsolete/behavbox_v2.py create mode 100755 obsolete/fake_session_info.py create mode 100644 obsolete/headfixed2FC_task_old.py create mode 100644 obsolete/headfixed_task_old.py create mode 100644 obsolete/lick_task.py create mode 100755 obsolete/pump_task.py create mode 100755 obsolete/record_run_test.py create mode 100755 obsolete/run_flip_task.py create mode 100644 obsolete/run_headfixed2FC_task.py create mode 100644 obsolete/run_headfixed_task.py create mode 100644 obsolete/run_lick_task.py create mode 100644 obsolete/run_season_task.py create mode 100644 obsolete/run_soyoun_task.py create mode 100644 obsolete/run_visualization_task.py rename task_protocol/to_be_refactored/run_A_B_C1_C2_task.py => obsolete/run_walk_task.py (62%) create mode 100644 obsolete/session_info_headfixed.py create mode 100644 obsolete/session_info_headfixed2FC.py create mode 100644 obsolete/session_info_walk.py create mode 100644 obsolete/soyoun_task.py create mode 100644 obsolete/task_information_headfixed.py create mode 100644 obsolete/task_information_headfixed2FC.py create mode 100644 obsolete/task_information_lick.py create mode 100644 obsolete/task_information_phase_1.py create mode 100755 obsolete/test_session_info.py create mode 100755 obsolete/testing_visualstim.py create mode 100644 obsolete/visualization_task.py create mode 100644 obsolete/walk_task.py delete mode 100644 outputs/__init__.py delete mode 100644 requirements.txt delete mode 100644 session_info.py create mode 100644 task_protocol/EFO_task/EFO_task.py create mode 100644 task_protocol/EFO_task/__init__.py delete mode 100644 task_protocol/alternating_latent/__init__.py delete mode 100644 task_protocol/alternating_latent/alternating_latent_model.py delete mode 100644 task_protocol/alternating_latent/alternating_latent_presenter.py delete mode 100644 task_protocol/base_classes.py delete mode 100644 task_protocol/gui.py create mode 100644 task_protocol/headfixed_task/__init__.py create mode 100644 task_protocol/headfixed_task/headfixed_independent_reward_task.py create mode 100644 task_protocol/headfixed_task/headfixed_task.py create mode 100644 task_protocol/headfixed_task/run_headfixed_independent_reward_task.py create mode 100644 task_protocol/headfixed_task/run_headfixed_task.py create mode 100644 task_protocol/headfixed_task/session_info_headfixed_independent_reward.py create mode 100644 task_protocol/headfixed_task/session_info_headfixed_task.py create mode 100644 task_protocol/headfixed_task/task_information_headfixed.py create mode 100644 task_protocol/headfixed_task/task_information_independent_reward.py create mode 100644 task_protocol/kelly_task/__init__.py create mode 100755 task_protocol/kelly_task/kelly_record_task.py create mode 100755 task_protocol/kelly_task/kelly_task.py create mode 100755 task_protocol/kelly_task/run_kelly_task.py create mode 100755 task_protocol/kelly_task/run_record_task.py create mode 100755 task_protocol/kelly_task/session_info_year-month-date.py delete mode 100644 task_protocol/latent_inference_forage/__init__.py delete mode 100644 task_protocol/latent_inference_forage/latent_inference_forage_model.py delete mode 100644 task_protocol/latent_inference_forage/latent_inference_forage_presenter.py create mode 100644 task_protocol/self_admin_task/__init__.py create mode 100644 task_protocol/self_admin_task/remi_self_admin_task.py rename task_protocol/{to_be_refactored/run_C1_C2_task.py => self_admin_task/run_remi_self_admin_task.py} (81%) rename task_protocol/{to_be_refactored/run_A_B_task.py => self_admin_task/run_self_admin_task.py} (81%) create mode 100644 task_protocol/self_admin_task/self_admin_task.py create mode 100644 task_protocol/self_admin_task/session_info_self_admin.py delete mode 100644 task_protocol/session_info_sample.py delete mode 100644 task_protocol/to_be_refactored/A_B_C1_C2_task.py delete mode 100644 task_protocol/to_be_refactored/A_B_task.py delete mode 100644 task_protocol/to_be_refactored/C1_C2_task.py delete mode 100644 task_protocol/to_be_refactored/latent_inference_forage_task.py delete mode 100644 task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 176a458..0000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto diff --git a/debug/calibrate.py b/debug/calibrate.py index 9aec7c5..175d3f0 100644 --- a/debug/calibrate.py +++ b/debug/calibrate.py @@ -3,7 +3,7 @@ author: tian qiu date: 2023-03-22 name: calibrate.py -goal: calibrating the pump and log the data entry +goal: calibrating the the pump and log the data entry description: """ @@ -63,32 +63,32 @@ def calibration_flush(calibration_filename, calibration_log): pump_number = str(input("Pump Number: ")) # user inputs the pump number they intend to calibrate at the moment on_duration = float(input("on_time: ")) off_duration = float(input("off_time: ")) - n_iterations = int(input("iterations: ")) + pulse_time = float(input("iteration: ")) weight_tube = float(input("weight_tube: ")) # deliver the water using the pump object # pump.reward(pump_number, on_duration, off_duration, pulse_time) if pump_number == "1": - LED(19).blink(on_duration, off_duration, n_iterations) - print("pump1, " + str(on_duration) + str(off_duration) + str(n_iterations)) + LED(19).blink(on_time, off_time, iteration) + print("pump1, " + str(on_time) + str(off_time) + str(iteration)) elif pump_number == "2": - LED(20).blink(on_duration, off_duration, n_iterations) - print("pump2, " + str(on_duration) + str(off_duration) + str(n_iterations)) + LED(20).blink(on_time, off_time, iteration) + print("pump2, " + str(on_time) + str(off_time) + str(iteration)) elif pump_number == "3": - LED(21).blink(on_duration, off_duration, n_iterations) - print("pump3, " + str(on_duration) + str(off_duration) + str(n_iterations)) + LED(21).blink(on_time, off_time, iteration) + print("pump3, " + str(on_time) + str(off_time) + str(iteration)) elif pump_number == "4": - LED(7).blink(on_duration, off_duration, n_iterations) - print("pump4, " + str(on_duration) + str(off_duration) + str(n_iterations)) - time.sleep((on_duration+off_duration)*n_iterations + 0.1) - print("Please go weigh the container with the liquid!\n") + LED(7).blink(on_time, off_time, iteration) + print("pump4, " + str(on_time) + str(off_time) + str(iteration)) + time.sleep((on_duration+off_duration)*pulse_time + 0.1) + print("Please go weight the container with the liquid!\n") weight_total = float(input("weight_total: ")) weight_fluid = weight_total - weight_tube calibration_log.append( (pump_number, on_duration, off_duration, - n_iterations, weight_tube, weight_total, weight_fluid) + pulse_time, weight_tube, weight_total, weight_fluid) ) abort_or_not = str(input("Abort the program?(Y/N) \n")).upper() - if abort_or_not.lower() == ['y']: + if abort_or_not == 'Y': break print("Flushing the calibration data ...\n") diff --git a/essential/behavbox.py b/essential/behavbox.py index 9e4186e..d8aebf2 100755 --- a/essential/behavbox.py +++ b/essential/behavbox.py @@ -17,13 +17,20 @@ import socket import time from collections import deque +import pygame +import pygame.display + +import numpy as np +import matplotlib +matplotlib.use('module://pygame_matplotlib.backend_pygame') +import matplotlib.pyplot as plt +import matplotlib.figure as fg import logging from colorama import Fore, Style from visualstim import VisualStim import scipy.io, pickle -from typing import Protocol import Treadmill import ADS1x15 @@ -32,57 +39,6 @@ from FlipperOutput import FlipperOutput -class Presenter(Protocol): - - def IR_1_entry_callback(self): - ... - - def IR_2_entry_callback(self): - ... - - def IR_3_entry_callback(self): - ... - - def IR_4_entry_callback(self): - ... - - def IR_5_entry_callback(self): - ... - - def IR_1_exit_callback(self): - ... - - def IR_2_exit_callback(self): - ... - - def IR_3_exit_callback(self): - ... - - def IR_4_exit_callback(self): - ... - - def IR_5_exit_callback(self): - ... - - def lick1_pressed_callback(self): - ... - - def lick2_pressed_callback(self): - ... - - def lick3_pressed_callback(self): - ... - - def lick1_released_callback(self): - ... - - def lick2_released_callback(self): - ... - - def lick3_released_callback(self): - ... - - class BehavBox(object): event_list = ( deque() @@ -122,6 +78,12 @@ def __init__(self, session_info): IP_address_video_list[-1] = "2" self.IP_address_video = "".join(IP_address_video_list) + ############################################################################################### + # event list trigger by the interaction between the RPi and the animal for visualization + # interact_list: lick, choice interaction between the board and the animal for visualization + ############################################################################################### + self.interact_list = [] + ############################################################################################### # below are all the pin numbers for Yi's breakout board # cue LEDs - setting PWM frequency of 200 Hz @@ -150,7 +112,17 @@ def __init__(self, session_info): self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use - + # link nosepoke event detections to callbacks + self.IR_rx1.when_pressed = self.IR_1_entry + self.IR_rx2.when_pressed = self.IR_2_entry + self.IR_rx3.when_pressed = self.IR_3_entry + self.IR_rx4.when_pressed = self.IR_4_entry + self.IR_rx5.when_pressed = self.IR_5_entry + self.IR_rx1.when_released = self.IR_1_exit + self.IR_rx2.when_released = self.IR_2_exit + self.IR_rx3.when_released = self.IR_3_exit + self.IR_rx4.when_released = self.IR_4_exit + self.IR_rx5.when_released = self.IR_5_exit ############################################################################################### # close circuit detection - for ground pin circuit lick detection ############################################################################################### @@ -159,6 +131,20 @@ def __init__(self, session_info): self.lick3 = Button(15, None, True) #self.reserved_rx1 = Button(13, None, True) # for mitch #self.reserved_rx2 = Button(16, None, True) # for mitch + # + # # link nosepoke event detections to callbacks + self.lick1.when_pressed = self.left_exit + self.lick2.when_pressed = self.right_exit + self.lick3.when_pressed = self.center_exit + + self.lick1.when_released = self.left_entry + self.lick2.when_released = self.right_entry + self.lick3.when_released = self.center_entry + + # self.reserved_rx1.when_pressed = self.reserved_rx1_pressed + # self.reserved_rx2.when_pressed = self.reserved_rx2_pressed + # self.reserved_rx1.when_released = self.reserved_rx1_released + # self.reserved_rx2.when_released = self.reserved_rx2_released ############################################################################################### # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors @@ -173,6 +159,11 @@ def __init__(self, session_info): self.sound1 = LED(23) # branch new_lick modification self.sound2 = LED(24) # branch new_lick modification + ############################################################################################### + # pump: trigger signal output to a driver board induce the solenoid valve to deliver reward + ############################################################################################### + self.pump = Pump(self.session_info) + ############################################################################################### # flipper strobe signal (previously called camera strobe signal) ############################################################################################### @@ -218,27 +209,120 @@ def __init__(self, session_info): else: self.treadmill = False print("No treadmill I2C connection detected!") + ############################################################################################### + # pygame window setup and keystroke handler + ############################################################################################### + try: + pygame.init() + self.main_display = pygame.display.set_mode((800, 600)) + pygame.display.set_caption(session_info["box_name"]) + fig, axes = plt.subplots(1, 1, ) + axes.plot() + self.check_plot(fig) + print( + "\nKeystroke handler initiated. In order for keystrokes to register, the pygame window" + ) + print("must be in the foreground. Keys are as follows:\n") + print( + Fore.YELLOW + + " 1: left poke 2: center poke 3: right poke" + ) + print( + " Q: pump_1 W: pump_2 E: pump_3 R: pump_4" + ) + print( + Fore.CYAN + + " Esc: close key capture window\n" + + Style.RESET_ALL + ) + print( + Fore.GREEN + + Style.BRIGHT + + " TO EXIT, CLICK THE MAIN TEXT WINDOW AND PRESS CTRL-C " + + Fore.RED + + "ONCE\n" + + Style.RESET_ALL + ) - def set_callbacks(self, Presenter): - # link nosepoke event detections to callbacks - self.IR_rx1.when_pressed = Presenter.IR_1_entry_callback - self.IR_rx2.when_pressed = Presenter.IR_2_entry_callback - self.IR_rx3.when_pressed = Presenter.IR_3_entry_callback - self.IR_rx4.when_pressed = Presenter.IR_4_entry_callback - self.IR_rx5.when_pressed = Presenter.IR_5_entry_callback - self.IR_rx1.when_released = Presenter.IR_1_exit_callback - self.IR_rx2.when_released = Presenter.IR_2_exit_callback - self.IR_rx3.when_released = Presenter.IR_3_exit_callback - self.IR_rx4.when_released = Presenter.IR_4_exit_callback - self.IR_rx5.when_released = Presenter.IR_5_exit_callback - - self.lick1.when_pressed = Presenter.lick1_pressed_callback - self.lick2.when_pressed = Presenter.lick2_pressed_callback - self.lick3.when_pressed = Presenter.lick3_pressed_callback - - self.lick1.when_released = Presenter.lick1_released_callback - self.lick2.when_released = Presenter.lick2_released_callback - self.lick3.when_released = Presenter.lick3_released_callback + self.keyboard_active = True + except Exception as error_message: + print("pygame issue\n") + print(str(error_message)) + ############################################################################################### + # check for data visualization - uses pygame window to show behavior progress + ############################################################################################### + """ + 1. show a blank window. (change in the pygame initiation part) + 2. show a x,y axis with a count of trial + """ + def check_plot(self, figure=None, FPS=144): + if figure: + FramePerSec = pygame.time.Clock() + figure.canvas.draw() + self.main_display.blit(figure, (0, 0)) + pygame.display.update() + FramePerSec.tick(FPS) + else: + print("No figure available") + + ############################################################################################### + # check for key presses - uses pygame window to simulate nosepokes and licks + ############################################################################################### + + def check_keybd(self): + reward_size = self.session_info['reward_size'] + # pump = Pump() + if self.keyboard_active: + # event = pygame.event.get() + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + self.keyboard_active = False + elif event.key == pygame.K_1: + self.left_entry() + self.left_IR_entry() + logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") + elif event.key == pygame.K_2: + self.center_entry() + self.center_IR_entry() + logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") + elif event.key == pygame.K_3: + self.right_entry() + self.right_IR_entry() + logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") + # elif event.key == pygame.K_4: + # self.reserved_rx1_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx1_pressed()") + # elif event.key == pygame.K_5: + # self.reserved_rx2_pressed() + # logging.info(";" + str(time.time()) + ";[action];key_pressed_reserved_rx2_pressed()") + elif event.key == pygame.K_q: + # print("Q down: syringe pump 1 moves") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") + self.pump.reward("key_1", self.session_info["key_reward_amount"]) + elif event.key == pygame.K_w: + # print("W down: syringe pump 2 moves") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") + self.pump.reward("key_2", self.session_info["key_reward_amount"]) + elif event.key == pygame.K_e: + # print("E down: syringe pump 3 moves") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") + self.pump.reward("key_3", self.session_info["key_reward_amount"]) + elif event.key == pygame.K_r: + # print("R down: syringe pump 4 moves") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") + self.pump.reward("key_4", self.session_info["key_reward_amount"]) + elif event.key == pygame.K_t: + # print("T down: vacuum on") + # logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") + self.pump.reward("key_vacuum", 1) + elif event.type == pygame.KEYUP: + if event.key == pygame.K_1: + self.left_exit() + elif event.key == pygame.K_2: + self.center_exit() + elif event.key == pygame.K_3: + self.right_exit() ############################################################################################### # methods to start and stop video @@ -358,104 +442,195 @@ def video_stop(self): ) print("rsync finished!") # print("Control-C to quit (ignore the error for now)") - except Exception as e: print(e) + ############################################################################################### + # callbacks + ############################################################################################### + def left_entry(self): + self.event_list.append("left_entry") + self.interact_list.append((time.time(), "left_entry")) + logging.info(";" + str(time.time()) + ";[action];left_entry") + + def center_entry(self): + self.event_list.append("center_entry") + self.interact_list.append((time.time(), "center_entry")) + logging.info(";" + str(time.time()) + ";[action];center_entry") + + def right_entry(self): + self.event_list.append("right_entry") + self.interact_list.append((time.time(), "right_entry")) + logging.info(";" + str(time.time()) + ";[action];right_entry") + + def left_exit(self): + self.event_list.append("left_exit") + self.interact_list.append((time.time(), "left_exit")) + logging.info(";" + str(time.time()) + ";[action];left_exit") + + def center_exit(self): + self.event_list.append("center_exit") + self.interact_list.append((time.time(), "center_exit")) + logging.info(";" + str(time.time()) + ";[action];center_exit") + + def right_exit(self): + self.event_list.append("right_exit") + self.interact_list.append((time.time(), "right_exit")) + logging.info(";" + str(time.time()) + ";[action];right_exit") + + # def reserved_rx1_pressed(self): + # self.event_list.append("reserved_rx1_pressed") + # self.interact_list.append((time.time(), "reserved_rx1_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_pressed") + # + # def reserved_rx2_pressed(self): + # self.event_list.append("reserved_rx2_pressed") + # self.interact_list.append((time.time(), "reserved_rx2_pressed")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_pressed") + # + # def reserved_rx1_released(self): + # self.event_list.append("reserved_rx1_released") + # self.interact_list.append((time.time(), "reserved_rx1_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx1_released") + # + # def reserved_rx2_released(self): + # self.event_list.append("reserved_rx2_released") + # self.interact_list.append((time.time(), "reserved_rx2_released")) + # logging.info(";" + str(time.time()) + ";[action];reserved_rx2_released") + def IR_1_entry(self): + self.event_list.append("IR_1_entry") + logging.info(str(time.time()) + ", IR_1_entry") + + def IR_2_entry(self): + self.event_list.append("IR_2_entry") + logging.info(str(time.time()) + ", IR_2_entry") + + def IR_3_entry(self): + self.event_list.append("IR_3_entry") + logging.info(str(time.time()) + ", IR_3_entry") + + def IR_4_entry(self): + self.event_list.append("IR_4_entry") + logging.info(str(time.time()) + ", IR_4_entry") + + def IR_5_entry(self): + self.event_list.append("IR_5_entry") + logging.info(str(time.time()) + ", IR_5_entry") + + def IR_1_exit(self): + self.event_list.append("IR_1_exit") + logging.info(str(time.time()) + ", IR_1_exit") + + def IR_2_exit(self): + self.event_list.append("IR_2_exit") + # self.cueLED2.off() + logging.info(str(time.time()) + ", IR_2_exit") + + def IR_3_exit(self): + self.event_list.append("IR_3_exit") + logging.info(str(time.time()) + ", IR_3_exit") + + def IR_4_exit(self): + self.event_list.append("IR_4_exit") + logging.info(str(time.time()) + ", IR_4_exit") + + def IR_5_exit(self): + self.event_list.append("IR_5_exit") + logging.info(str(time.time()) + ", IR_5_exit") # this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) # currently. BoxLED.set_value is the saved intensity value that determines how bright the # LED will be if BoxLED.on() is called. This is better than the original PWMLED class. class BoxLED(PWMLED): set_value = 1 # the intensity value, ranging from 0-1 - def on(self): # unlike PWMLED, here the on() function sets the intensity to set_value, + + def on( + self, + ): # unlike PWMLED, here the on() function sets the intensity to set_value, # not to full intensity self.value = self.set_value -############################################################################################### -# pump: trigger signal output to a driver board induce the solenoid valve to deliver reward -############################################################################################### class Pump(object): def __init__(self, session_info): + self.session_info = session_info self.pump1 = LED(19) self.pump2 = LED(20) self.pump3 = LED(21) self.pump4 = LED(7) self.pump_air = LED(8) self.pump_vacuum = LED(25) - - # this needs to move to the controller - self.reward_list = [] # a list of tuple (pump_x, reward_amount) with information of reward history for data + self.reward_list = [] # a list of tuple (pump_x, reward_amount) with information of reward history for data # visualization - self.coefficient_p1 = session_info["calibration_coefficient"]['1'] - self.coefficient_p2 = session_info["calibration_coefficient"]['2'] - self.coefficient_p3 = session_info["calibration_coefficient"]['3'] - self.coefficient_p4 = session_info["calibration_coefficient"]['4'] - self.duration_air = session_info['air_duration'] - self.duration_vac = session_info["vacuum_duration"] - def reward(self, which_pump, reward_size): + # import coefficient from the session_information + coefficient_p1 = self.session_info["calibration_coefficient"]['1'] + coefficient_p2 = self.session_info["calibration_coefficient"]['2'] + coefficient_p3 = self.session_info["calibration_coefficient"]['3'] + coefficient_p4 = self.session_info["calibration_coefficient"]['4'] + duration_air = self.session_info['air_duration'] + duration_vac = self.session_info["vacuum_duration"] + if which_pump == "1": - duration = round((self.coefficient_p1[0] * (reward_size / 1000) + self.coefficient_p1[1]), 5) # linear function + duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 5) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(self.coefficient_p1) + + logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient_p1) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "2": - duration = round((self.coefficient_p2[0] * (reward_size / 1000) + self.coefficient_p2[1]), 5) # linear function + duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(self.coefficient_p2) + + logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient_p2) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "3": - duration = round((self.coefficient_p3[0] * (reward_size / 1000) + self.coefficient_p3[1]), 5) # linear function + duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(self.coefficient_p3) + + logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient_p3) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "4": - duration = round((self.coefficient_p4[0] * (reward_size / 1000) + self.coefficient_p4[1]), 5) # linear function + duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(self.coefficient_p4) + + logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient_p4) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "air_puff": - self.pump_air.blink(self.duration_air, 0.1, 1) + self.pump_air.blink(duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) elif which_pump == "vacuum": - self.pump_vacuum.blink(self.duration_vac, 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(self.duration_vac)) + self.pump_vacuum.blink(duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) elif which_pump == "key_1": - duration = round((self.coefficient_p1[0] * (reward_size / 1000) + self.coefficient_p1[1]), 5) # linear function + duration = round((coefficient_p1[0] * (reward_size / 1000) + coefficient_p1[1]), 5) # linear function self.pump1.blink(duration, 0.1, 1) self.reward_list.append(("pump1_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump1_reward(reward_coeff: " + str(self.coefficient_p1) + + logging.info(";" + str(time.time()) + ";[key];pump1_reward(reward_coeff: " + str(coefficient_p1) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_2": - duration = round((self.coefficient_p2[0] * (reward_size / 1000) + self.coefficient_p2[1]), 5) # linear function + duration = round((coefficient_p2[0] * (reward_size / 1000) + coefficient_p2[1]), 5) # linear function self.pump2.blink(duration, 0.1, 1) self.reward_list.append(("pump2_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump2_reward(reward_coeff: " + str(self.coefficient_p2) + + logging.info(";" + str(time.time()) + ";[key];pump2_reward(reward_coeff: " + str(coefficient_p2) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_3": - duration = round((self.coefficient_p3[0] * (reward_size / 1000) + self.coefficient_p3[1]), 5) # linear function + duration = round((coefficient_p3[0] * (reward_size / 1000) + coefficient_p3[1]), 5) # linear function self.pump3.blink(duration, 0.1, 1) self.reward_list.append(("pump3_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump3_reward(reward_coeff: " + str(self.coefficient_p3) + + logging.info(";" + str(time.time()) + ";[key];pump3_reward(reward_coeff: " + str(coefficient_p3) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_4": - duration = round((self.coefficient_p4[0] * (reward_size / 1000) + self.coefficient_p4[1]), 5) # linear function + duration = round((coefficient_p4[0] * (reward_size / 1000) + coefficient_p4[1]), 5) # linear function self.pump4.blink(duration, 0.1, 1) self.reward_list.append(("pump4_reward", reward_size)) - logging.info(";" + str(time.time()) + ";[key];pump4_reward(reward_coeff: " + str(self.coefficient_p4) + + logging.info(";" + str(time.time()) + ";[key];pump4_reward(reward_coeff: " + str(coefficient_p4) + ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") elif which_pump == "key_air_puff": - self.pump_air.blink(self.duration_air, 0.1, 1) + self.pump_air.blink(duration_air, 0.1, 1) self.reward_list.append(("air_puff", reward_size)) logging.info(";" + str(time.time()) + ";[key];pump4_reward_" + str(reward_size)) elif which_pump == "key_vacuum": - self.pump_vacuum.blink(self.duration_vac, 0.1, 1) - logging.info(";" + str(time.time()) + ";[key];pump_vacuum" + str(self.duration_vac)) + self.pump_vacuum.blink(duration_vac, 0.1, 1) + logging.info(";" + str(time.time()) + ";[key];pump_vacuum" + str(duration_vac)) \ No newline at end of file diff --git a/essential/dummy_box.py b/essential/dummy_box.py deleted file mode 100644 index e075aa7..0000000 --- a/essential/dummy_box.py +++ /dev/null @@ -1,78 +0,0 @@ -from typing import Protocol -import logging -import time - - -class LED: - def __init__(self): - self.is_on: bool = False - - def blink(self, on_time: float, off_time: float, iteration: int): - pass - - def on(self): - self.is_on = True - - def off(self): - self.is_on = False - - -class BehavBox: - - cueLED1 = LED() - cueLED2 = LED() - - def __init__(self, session_info): - pass - - def set_callbacks(self, presenter): - pass - - def video_start(self): - pass - - def video_stop(self): - pass - - -class Pump(object): - def __init__(self, session_info): - pass - - def reward(self, which_pump, reward_size): - duration = "n/a" - coefficient = "n/a" - duration_vac = "n/a" - - if which_pump == "1": - logging.info(";" + str(time.time()) + ";[reward];pump1_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "2": - logging.info(";" + str(time.time()) + ";[reward];pump2_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "3": - logging.info(";" + str(time.time()) + ";[reward];pump3_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "4": - logging.info(";" + str(time.time()) + ";[reward];pump4_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "air_puff": - logging.info(";" + str(time.time()) + ";[reward];pump4_reward_" + str(reward_size)) - elif which_pump == "vacuum": - logging.info(";" + str(time.time()) + ";[reward];pump_vacuum" + str(duration_vac)) - elif which_pump == "key_1": - logging.info(";" + str(time.time()) + ";[key];pump1_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "key_2": - logging.info(";" + str(time.time()) + ";[key];pump2_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "key_3": - logging.info(";" + str(time.time()) + ";[key];pump3_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "key_4": - logging.info(";" + str(time.time()) + ";[key];pump4_reward(reward_coeff: " + str(coefficient) + - ", reward_amount: " + str(reward_size) + "duration: " + str(duration) + ")") - elif which_pump == "key_air_puff": - logging.info(";" + str(time.time()) + ";[key];pump4_reward_" + str(reward_size)) - elif which_pump == "key_vacuum": - logging.info(";" + str(time.time()) + ";[key];pump_vacuum" + str(duration_vac)) \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 65f8161..0000000 --- a/main.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -#!/usr/bin/env -S ipython3 -i - -""" -author: Matthew Chin -date: 2023-11-10 -name: main.py -""" - -from icecream import ic -from datetime import datetime -import os -import importlib -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -import sys -import logging -import logging.config -import numpy as np -from pathlib import Path - - -sys.path.insert(0, './essential') # essential holds behavbox and equipment classes -sys.path.insert(0, '.') - -debug_startup = False -debug_task = False -if debug_startup or debug_task: - from essential import dummy_box as behavbox -else: - from essential import behavbox - -debug_enable = False - - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - - -# if debug_enable: -# # enabling debugger -# from IPython import get_ipython -# ipython = get_ipython() -# ipython.magic("pdb on") -# ipython.magic("xmode Verbose") - -# import your task class here -sys.path.insert(0,'./task_protocol') -from task_protocol.gui import GUI - - -def confirm_options(session_info: dict) -> bool: - print("The following options are set for this session:") - print("Mouse name: " + session_info['mouse_name']) - print("Task type: " + session_info['task_config']) - print("Is this correct? (y/n)") - - correct = False - user_input = input() - if user_input in ['n', 'N']: - print("Please edit the session_info file and try again") - quit() - elif user_input in ['y', 'Y']: - correct = True - print("Starting session") - else: - print("Invalid input") - return correct - - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - # full_module_name = 'session_info_' + datestr - full_module_name = 'session_info' - - # want to edit this bit for debugging - session_info_path = './' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - if debug_startup or debug_task: - session_info['basename'] = '' - session_info['dir_name'] = "./outputs/" - else: - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - # make data directory and initialize logfile - if not os.path.exists(session_info['dir_name']): - os.makedirs(session_info['dir_name']) - - if debug_startup or debug_task: - session_info['file_basename'] = 'test_debug' - else: - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - log_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '.log') - # if not debugging, stop if log path exists - if debug_startup or debug_task: - pass - elif os.path.exists(log_path): - print(Fore.RED + Style.BRIGHT + 'ERROR: Log file already exists! Exiting now' + Style.RESET_ALL) - quit() - - session_info_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '_session_info.pkl') - mat_path = Path(session_info['dir_name']) / (session_info['file_basename'] + '_session_info.mat') - session_info['log_path'] = str(log_path) - - logger = logging.getLogger(__name__) - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(log_path), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - # query user to confirm current options - options_correct = False - while not options_correct: - options_correct = confirm_options(session_info) - - gui = GUI(session_info=session_info) - # make dummy box and pump objects for testing, all functions should say "pass" - box = behavbox.BehavBox(session_info=session_info) - pump = behavbox.Pump(session_info=session_info) - - ### allow different tasks to be loaded ### - task_type = session_info['task_config'] - if task_type == 'alternating_latent': - from task_protocol.alternating_latent import alternating_latent_model, alternating_latent_presenter - task = alternating_latent_model.AlternateLatent(session_info=session_info) - Presenter = alternating_latent_presenter.AlternatingLatentPresenter - name = 'alternating_latent_task' - elif task_type == 'A_B_task': - pass - elif task_type == 'C1_C2_task': - pass - elif task_type == 'A_B_C1_C2_task': - pass - elif task_type == 'latent_inference_forage': - from task_protocol.latent_inference_forage import latent_inference_forage_model, latent_inference_forage_presenter - task = latent_inference_forage_model.LatentInferenceForageModel(session_info=session_info) - Presenter = latent_inference_forage_presenter.LatentInferenceForagePresenter - name = 'latent_inference_forage_task' - else: - raise RuntimeError('[***] Specified task not recognized!! [***]') - - presenter = Presenter(task=task, - box=box, - pump=pump, - gui=gui, - session_info=session_info) - gui.set_callbacks(presenter=presenter) - - # start session - scipy.io.savemat(mat_path, session_info) - with open(session_info_path, 'wb') as f: - pickle.dump(session_info, f) - - presenter.start_session() - if debug_startup: - pass - else: - # time.sleep(5) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - run = True - presenter.print_controls() - task.start_task() - while run: - if time.time() < t_end: - presenter.run() - else: - run = False - print("Times up, finishing up") - - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - if 'presenter' in locals(): - try: - ic('Calling end_session()') - presenter.end_session() - ic('Call to end_session() was successful') - except: - ic('could not call end_session()') - else: - pass - - # save dicts to disk - ic('Saving files to disk') - scipy.io.savemat(mat_path, session_info) - with open(session_info_path, 'wb') as f: - pickle.dump(session_info, f) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - print(ex) - # save dicts to disk - # scipy.io.savemat(mat_path, {'session_info': session_info}) - scipy.io.savemat(mat_path, session_info) - with open(session_info_path, 'wb') as f: - pickle.dump(session_info, f) - presenter.end_session() - diff --git a/obsolete/behavbox_v2.py b/obsolete/behavbox_v2.py new file mode 100644 index 0000000..5845d25 --- /dev/null +++ b/obsolete/behavbox_v2.py @@ -0,0 +1,413 @@ +# contains the behavior box class, which includes pin numbers and whether DIO pins are +# configured as input or output + +from gpiozero import PWMLED, LED, Button +import os +import socket +import time +from collections import deque + +# from icecream import ic +import pygame +import logging +from colorama import Fore, Style +# import pysistence, collections +from visualstim import VisualStim + +import scipy.io, pickle + +import Treadmill +import ADS1x15 + + +from fake_session_info import fake_session_info + +# for the flipper +from FlipperOutput import FlipperOutput + + +class BehavBox(object): + event_list = ( + deque() + ) # all detected events are added to this queue to be read out by the behavior class + + def __init__(self, session_info): + + logging.info(str(time.time()) + ", behavior_box_initialized") + self.session_info = session_info + + from subprocess import check_output + IP_address = check_output(['hostname', '-I']).decode('ascii')[:-2] + self.IP_address = IP_address + IP_address_video_list = list(IP_address) + IP_address_video_list[-3] = "2" + self.IP_address_video = "".join(IP_address_video_list) + + ############################################################################################### + # below are all the pin numbers for Yi's breakout board + # cue LEDs - setting PWM frequency of 200 Hz + ############################################################################################### + self.cueLED1 = BoxLED(22, frequency=200) + self.cueLED2 = BoxLED(18, frequency=200) + self.cueLED3 = BoxLED(17, frequency=200) + self.cueLED4 = BoxLED(14, frequency=200) + + ############################################################################################### + # digital I/O's - used for cue LED + # cue for animals + # DIO 1 and 2 are reserved for the audio board + ############################################################################################### + # self.DIO3 = LED(9) # reserved for vacuum function + self.DIO4 = LED(10) + self.DIO5 = LED(11) + # there is a DIO6, but that is the same pin as the camera strobe + + ############################################################################################### + # IR detection - for nosepoke + ############################################################################################### + self.IR_rx1 = Button(5, None, True) # None, True inverts the signal so poke=True, no-poke=False + self.IR_rx2 = Button(6, None, True) + self.IR_rx3 = Button(12, None, True) + self.IR_rx4 = Button(13, None, True) # (optional, reserved for future use + self.IR_rx5 = Button(16, None, True) # (optional, reserved for future use + + # link nosepoke event detections to callbacks + self.IR_rx1.when_pressed = self.left_IR_entry + self.IR_rx2.when_pressed = self.center_IR_entry + self.IR_rx3.when_pressed = self.right_IR_entry + self.IR_rx1.when_released = self.left_IR_exit + self.IR_rx2.when_released = self.center_IR_exit + self.IR_rx3.when_released = self.right_IR_exit + + ############################################################################################### + # sound: audio board DIO - pins sending TTL to the Tsunami soundboard via SMA connectors + ############################################################################################### + # pins originally reserved for the lick detection is now used for audio board TTL input signal + self.sound1 = LED(26) # originally lick1 + self.sound2 = LED(27) # originally lick2 + self.sound3 = LED(15) # originally lick3 + + self.sound4 = LED(23) # originally DIO1 + self.sound5 = LED(24) # originally DIO2 + + ############################################################################################### + # flipper strobe signal (previously called camera strobe signal) + ############################################################################################### + # previously: self.camera_strobe = Button(4) + # previously: rising and falling edges are detected and logged in a separate video file + # initiating flipper object + self.flipper = FlipperOutput(self.session_info, pin=4) + + ############################################################################################### + # visual stimuli + ############################################################################################### + try: + self.visualstim = VisualStim(self.session_info) + except Exception as error_message: + print("visualstim issue\n") + print(str(error_message)) + + ############################################################################################### + # TODO: ADC(Adafruit_ADS1x15) + ############################################################################################### + try: + self.ADC = ADS1x15.ADS1015 + except Exception as error_message: + print("ADC issue\n") + print(str(error_message)) + + # ############################################################################################### + # # TODO: treadmill + # ############################################################################################### + try: + self.treadmill = Treadmill.dacval + except Exception as error_message: + print("treadmill issue\n") + print(str(error_message)) + + ############################################################################################### + # Keystroke handler + ############################################################################################### + try: + DISPLAYSURF = pygame.display.set_mode((200, 200)) + pygame.display.set_caption(session_info["box_name"]) + print( + "\nKeystroke handler initiated. In order for keystrokes to register, the pygame window" + ) + print("must be in the foreground. Keys are as follows:\n") + print( + Fore.YELLOW + + " 1: left poke 2: center poke 3: right poke" + ) + print( + " Q: left lick W: center lick E: right lick" + ) + print( + Fore.CYAN + + " Esc: close key capture window\n" + + Style.RESET_ALL + ) + print( + Fore.GREEN + + Style.BRIGHT + + " TO EXIT, CLICK THE MAIN TEXT WINDOW AND PRESS CTRL-C " + + Fore.RED + + "ONCE\n" + + Style.RESET_ALL + ) + + self.keyboard_active = True + except Exception as error_message: + print("pygame issue\n") + print(str(error_message)) + + ############################################################################################### + # check for key presses - uses pygame window to simulate nosepokes and licks + + ############################################################################################### + + def check_keybd(self): + if self.keyboard_active == True: + event = pygame.event.poll() + + KeyDown = 768 # event type numbers + KeyUp = 769 + + if event: + if event.type == KeyDown and event.key == 49: # 1 key + self.left_IR_entry() + elif event.type == KeyUp and event.key == 49: + self.left_IR_exit() + elif event.type == KeyDown and event.key == 50: # 2 key + self.center_IR_entry() + elif event.type == KeyUp and event.key == 50: + self.center_IR_exit() + elif event.type == KeyDown and event.key == 51: # 3 key + self.right_IR_entry() + elif event.type == KeyUp and event.key == 51: + self.right_IR_exit() + elif event.type == KeyDown and event.key == 113: # Q key + self.left_lick_start() + elif event.type == KeyUp and event.key == 113: + self.left_lick_stop() + elif event.type == KeyDown and event.key == 119: # W key + self.center_lick_start() + elif event.type == KeyUp and event.key == 119: + self.center_lick_stop() + elif event.type == KeyDown and event.key == 101: # E key + self.right_lick_start() + elif event.type == KeyUp and event.key == 101: + self.right_lick_stop() + elif event.type == KeyDown and event.key == 27: # escape key + pygame.quit() + self.keyboard_active = False + + ############################################################################################### + # methods to start and stop video + # These work with fake video files but haven't been tested with real ones + ############################################################################################### + def video_start(self): + IP_address_video = self.IP_address_video + dir_name = self.session_info['dir_name'] + basename = self.session_info['basename'] + file_name = dir_name + "/" + basename + # print(Fore.RED + '\nTEST - RED' + Style.RESET_ALL) + + # create directory on the external storage + base_dir = self.session_info['external_storage'] + '/' + hd_dir = base_dir + basename + os.mkdir(hd_dir) + + + # Preview check per Kelly request + print(Fore.YELLOW + "Killing any python process prior to this session!\n" + Style.RESET_ALL) + try: + os.system("ssh pi@" + IP_address_video + " pkill python") + print(Fore.CYAN + "\nStart Previewing ..." + Style.RESET_ALL) + print(Fore.RED + "\n CRTL + C to quit previewing and start recording" + Style.RESET_ALL) + + os.system("ssh pi@" + IP_address_video + " '/home/pi/RPi4_behavior_boxes/start_preview.py'") + # Kill any python process before start recording + print(Fore.GREEN + "\nKilling any python process before start recording!" + Style.RESET_ALL) + + os.system("ssh pi@" + IP_address_video + " pkill python") + time.sleep(2) + + # Prepare the path for recording + os.system("ssh pi@" + IP_address_video + " mkdir " + dir_name) + os.system("ssh pi@" + IP_address_video + " 'date >> ~/video/videolog.log' ") # I/O redirection + tempstr = ( + "ssh pi@" + IP_address_video + " 'nohup /home/pi/RPi4_behavior_boxes/video_acquisition/start_acquisition.py " + + file_name + + " >> ~/video/videolog.log 2>&1 & ' " # file descriptors + ) + # start the flipper before the recording start + # initiate the flipper + try: + self.flipper.flip() + except: + pass + # start recording + print(Fore.GREEN + "\nStart Recording!" + Style.RESET_ALL) + os.system(tempstr) + print( + Fore.RED + Style.BRIGHT + "Please check if the preview screen is on! Cancel the session if it's not!" + Style.RESET_ALL) + + # start initiating the dumping of the session information when available + scipy.io.savemat(hd_dir + "/" + basename + '_session_info.mat', {'session_info': self.session_info}) + print("dumping session_info") + pickle.dump(self.session_info, open(hd_dir + "/" + basename + '_session_info.pkl', "wb")) + + except Exception as e: + print(e) + + def video_stop(self): + # Get the basename from the session information + basename = self.session_info['basename'] + dir_name = self.session_info['dir_name'] + # Get the ip address for the box video: + IP_address_video = self.IP_address_video + try: + # Run the stop_video script in the box video + + os.system( + "ssh pi@" + IP_address_video + " /home/pi/RPi4_behavior_boxes/video_acquisition/stop_acquisition.sh") + time.sleep(2) + # now stop the flipper after the video stopped recording + try: # try to stop the flipper + self.flipper.close() + except: + pass + + time.sleep(2) + + hostname = socket.gethostname() + print("Moving video files from " + hostname + "video to " + hostname + ":") + + # Create a directory for storage on the hard drive mounted on the box behavior + base_dir = self.session_info['external_storage'] + '/' + + hd_dir = base_dir + basename + + scipy.io.savemat(hd_dir + "/" + basename + '_session_info.mat', {'session_info': self.session_info}) + print("dumping session_info") + pickle.dump(self.session_info, open(hd_dir + "/" + basename + '_session_info.pkl', "wb")) + + # Move the video + log from the box_video SD card to the box_behavior external hard drive + os.system( + "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":" + dir_name + "/ " + + hd_dir + ) + os.system( + "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":~/video/*.log " + + hd_dir + ) + print("rsync finished!") + + except Exception as e: + print(e) + + def left_IR_entry(self): + self.event_list.append("left_IR_entry") + self.cueLED1.blink(0.3,0.1,1) + logging.info(str(time.time()) + ", left_IR_entry") + + def center_IR_entry(self): + self.event_list.append("center_IR_entry") + self.cueLED2.blink(0.3, 0.1, 1) + logging.info(str(time.time()) + ", center_IR_entry") + + def right_IR_entry(self): + self.event_list.append("right_IR_entry") + self.cueLED3.blink(0.3, 0.1, 1) + logging.info(str(time.time()) + ", right_IR_entry") + + def left_IR_exit(self): + self.event_list.append("left_IR_exit") + logging.info(str(time.time()) + ", left_IR_exit") + + def center_IR_exit(self): + self.event_list.append("center_IR_exit") + logging.info(str(time.time()) + ", center_IR_exit") + + def right_IR_exit(self): + self.event_list.append("right_IR_exit") + logging.info(str(time.time()) + ", right_IR_exit") + + def left_lick_start(self): + self.event_list.append("left_lick_start") + logging.info(str(time.time()) + ", left_lick_start") + + def center_lick_start(self): + self.event_list.append("center_lick_start") + logging.info(str(time.time()) + ", center_lick_start") + + def right_lick_start(self): + self.event_list.append("right_lick_start") + logging.info(str(time.time()) + ", right_lick_start") + + def left_lick_stop(self): + self.event_list.append("left_lick_stop") + logging.info(str(time.time()) + ", left_lick_stop") + + def center_lick_stop(self): + self.event_list.append("center_lick_stop") + logging.info(str(time.time()) + ", center_lick_stop") + + def right_lick_stop(self): + self.event_list.append("right_lick_stop") + logging.info(str(time.time()) + ", right_lick_stop") + + +# this is for the cue LEDs. BoxLED.value is the intensity value (PWM duty cycle, from 0 to 1) +# currently. BoxLED.set_value is the saved intensity value that determines how bright the +# LED will be if BoxLED.on() is called. This is better than the original PWMLED class. +class BoxLED(PWMLED): + set_value = 1 # the intensity value, ranging from 0-1 + + def on( + self, + ): # unlike PWMLED, here the on() function sets the intensity to set_value, + # not to full intensity + self.value = self.set_value + + +class Pump(object): + def __init__(self): + + ############################################################################################### + # syringe pumps + ############################################################################################### + self.pump1 = LED(19) # for testing only - the correct pin number is 19 + self.pump2 = LED(20) + self.pump3 = LED(21) + self.pump4 = LED(8) + self.pump5 = LED(7) + self.pump_en = LED(25) # pump enable + + def reward(self, which_pump, reward_size): + print("TODO: calibrate and test syringe pump code in BehavBox.reward()") + diameter_mm = 12.06 # for 5 mL syringe + # diameter_mm = 14.5 # for 10 mL syringe + volPerRevolution_uL = ( + 0.8 * (diameter_mm / 2) * (diameter_mm / 2) * 3.1415926535898 + ) # thread is 0.8 mm per turn + howManyRevolutions = reward_size / volPerRevolution_uL + # // determine total steps needed to reach desired revolutions, @200 steps/revolution + # // use *4 as a multiplier because it's operating at 1/4 microstep mode. + # // round to nearest int + totalSteps = round(200 * howManyRevolutions * 4) + reward_duration = 1 # delivery reward over 300 ms + cycle_length = ( + reward_duration / totalSteps + ) # need to know what the minimum value can be + + if which_pump == "left": + self.pump1.blink(cycle_length * 0.1, cycle_length * 0.9, totalSteps) + logging.info(str(time.time()) + ", left_reward," + str(reward_size)) + elif which_pump == "center": + self.pump2.blink(cycle_length * 0.1, cycle_length * 0.9, totalSteps) + logging.info(str(time.time()) + ", center_reward," + str(reward_size)) + elif which_pump == "right": + logging.info(str(time.time()) + ", right_reward," + str(reward_size)) + self.pump3.blink(cycle_length * 0.1, cycle_length * 0.9, totalSteps) diff --git a/obsolete/fake_session_info.py b/obsolete/fake_session_info.py new file mode 100755 index 0000000..e11d052 --- /dev/null +++ b/obsolete/fake_session_info.py @@ -0,0 +1,43 @@ +# put all of your mouse and session info in here + +from datetime import datetime +import os +import pysistence, collections +import socket + + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test_pump', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +fake_session_info = collections.OrderedDict() +fake_session_info['mouse_info'] = mouse_info +fake_session_info['mouse_name'] = mouse_info['mouse_name'] +#fake_session_info['trainingPhase'] = 4 +fake_session_info['basedir'] = '/home/pi/buffer' +fake_session_info['external_storage'] = '/mnt/hd' +# fake_session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +#fake_session_info['basedir'] = '/home/pi/video' +fake_session_info['weight'] = 32.18 +fake_session_info['manual_date'] = '2021-09-14' +fake_session_info['box_name'] = socket.gethostname() + +# fake_session_info['config'] = 'freely_moving_v1' +fake_session_info['config'] = 'head_fixed_v1' + +# behavior parameters +fake_session_info['timeout_length'] = 5 # in seconds +fake_session_info['reward_size'] = 10 # in microliters + +# visual stimulus +fake_session_info['visual_stimulus'] = False +fake_session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +fake_session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.dat', + '/home/pi/gratings/second_grating.dat'] +fake_session_info['vis_raws'] = [] + +# treadmill +fake_session_info['treadmill'] = False diff --git a/obsolete/headfixed2FC_task_old.py b/obsolete/headfixed2FC_task_old.py new file mode 100644 index 0000000..996b29b --- /dev/null +++ b/obsolete/headfixed2FC_task_old.py @@ -0,0 +1,461 @@ +# python3: headfixed_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training task structure +description: + an updated test version of headfixed_task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class Headfixed2FCTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = False + self.multiple_choice_error = False + self.error_repeat = False + self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + + self.block_count = 0 + self.blocknumber = self.session_info["block_number"] + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + self.correct_trial_in_block = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + # print("beeeeeeep") # debug signal + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + # if self.LED_blink: + # self.box.cueLED1.blink(0.2, 0.1) + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + if not self.reward_times_up: + if self.reward_time_start: + if time.time() >= self.reward_time_start + self.reward_time: + self.restart() + # first detect the lick signal: + cue_state = self.current_card[0] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + if cue_state == 'all': + side_choice = side_mice + if side_choice == 'left': + left_reward = self.session_info['reward_size'][self.current_card[2][0]] + reward_size = random.uniform(left_reward - self.session_info['reward_deviation'], + left_reward + self.session_info['reward_deviation']) + pump_num = self.current_card[3][0] + elif side_choice == 'right': + right_reward = self.session_info['reward_size'][self.current_card[2][1]] + reward_size = random.uniform(right_reward - self.session_info['reward_deviation'], + right_reward + self.session_info['reward_deviation']) + pump_num = self.current_card[3][1] + else: + side_choice = self.current_card[1] + forced_reward = self.session_info['reward_size'][self.current_card[2]] + reward_size = random.uniform(forced_reward - self.session_info['reward_deviation'], + forced_reward + self.session_info['reward_deviation']) + pump_num = self.current_card[3] + if side_mice == side_choice: # if the animal chose correctly + print("Number of lick detected: " + str(self.lick_count)) + if self.lick_count == 0: # if this is the first lick + self.pump.reward(pump_num, reward_size) + self.total_reward += 1 + self.correct_trial_in_block += 1 + self.reward_time_start = time.time() + print("Reward time start" + str(self.reward_time_start)) + self.lick_count += 1 + elif self.side_mice_buffer: + if self.lick_count == 0: + self.check_cue('sound2') + self.wrong_choice_error = True + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + self.early_lick_error = False + self.lick_count = 0 + self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + self.cue_off('sound1') + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") + self.cue_off(self.current_card[0]) + self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + self.reward_times_up = True + self.pump.reward("vaccum", 0) + if self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('wrong_choice_error') + self.wrong_choice_error = False + elif self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('no_choice_error') + else: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.error_list.append('correct_trial') + self.lick_count = 0 + self.reward_time_start = None + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1, 0.1, 1) + elif cue == 'LED_L': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) + elif cue == 'LED_R': + # self.LED_blink = True + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) + elif cue == 'all': + self.box.cueLED1.on() + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.cueLED1.off() + self.box.cueLED2.off() + elif cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'LED_L': + self.box.cueLED1.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() diff --git a/obsolete/headfixed_task_old.py b/obsolete/headfixed_task_old.py new file mode 100644 index 0000000..aef3183 --- /dev/null +++ b/obsolete/headfixed_task_old.py @@ -0,0 +1,454 @@ +# python3: headfixed_task.py +""" +author: tian qiu +date: 2022-07-29 +name: headfixed_task.py +goal: model_based reinforcement learning behavioral training task structure +description: + an updated test version of soyoun_task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class HeadfixedTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], # format: ['trigger', 'origin', 'destination'] + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = False + self.multiple_choice_error = False + self.error_repeat = False + self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_buffer = None + self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + # print("beeeeeeep") # debug signal + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + # if self.LED_blink: + # self.box.cueLED1.blink(0.2, 0.1) + self.distance_diff = self.get_distance() - self.distance_buffer + distance_condition = self.current_card[1] + distance_required = self.session_info['treadmill_setup'][distance_condition] + if self.distance_diff >= distance_required: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + if not self.reward_times_up: + if self.reward_time_start: + if time.time() >= self.reward_time_start + self.reward_time: + self.restart() + # first detect the lick signal: + cue_state = self.current_card[0] + # side_choice = self.current_card[2] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + if cue_state == 'sound+LED': + side_choice = side_mice + if side_choice == 'left': + reward_size = self.current_card[3][0] + pump_num = self.current_card[4][0] + elif side_choice == 'right': + reward_size = self.current_card[3][1] + pump_num = self.current_card[4][1] + else: + side_choice = self.current_card[2] + reward_size = self.current_card[3] + pump_num = self.current_card[4] + if side_mice == side_choice: # if the animal chose correctly + print("Number of lick detected: " + str(self.lick_count)) + if self.lick_count == 0: # if this is the first lick + # self.side_mice_buffer = side_mice + self.pump.reward(pump_num, self.session_info["reward_size"][reward_size]) + self.total_reward += 1 + self.reward_time_start = time.time() + print("Reward time start" + str(self.reward_time_start)) + self.lick_count += 1 + + elif self.side_mice_buffer: + if self.lick_count == 0: # multiple choice error + # self.reward_error = True + self.wrong_choice_error = True + self.restart() + else: # wrong side - wrong_choice error + # self.reward_error = True + self.multiple_choice_error = True + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + self.early_lick_error = False + self.lick_count = 0 + self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if self.cue_state_error: + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") + self.cue_off(self.current_card[0]) + self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + self.reward_times_up = True + self.pump.reward("vaccum", 0) + if self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('wrong_choice_error') + self.wrong_choice_error = False + elif self.multiple_choice_error: + logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) + self.error_repeat = False + self.error_list.append('multiple_choice_error') + self.multiple_choice_error = False + elif self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('no_choice_error') + else: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.error_list.append('correct_trial') + self.lick_count = 0 + self.reward_time_start = None + + def check_cue(self, cue): + if cue == 'sound': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + elif cue == 'LED': + self.box.cueLED1.blink(0.2, 0.1) + logging.info(";" + str(time.time()) + ";[cue];cueLED1_on;" + str(self.error_repeat)) + else: + # self.LED_blink = True + self.box.cueLED1.blink(0.2, 0.1) + self.box.sound1.on() + logging.info(";" + str(time.time()) + ";[cue];LED_sound_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'sound': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + pass + elif cue == 'LED': + self.box.cueLED1.off() + self.LED_blink = False + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + else: + self.box.cueLED1.off() + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];LED_sound_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() diff --git a/obsolete/lick_task.py b/obsolete/lick_task.py new file mode 100644 index 0000000..4f69474 --- /dev/null +++ b/obsolete/lick_task.py @@ -0,0 +1,182 @@ +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class LickTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + Timeout( + name="cue", + on_enter=["enter_cue"], + on_exit=["exit_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_start", "standby", "reward_available"], + ["active_poke", "reward_available", "cue"], + ["timeup", "cue", "standby"], + ] + + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + # self.box.sound1.blink(0.5, 0.1, 1) + # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + # self.box.cueLED4.on() + # self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + reward_size = "small" + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + self.pump.reward("1", self.session_info["reward_size"][reward_size]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + self.pump.reward("2", self.session_info["reward_size"][reward_size]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() + # self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/obsolete/pump_task.py b/obsolete/pump_task.py new file mode 100755 index 0000000..7364902 --- /dev/null +++ b/obsolete/pump_task.py @@ -0,0 +1,171 @@ +# pump_task +# a task file for testing the pump object code +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox +from behavbox import Pump + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + +class PumpTask(object): + def __init__(self, **kwargs): + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + Timeout( + name="cue", + on_enter=["enter_cue"], + on_exit=["exit_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_start", "standby", "reward_available"], + ["active_poke", "reward_available", "cue"], + ["timeup", "cue", "standby"], + ] + + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = behavbox.Pump(LED) + ######################################################################## + # functions called when state transitions occur + ######################################################################## + + def enter_standby(self): + print("entering standby") + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + self.box.cueLED1.on() + self.box.visualstim.show_grating("first_grating.grat") + + def exit_cue(self): + print("stop cue") + self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + if event_name == "left_poke_entry": + self.active_poke() # triggers state transition + + elif self.state == "cue": + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() diff --git a/obsolete/record_run_test.py b/obsolete/record_run_test.py new file mode 100755 index 0000000..d07690c --- /dev/null +++ b/obsolete/record_run_test.py @@ -0,0 +1,49 @@ +from fake_session_info import fake_session_info +import socket +import os +import time + +session_info = fake_session_info +# Get the ip address for SSH into different behavioral box +IP_address = socket.gethostbyname(socket.gethostname() + ".local") +IP_address_video_list = list(IP_address) +IP_address_video_list[-3] = "2" +IP_address_video = "".join(IP_address_video_list) + +# def video_start + + +dir_name = session_info['dir_name'] +os.system("ssh pi@" + IP_address_video + " mkdir " + dir_name) +os.system("ssh pi@" + IP_address_video + " 'date >> ~/videolog.log' ") # I/O redirection +tempstr = ( + "ssh pi@" + IP_address_video + " 'nohup /home/pi/RPi4_behavior_boxes/record_video_test.py " + + session_info["basename"] + + " >> " + session_info['dir_name'] + "/" + session_info['basename'] + ".log 2>&1 & ' " # file descriptors +) + +#start recording +os.system(tempstr) + +#delay +time.sleep(10) + +os.system("ssh pi@" + IP_address_video + " /home/pi/RPi4_behavior_boxes/stop_video_test") +time.sleep(2) +hostname = socket.gethostname() +print("Moving video files from " + hostname + "video to " + hostname + ":") + +# base_dir = '/mnt/hd/' +# path = os.path.join(base_dir, session_info['basename']) +# +# # Move the video from the box_video SD card to the box_behavior external hard drive +# os.system( +# "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":" + session_info['dir_name'] + "/*.h264 " # this could be a problem .avi +# + path +# ) +# +# # Move the video log from the box_video SD card to the box_behavior external hard drive +# os.system( +# "rsync -av --progress --remove-source-files pi@" + IP_address_video + ":" + session_info["dir_name"] + "/*.log " +# + path +# ) \ No newline at end of file diff --git a/obsolete/run_flip_task.py b/obsolete/run_flip_task.py new file mode 100755 index 0000000..7e56b5d --- /dev/null +++ b/obsolete/run_flip_task.py @@ -0,0 +1,27 @@ +from FlipperOutput import FlipperOutput +from fake_session_info import fake_session_info +from time import sleep +import sys + +# def signal_handler(signum): +# print("SIGINT detected") +# FlipperOutput.close() +# print('Closing the output.') +# sys.exit(0) +# +# signal.signal(signal.SIGINT, signal_handler) + +with FlipperOutput(fake_session_info, pin=4) as flip_box: + try: + flip_box.flip() + sleep(30) + flip_box.close() + except KeyboardInterrupt: + print("try to interrupt") + flip_box.close() + print("Closing the output.") + except Exception as e: + print("Exception!") + flip_box.close() + print("Closing the output.") + print(e) diff --git a/obsolete/run_headfixed2FC_task.py b/obsolete/run_headfixed2FC_task.py new file mode 100644 index 0000000..d6799a3 --- /dev/null +++ b/obsolete/run_headfixed2FC_task.py @@ -0,0 +1,182 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed2FC_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: run_headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training run task file +description: + an updated test version of run_headfixed_task.py + +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed2FC_task import Headfixed2FCTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/headfixed2FC_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_headfixed2FC import TaskInformation + + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + + task = Headfixed2FCTask(name="headfixed2FC_task", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) ## wll add in the session info + t_end = time.time() + 60 * t_minute + block_count = 0 ## can be replaced with task.block_count + while time.time() < t_end: + if block_count==0: + block_number = session_info["block_number"] #random.randint(1, session_info["block_variety"]) + block_count = block_count + 1 + else: + block_number = 3-block_number # it's either or 1 or 2 + block_count = block_count+1 + #task.block_number = block_number + + #if ((block_number != 1 ) || (block_number != 2) ): + # print('check_block number!!!!') + # block_number = 1 + task.correct_trial_in_block = 0 + while task.correct_trial_in_block <= session_info['block_duration']: # while total correct trial is not fullfilled + if time.time() >= t_end: + print("Times up, finishing up") + break + first_card = True + task.error_count = 0 + print("Trial " + str(task.trial_number) + " \n") + task.trial_number += 1 + print("*******************************\n") + task.current_card = task_information.draw_card(block_number, session_info['phase']) + logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) + print("Block " + str(block_number) + + " - Current card condition: \n" + + "*******************************\n" + + "*Cue: " + str(task.current_card[0]) + "\n" + + "*Choice: " + str(task.current_card[1]) + "\n" + + "*Reward: " + str(task.current_card[2]) + "\n") + while first_card or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ + "error_max"]): + if time.time() >= t_end: + print("Times up, finishing up") + break + if task.error_repeat: + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("*error_repeat trial* \n" + "Block " + str(block_number) + + " - Current card condition: \n" + + "*******************************\n" + + "*Cue: " + str(task.current_card[0]) + "\n" + + #"*State: " + str(task.current_card[1]) + "\n" + + "*Choice: " + str(task.current_card[1]) + "\n" + + "*Reward: " + str(task.current_card[2]) + "\n") + task.trial_number += 1 + first_card = False + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() diff --git a/obsolete/run_headfixed_task.py b/obsolete/run_headfixed_task.py new file mode 100644 index 0000000..e128c38 --- /dev/null +++ b/obsolete/run_headfixed_task.py @@ -0,0 +1,172 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed_task.py +""" +author: tian qiu +date: 2022-03-16 +name: run_headfixed_task.py +goal: model_based reinforcement learning behavioral training run task file +description: + an updated test version of run_soyoun_task.py + +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed_task import HeadfixedTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/headfixed_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_headfixed import TaskInformation + + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + + task = HeadfixedTask(name="headfixed_task", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + while time.time() < t_end: + block_number = random.randint(1, session_info["block_variety"]) + for block in range(session_info["block_duration"]): + if time.time() >= t_end: + print("Times up, finishing up") + break + first_card = True + task.error_count = 0 + print("Trial " + str(block) + " \n") + task.trial_number += 1 + print("*******************************\n") + task.current_card = task_information.draw_card(block_number, session_info['phase']) + logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_card)) + print("Block " + str(block_number) + + " - Current card condition: \n" + + "*******************************\n" + + "*Cue: " + str(task.current_card[0]) + "\n" + + "*State: " + str(task.current_card[1]) + "\n" + + "*Choice: " + str(task.current_card[2]) + "\n" + + "*Reward: " + str(task.current_card[3]) + "\n") + while first_card or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ + "error_max"]): + if time.time() >= t_end: + print("Times up, finishing up") + break + if task.error_repeat: + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("*error_repeat trial* \n" + "Block " + str(block_number) + + " - Current card condition: \n" + + "*******************************\n" + + "*Cue: " + str(task.current_card[0]) + "\n" + + "*State: " + str(task.current_card[1]) + "\n" + + "*Choice: " + str(task.current_card[2]) + "\n" + + "*Reward: " + str(task.current_card[3]) + "\n") + task.trial_number += 1 + first_card = False + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() diff --git a/obsolete/run_lick_task.py b/obsolete/run_lick_task.py new file mode 100644 index 0000000..2900780 --- /dev/null +++ b/obsolete/run_lick_task.py @@ -0,0 +1,131 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from lick_task import LickTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + task_info_path = '/home/pi/experiment_info/headfixed_task/session_info' + sys.path.insert(0, task_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + # initiate task object\ + task = LickTask(name="head_fxied_lick", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + sleep(10) + # loop over trials + t_minute = int(input("Enter the time in minutes: ")) + # t_minute = 20 + t_end = time.time() + 60 * t_minute + duration_buffer = 10 + + while time.time() < t_end: + logging.info(str("##############################\n" + + str(time.time())) + ", starting_trial" + + str("\n##############################")) + + task.trial_start() + + while task.trial_running: + task.run() + + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + pygame.quit() + + +# # exit because of error +# except (RuntimeError) as ex: +# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) +# # save dicts to disk +# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) +# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + + + + diff --git a/obsolete/run_season_task.py b/obsolete/run_season_task.py new file mode 100644 index 0000000..046b338 --- /dev/null +++ b/obsolete/run_season_task.py @@ -0,0 +1,125 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from kelly_task import KellyTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + task_info_path = '/home/pi/experiment_info/kelly_task/session_info' + sys.path.insert(0, task_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info['datetime'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + + # make data directory and initialize logfile + os.makedirs( session_info['dir_name'] ) + os.chdir( session_info['dir_name'] ) + session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + # initiate task object\ + task = KellyTask(name="fentanyl_task", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + sleep(10) + + # loop over trials + for i in range(1000): + logging.info(str("##############################\n" + + str(time.time())) + ", starting_trial, " + str(i) + + str("\n##############################")) + + task.trial_start() + + while task.trial_running: + task.run() + + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + pygame.quit() + + +# # exit because of error +# except (RuntimeError) as ex: +# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) +# # save dicts to disk +# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) +# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + + + + diff --git a/obsolete/run_soyoun_task.py b/obsolete/run_soyoun_task.py new file mode 100644 index 0000000..0168df5 --- /dev/null +++ b/obsolete/run_soyoun_task.py @@ -0,0 +1,137 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import threading +import sys +import time +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style + +from time import sleep + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from soyoun_task import SoyounTask + + +def _terminate(): + print('terminating the session') + sys.exit() + + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + session_info_path = '/home/pi/experiment_info/headfixed_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + # initiate task object\ + try: + logging.info(str(time.time()) + ", trying to retrieve task_information from the ~/experiment_info/*") + full_module_name = 'task_information_headfixed' + import sys + + task_info_path = '/home/pi/experiment_info/headfixed_task/task_information/' + sys.path.insert(0, task_info_path) + tempmod = importlib.import_module(full_module_name) + task_information = tempmod.task_information + except: + logging.info(str(time.time()) + ", failed to retrieve task_information from the default path.\n" + + "Now, try to load the task_information from the local directory ...") + from task_information_phase_1 import task_information + + # self.task_information = task_information + task = SoyounTask(name="headfixed_task", session_info=session_info, task_information=task_information) + + # def run_soyoun_task(): + session_length = int(input("Enter the duration of session (in seconds): ")) + terminate_timer = threading.Timer(session_length, _terminate) + while True: + terminate_timer.start() + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + + block_deck = task.generate_deck(current_block, block_duration, consecutive control) + + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# # exit because of error +# except (RuntimeError) as ex: +# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) +# # save dicts to disk +# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) +# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) diff --git a/obsolete/run_visualization_task.py b/obsolete/run_visualization_task.py new file mode 100644 index 0000000..764e933 --- /dev/null +++ b/obsolete/run_visualization_task.py @@ -0,0 +1,129 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from visualization_task import VisualizationTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + # datestr = datetime.now().strftime("%Y-%m-%d") + # timestr = datetime.now().strftime('%H%M%S') + # full_module_name = 'session_info_' + datestr + # import sys + # task_info_path = '/home/pi/experiment_info/kelly_task/session_info' + # sys.path.insert(0, task_info_path) + # tempmod = importlib.import_module(full_module_name) + # session_info = tempmod.session_info + # mouse_info = tempmod.mouse_info + # + # session_info['date'] = datestr + # session_info['time'] = timestr + # session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + # session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + # session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + # if session_info['manual_date'] != session_info['date']: # check if file is updated + # print('wrong date!!') + # raise RuntimeError('manual_date field in session_info file is not updated') + # + # + # # make data directory and initialize logfile + # os.makedirs(session_info['dir_name']) + # os.chdir(session_info['dir_name']) + # session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + # # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] + # logging.basicConfig( + # level=logging.INFO, + # format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + # datefmt=('%H:%M:%S'), + # handlers=[ + # logging.FileHandler(session_info['file_basename'] + '.log'), + # logging.StreamHandler() # sends copy of log output to screen + # ] + # ) + + # initiate task object + from fake_session_info import fake_session_info + + session_info = fake_session_info + task = VisualizationTask(name="visualization_task", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # # start session + # task.start_session() + # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + # pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + # sleep(10) + # loop over trials + for i in range(2): + logging.info(str("##############################\n" + + str(time.time())) + ", starting_trial, " + str(i) + + str("\n##############################")) + + task.trial_start() + + while task.trial_running: + task.run() + + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + pygame.quit() + + +# # exit because of error +# except (RuntimeError) as ex: +# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) +# # save dicts to disk +# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) +# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + + + + diff --git a/task_protocol/to_be_refactored/run_A_B_C1_C2_task.py b/obsolete/run_walk_task.py similarity index 62% rename from task_protocol/to_be_refactored/run_A_B_C1_C2_task.py rename to obsolete/run_walk_task.py index 1474651..a56a2f7 100644 --- a/task_protocol/to_be_refactored/run_A_B_C1_C2_task.py +++ b/obsolete/run_walk_task.py @@ -1,15 +1,15 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: +#run_self_admin.task #!/usr/bin/env -S ipython3 -i - +# run_self_admin_task.py """ -author: Mitch Farrell -date: 2023-06-12 -name: run_A_B_C1_C2_task.py -goal: running the A_B_C1_C2task +author: tian qiu +date: 2023-01-25 +name: run_walk_task.py +goal: a simplified headfixed task +description: + adapted from Mitch's run_self_admin_task.py + """ import random from transitions import Machine @@ -47,7 +47,7 @@ ipython.magic("xmode Verbose") # import your task class here -from A_B_C1_C2_task import A_B_C1_C2_task +from walk_task import WalkTask try: # load in session_info file, check that dates are correct, put in automatic @@ -58,7 +58,7 @@ full_module_name = 'session_info_' + datestr import sys - session_info_path = '/home/pi/experiment_info/A_B_C1_C2_task/session_info/' + session_info_path = '/home/pi/experiment_info/walk_task/session_info' sys.path.insert(0, session_info_path) tempmod = importlib.import_module(full_module_name) session_info = tempmod.session_info @@ -89,7 +89,11 @@ ] ) - task = A_B_C1_C2_task(name="A_B_C1_C2_task", session_info=session_info) + + task = WalkTask(name="walk_task", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 # start session task.start_session() @@ -101,16 +105,42 @@ t_minute = int(input("Enter the time in minutes: ")) t_end = time.time() + 60 * t_minute - i = True #running this while loop until break encountered - task.start_trial_logic() #shifts state from standby to Context B - while i: #change this to a while loop to run through repeatedly, but maintain the original while loop for running the trial - if time.time() >= t_end: - i = False - print("Times up, finishing up") - task.end_task() - break - while task.trial_running: #trial running in both standby and reward_available - task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + while time.time() < t_end: + # session_info["block_duration"] indicate how many successful trials + # does it take to the session to finish + # first_card = True + task.innocent = True + task.error_count = 0 + random_cue = random.randint(0,1) + if random_cue: + task.current_cue = "left" + else: + task.current_cue = "right" + + print("*******************************\n") + print("Trial " + str(task.trial_number) + "; Side" + task.current_cue + "\n") + task.trial_number += 1 + print("*******************************\n") + + logging.info(";" + str(time.time()) + ";[condition];" + str(task.current_cue) + "_LED") + while task.innocent or (session_info["error_repeat"] and task.error_repeat and task.error_count < session_info[ + "error_max"]): + if time.time() >= t_end: + print("Times up, finishing up") + break + if task.innocent: + task.innocent = False + if task.error_repeat: + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + task.trial_number += 1 + # first_card = False + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) raise SystemExit # graceful exit @@ -131,4 +161,3 @@ scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) task.end_session() - diff --git a/obsolete/session_info_headfixed.py b/obsolete/session_info_headfixed.py new file mode 100644 index 0000000..9ef907c --- /dev/null +++ b/obsolete/session_info_headfixed.py @@ -0,0 +1,89 @@ +# session_info_headfixed.py + +# put all of your mouse and session info in here + +from datetime import datetime +import os +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +#session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 32.18 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +# session_info['config'] = 'freely_moving_v1' +session_info['config'] = 'head_fixed_v1' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 2 +# visual stimulus +session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', +# '/home/pi/second_grating.dat'] +# session_info['vis_raws'] = [] + +# task related information + +session_info['config'] = 'headfixed_soyoun' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +session_info['phase'] = 1 + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 1 # cm + session_info['treadmill_setup']['distance_short'] = 3 # cm + session_info['treadmill_setup']['distance_long'] = 5 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['sound', 'LED', 'sound+LED'] +session_info['state'] = ['distance_short', 'distance_long'] # treadmill distance +session_info['choice'] = ['right', 'left'] # lick port +session_info['reward'] = ['small', 'large'] # reward size +session_info['reward_size'] = {'small': 5, 'large': 10} + +if session_info['phase'] == 1: + session_info['reward_size'] = {'small': 20, 'large': 20} + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['reward_timeout'] = 60 +session_info["punishment_timeout"] = 1 + +# define block_duration and initial block to start the session +session_info['block_duration'] = 5 # each block has this amount of repetition +session_info['block_variety'] = 2 +if session_info['block_variety'] > 1: + session_info['initial_block'] = 1 + +# # allowing user defined initial_block and initial setup for conditions? +# task_information["initial_block"] = 1 +# +# allowing consecutive repeated trial? +session_info['consecutive_control'] = True +if session_info['consecutive_control']: + session_info['consecutive_max'] = 3 \ No newline at end of file diff --git a/obsolete/session_info_headfixed2FC.py b/obsolete/session_info_headfixed2FC.py new file mode 100644 index 0000000..8136923 --- /dev/null +++ b/obsolete/session_info_headfixed2FC.py @@ -0,0 +1,88 @@ +# put all of your mouse and session info in here + +from datetime import datetime +import os +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 0.0 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() +session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts + +session_info['config'] = 'headfixed2FC' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 1 +# visual stimulus +session_info["visual_stimulus"] = False + +session_info['config'] = 'headfixed2FC' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +session_info['phase'] = 'forced_choice' + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_cue'] = 5 # cm + session_info['treadmill_setup']['distance_initiation'] = 10 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['LED_L', 'LED_R', 'all'] +# session_info['state'] = ['block1', 'block2'] # +session_info['choice'] = ['right', 'left'] # lick port +session_info['reward'] = ['small', 'large'] # reward size +session_info['reward_size'] = {'small': 5, 'large': 10} +session_info['reward_deviation'] = 1 + +if session_info['phase'] == 1: + session_info['reward_size'] = {'small': 10, 'large': 10} + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['reward_timeout'] = 60 +session_info["punishment_timeout"] = 3 + +# define block_duration and initial block to start the session +session_info['block_duration'] = 30 # each block has this amount of repetition +session_info['block_variety'] = 2 +if session_info['block_variety'] > 1: + session_info['initial_block'] = 1 + +session_info['consecutive_control'] = False +if session_info['consecutive_control']: + session_info['consecutive_max'] = 3 + +session_info["calibration_coefficient"] = {} + +session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first +session_info["calibration_coefficient"]['2'] = [0.13, 0] +session_info["calibration_coefficient"]['3'] = [0.13, 0.0] +session_info["calibration_coefficient"]['4'] = [0.13, 0.0] + +session_info['air_duration'] = 0 +session_info["vacuum_duration"] = 1 +session_info["key_reward_amount"] = 5 \ No newline at end of file diff --git a/obsolete/session_info_walk.py b/obsolete/session_info_walk.py new file mode 100644 index 0000000..6078166 --- /dev/null +++ b/obsolete/session_info_walk.py @@ -0,0 +1,64 @@ +# session_info_walk.py + +# put all of your mouse and session info in here + +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' + +session_info['weight'] = 32.18 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +# session_info['config'] = 'freely_moving_v1' +session_info['config'] = 'head_fixed_walk' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 2 +# visual stimulus +session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', +# '/home/pi/second_grating.dat'] +# session_info['vis_raws'] = [] + +# task related information + +session_info['config'] = 'headfixed_walk' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 10 # cm + session_info['treadmill_setup']['distance_cue'] = 25 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['sound', 'LED', 'sound+LED'] +session_info['reward_size'] = 5 + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['reward_timeout'] = 60 +session_info["punishment_timeout"] = 1 diff --git a/obsolete/soyoun_task.py b/obsolete/soyoun_task.py new file mode 100644 index 0000000..ec0d395 --- /dev/null +++ b/obsolete/soyoun_task.py @@ -0,0 +1,327 @@ +# python3: soyoun_task.py +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class SoyounTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and task_information should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + if kwargs.get("task_information", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no task_information supplied; making fake one" + + Style.RESET_ALL + ) + from task_information_phase_1 import task_information + + self.task_information = task_information + else: + self.task_information = kwargs.get("task_information", None) + ic(self.task_information) + + self.error_repeat = self.task_information['error_repeat'] + self.error_count_max = self.task_information['error_repeat_max'] + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name='draw', + on_enter=["enter_draw"], + on_exit=["exit_draw"], + timeout=0, + on_timeout=["play_game"] + ), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.task_information["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.task_information["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.task_information["reward_timeout"] + + self.task_information["reward_wait"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'draw'], # format: ['trigger', 'origin', 'destination'] + ['play_game', 'draw', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.session_length = len(self.task_information["block_list"]) + self.trial_running = False + self.restart_flag = False + # self.restart_flag_inter = False + + self.trial_number = 0 + self.error_count = 0 + self.card_count = -1 + self.deck = self.task_information["deck"] + self.current_card = None + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = behavbox.Pump() + self.treadmill = self.box.treadmill + self.distance_initiation = self.task_information['treadmill_setup']['distance_initiation'] + self.distance_buffer = self.treadmill.distance_cm + self.distance_diff = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + if self.state == "standby": + pass + elif self.state == "draw": + self.play_game() + # elif self.restart_flag: + # self.restart() + elif self.state == "initiate": + if self.distance_buffer: + self.distance_diff = self.treadmill.distance_cm - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.distance_buffer = self.treadmill.distance_cm + self.distance_diff = 0 + self.start_cue() + else: + self.error_count += 1 + + elif self.state == "cue_state": + if self.distance_buffer: + self.distance_diff = self.treadmill.distance_cm - self.distance_buffer + distance_required = self.task_information['treadmill_setup'][ + self.task_information["state"][self.current_card[1]]] + if self.distance_diff >= distance_required: + self.distance_buffer = self.treadmill.distance_cm + self.distance_diff = 0 + self.evaluate_reward() + else: + self.error_count += 1 + self.restart_flag = True + # logging.info(str(time.time()) + ", " + str( + # self.trial_number) + ", treadmill state distance did not pass") + + elif self.state == "reward_available": + # first detect the lick signal: + cue_state = self.current_card[0] + side_choice = self.task_information['choice'][self.current_card[2]] + # question: do we want entry mark as lick? + side_mice = None + if event_name == "left_IR_entry": + side_mice = 'left' + elif event_name == "right_IR_entry": + side_mice = 'right' + if side_mice: + reward_size = self.task_information['reward'][self.current_card[3]] + if cue_state == 2: + self.pump.reward(side_mice, self.task_information["reward_size"][reward_size]) + elif side_choice == side_mice: + if side_mice == 'left': + reward_side = '1' + elif side_mice == 'right': + reward_side = '2' + # reward_size = self.task_information['reward'][self.current_card[3]] + self.pump.reward(reward_side, self.task_information["reward_size"][reward_size]) + else: + self.error_count += 1 + self.restart_flag = True + self.restart() + else: + self.error_count += 1 + self.restart_flag = True + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering standby, prepare to start the trial...") + self.trial_running = False + # if self.restart_flag: + # time.sleep(self.task_information["punishment_timeout"]) + # pass + time.sleep(self.task_information["reward_wait"]) + + def exit_standby(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting standby") + self.trial_number += 1 + pass + + def enter_draw(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering draw") + if self.card_count >= self.session_length: + self.trial_running = False # terminate the state machine, end the session + elif self.error_repeat and (self.error_count < self.error_count_max): + self.trial_running = True + else: + self.restart_flag = False + self.trial_running = True + + def exit_draw(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting draw") + # if self.restart_flag: + # # self.error_count += 1 + # self.restart_flag = False + # else: + # self.card_count += 1 + # # print(str(self.card_count)) + # self.current_card = self.deck[self.card_count] + + print(str(self.current_card)) + card_cue = self.task_information['cue'][self.current_card[0]] + card_state = self.task_information['state'][self.current_card[1]] + card_choice = self.task_information['choice'][self.current_card[2]] + card_reward = self.task_information['reward'][self.current_card[3]] + print("****************************\n" + + "Current card condition: \n" + + "****************************\n" + + "*Cue: " + str(card_cue) + "\n" + + "*State: " + str(card_state) + "\n" + + "*Choice: " + str(card_choice) + "\n" + + "*Reward: " + str(card_reward) + "\n") + + def enter_initiate(self): + # check error_repeat + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering initiate") + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.treadmill.distance_cm + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", treadmill distance t0: " + str(self.distance_buffer)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting initiate") + self.distance_buffer = self.treadmill.distance_cm + self.restart_flag = True + + def enter_cue_state(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering cue state") + # turn on the cue according to the current card + self.check_cue(self.task_information['cue'][self.current_card[0]]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.treadmill.distance_cm + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", treadmill distance t0: " + str(self.distance_buffer)) + + def exit_cue_state(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting cue state") + self.cue_off(self.task_information['cue'][self.current_card[0]]) + + def enter_reward_available(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", entering reward available") + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied, treadmill: " + str(self.treadmill.distance_cm)) + self.cue_off(self.task_information['cue'][self.current_card[0]]) + + def exit_reward_available(self): + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", exiting reward available") + pass + + def check_cue(self, cue): + if cue == 'sound': + self.box.sound1.on() # could be modify according to specific sound cue + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cue sound1 on") + elif cue == 'LED': + self.box.cueLED1.on() + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cueLED1 on") + else: + self.box.sound1.on() + self.box.cueLED1.on() + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", sound1 + cueLED1 on (free choice)") + + def cue_off(self, cue): + if cue == 'sound': + self.box.sound1.off() # could be modify according to specific sound cue + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cue sound1 off") + elif cue == 'LED': + self.box.cueLED1.off() + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", cueLED1 off") + else: + self.box.sound1.off() + self.box.cueLED1.off() + logging.info(str(time.time()) + ", " + str(self.trial_number) + ", sound1 + cueLED1 off (free choice)") + + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() \ No newline at end of file diff --git a/obsolete/task_information_headfixed.py b/obsolete/task_information_headfixed.py new file mode 100644 index 0000000..ecaded9 --- /dev/null +++ b/obsolete/task_information_headfixed.py @@ -0,0 +1,77 @@ +# Python3: task_information_2022_02_14.py +import random + + +class TaskInformation(object): + def __init__(self, **kwargs): + self.name = "model_based_reinforcement_learning_task" + self.block = { + 1: [ + # block_1 forced component + ('LED', 'distance_short', 'right', 'large', '2'), # 0, 1 index for corresponding condition setup + ('LED', 'distance_long', 'left', 'large', '1'), # forced choice block 1 + + ('sound', 'distance_short', 'left', 'small', '3'), + # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount + ('sound', 'distance_long', 'right', 'small', '4'), + + # each row is a combination of the condition parameter for block 1 + # block_1 free component + # modification on block_1 free component + ('sound+LED', 'distance_short', ('left', 'right'), ('small', 'large'), ('3','2')), + ('sound+LED', 'distance_long', ('left', 'right'), ('large', 'small'), ('1','4')) + # """old version""" + # # ('sound+LED', 'distance_short', 'right', 'large', '2'), # free choice block 1 + # # ('sound+LED', 'distance_short', 'left', 'small', '3'), # LED + # # # 0, 1 index for corresponding condition setup, 2 in column 0 + # # ('sound+LED', 'distance_long', 'left', 'large', '1'), # means both cues are on + # # ('sound+LED', 'distance_long', 'right', 'small', '4') + # """old version ends here""" + ], + 2: [ + # block_2 forced component + ('LED', 'distance_short', 'right', 'small', '2'), # 0, 1 index for corresponding condition setup + ('LED', 'distance_long', 'left', 'small', '1'), # forced choice block 1 + + ('sound', 'distance_short', 'left', 'large', '3'), + # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount + ('sound', 'distance_long', 'right', 'large', '4'), + + # each row is a combination of the condition parameter for block 1 + # modification on block_1 free component + ('sound+LED', 'distance_short', ('left', 'right'), ('large', 'small'), ('3','2')), + ('sound+LED', 'distance_long', ('left', 'right'), ('small', 'large'), ('1','4')) + # """old version""" + # ('sound+LED', 'distance_short', 'right', 'small', '2'), # free choice block 1 + # ('sound+LED', 'distance_short', 'left', 'large', '3'), + # # 0, 1 index for corresponding condition setup, 2 in column 0 + # ('sound+LED', 'distance_long', 'left', 'small', '1'), # means both cues are on # sound + # ('sound+LED', 'distance_long', 'right', 'large', '4') + # """old version ends here""" + ]} + + def draw_card(self, block_key, phase="final"): + row_start = 0 + row_end = 5 + if phase == 'final': + pass + elif phase == 'forced_choice': + row_end = 3 + elif phase == 'free_choice': + # """old version""" + row_start = 4 + # row_end = 7 + # """old version ends here""" + row_start = 4 + elif phase == 'forced_choice_LED': + row_end = 1 + elif phase == 'forced_choice_sound': + row_start = 2 + row_end = 3 + block_map = self.block[block_key] + row_index = random.randint(row_start, row_end) + print(str(row_index)) + card = block_map[row_index] + + return card +# print(TaskInformation().draw_card(2,'free_choice')) diff --git a/obsolete/task_information_headfixed2FC.py b/obsolete/task_information_headfixed2FC.py new file mode 100644 index 0000000..4c3d3a2 --- /dev/null +++ b/obsolete/task_information_headfixed2FC.py @@ -0,0 +1,42 @@ +import random + + +class TaskInformation(object): + def __init__(self, **kwargs): + self.name = "model_based_reinforcement_learning_task" + self.block = { + 1: [ + # block_1 forced component + ('LED_L', 'left', 'large', '1'), # forced choice block 1 + ('LED_R', 'right', 'small', '2'), # 0, 1 index for corresponding condition setup + # block_1 free component + ('all', ('left', 'right'), ('large', 'small'), ('1','2')) + ], + 2: [ + # block_2 forced component + ('LED_L', 'left', 'small', '1'), # forced choice block 1 + ('LED_R', 'right', 'large', '2'), # 0, 1 index for corresponding condition setup + ('all', ('left', 'right'), ('small', 'large'), ('1','2')) + ]} + + def draw_card(self, block_key, phase="final"): + row_start = 0 + row_end = 2 + if phase == 'final': + pass + elif phase == 'forced_choice': + row_end = 1 + elif phase == 'free_choice': + row_start = 2 + elif phase == 'forced_choice_left': + row_end = 0 + elif phase == 'forced_choice_right': + row_start = 1 + row_end = 1 + block_map = self.block[block_key] + row_index = random.randint(row_start, row_end) + print(str(row_index)) + card = block_map[row_index] + + return card +# print(TaskInformation().draw_card(2,'free_choice')) diff --git a/obsolete/task_information_lick.py b/obsolete/task_information_lick.py new file mode 100644 index 0000000..cb639b1 --- /dev/null +++ b/obsolete/task_information_lick.py @@ -0,0 +1,134 @@ +# Python3: task_information_2022_02_14.py +import collections +import itertools +import random + +task_information = collections.OrderedDict() +task_information['experiment_setup'] = 'headfixed' +task_information['treadmill_setup'] = {'present': True} + +# if task_information['treadmill_setup']['present']: +# task_information['treadmill_setup']['distance_initiation'] = 5 # cm +# task_information['treadmill_setup']['distance_short'] = 7 # cm +# task_information['treadmill_setup']['distance_long'] = 30 # cm +# else: +# task_information['treadmill_setup'] = None +# +# task_information['error_repeat'] = True +# if task_information['error_repeat']: +# task_information['error_repeat_max'] = 3 + +# condition setup +task_information['cue'] = ['sound', 'LED', 'sound+LED'] +# task_information['state'] = ['distance_short', 'distance_long'] # treadmill distance +# task_information['choice'] = ['right', 'left'] # lick port +# task_information['reward'] = ['small', 'large'] # reward size +task_information['reward_size'] = {'small': 5, 'large': 10} + +# define timeout during each condition +task_information['initiation_timeout'] = 5 # s +task_information['standby_wait'] = 1 +task_information['cue_timeout'] = 5 +task_information['reward_timeout'] = 5 +task_information["reward_wait"] = 5 +task_information["punishment_timeout"] = 1 + +# # block setup +# task_information['block'] = {} +# task_information['block'][1] = [ +# # block_1 forced component +# (1, 0, 0, 1), # forced choice block 1 +# (1, 1, 1, 1), # 0, 1 index for corresponding condition setup +# (0, 0, 1, 0), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount +# (0, 1, 0, 0), # each row is a combination of the condition parameter for block 1 +# # block_1 free component +# (2, 0, 0, 1), # free choice block 1 +# (2, 0, 1, 0), # 0, 1 index for corresponding condition setup, 2 in column 0 +# (2, 1, 0, 0), # means both cues are on +# (2, 1, 0, 1)] # each row is a combination of the condition parameter for block 1 +# +# task_information['block'][2] = [ +# # block_2 forced component +# (1, 0, 0, 0), # forced choice block 2 +# (1, 1, 1, 0), # 0, 1 index for corresponding condition setup +# (0, 0, 1, 1), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount +# (0, 1, 0, 1), # each row is a combination of the condition parameter for block 1 +# # block_2 free component +# (2, 0, 0, 0), # free choice block 2 +# (2, 0, 1, 1), # 0, 1 index for corresponding condition setup, None in column 0 +# (2, 1, 0, 1), # means both cues are on +# (2, 1, 0, 0)] # each row is a combination of the condition parameter for block 1 +# +# # define block_duration and initial block to start the session +# block_duration = 2 # each block has this amount of repetition +# block_variety = 2 +# if block_variety > 1: +# initial_block = 1 +# +# # now shuffle and make a deck for this session +# # shuffle requirement +# +# # # allowing user defined initial_block and initial setup for conditions? +# # task_information["initial_block"] = 1 +# # +# # allowing consecutive repeated trial? +# consecutive_control = True +# if consecutive_control: +# consecutive_max = 3 +# +# +# def generate_block_sequence(number_block, sequence_length, initial_character): +# if not initial_character: +# initial_character = random.randint(1, 2) +# if number_block == 1: +# sequence = [initial_character] +# else: +# if initial_character - 1: +# sequence = [initial_character, initial_character - 1] +# else: +# sequence = [initial_character, initial_character + 1] +# sequence = sequence * sequence_length +# return sequence +# +# # +# # the block list is used for 1) generate a shuffled deck; 2) a list for keeping track of what block is the +# # current card is located +# block_list = generate_block_sequence(block_variety, block_duration, initial_block) +# +# +# task_information["block_list"] = list( +# itertools.chain.from_iterable(itertools.repeat(iterate, block_duration) for iterate in block_list)) +# +# +# def generate_deck(duration, consecutive_permit, repetition_max): +# consecutive_count = 0 +# row_buffer = -1 +# deck_list = [] +# for iteration in range(duration): +# row_index = random.randrange(0, 8) +# while True: +# if row_index == row_buffer and consecutive_permit: +# if consecutive_count >= repetition_max: +# row_index = random.randrange(0, 8) +# else: +# break +# else: +# break +# row_buffer = row_index +# deck_list.append(row_index) +# return deck_list +# +# +# def shuffle(block_sequence, duration_block): +# deck = [] +# for block in block_sequence: +# deck_list_buffer = generate_deck(duration_block, consecutive_control, consecutive_max) +# current_deck = [] +# block_map = task_information['block'][block] +# for row_index in deck_list_buffer: +# current_deck.append(block_map[row_index]) +# deck.extend(current_deck) +# return deck +# +# +# task_information["deck"] = shuffle(block_list, block_duration) diff --git a/obsolete/task_information_phase_1.py b/obsolete/task_information_phase_1.py new file mode 100644 index 0000000..45738e9 --- /dev/null +++ b/obsolete/task_information_phase_1.py @@ -0,0 +1,158 @@ +# Python3: task_information_2022_02_14.py +import collections +import itertools +import random + +task_information = collections.OrderedDict() +task_information['experiment_setup'] = 'headfixed' +task_information['treadmill_setup'] = {'present': True} +task_information['phase'] = 1 + +if task_information['treadmill_setup']['present']: + task_information['treadmill_setup']['distance_initiation'] = 5 # cm + task_information['treadmill_setup']['distance_short'] = 7 # cm + task_information['treadmill_setup']['distance_long'] = 30 # cm +else: + task_information['treadmill_setup'] = None + +task_information['error_repeat'] = True +if task_information['error_repeat']: + task_information['error_repeat_max'] = 3 + +# define timeout during each condition +task_information['initiation_timeout'] = 5 # s +task_information['cue_timeout'] = 5 +task_information['reward_timeout'] = 5 +task_information["reward_wait"] = 5 +task_information["punishment_timeout"] = 1 +# condition setup +task_information['reward_size'] = {'small': 5, 'large': 10} + +# condition parameters +task_information['cue'] = ['sound', 'LED', 'sound+LED'] +task_information['state'] = ['distance_short', 'distance_long'] # treadmill distance +task_information['choice'] = ['right', 'left'] # lick port +task_information['reward'] = ['small', 'large'] # reward size + + +if task_information['phase'] == 1: + task_information['reward_size'] = {'small': 5, 'large': 5} + +# define block_duration and initial block to start the session +block_duration = 2 # each block has this amount of repetition +block_variety = 1 +initial_block = 1 + +# allowing consecutive repeated trial? +consecutive_control = True +consecutive_max = 3 + +# below is static +# block setup +task_information['block'] = {} +task_information['block'][1] = [ + # block_1 forced component + (1, 0, 0, 1), # forced choice block 1 + (1, 1, 1, 1)#, # 0, 1 index for corresponding condition setup + #(0, 0, 1, 0), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount + #(0, 1, 0, 0)#, # each row is a combination of the condition parameter for block 1 + # # block_1 free component + # (2, 0, 0, 1), # free choice block 1 + # (2, 0, 1, 0), # 0, 1 index for corresponding condition setup, 2 in column 0 + # (2, 1, 0, 0), # means both cues are on + # (2, 1, 0, 1)] # each row is a combination of the condition parameter for block 1 + ] + +task_information['block'][2] = [ + # block_2 forced component + (1, 0, 0, 0), # forced choice block 2 + (1, 1, 1, 0)#, # 0, 1 index for corresponding condition setup + #(0, 0, 1, 1), # column 0 is cue, 1 is state, 2 is choice, 3 is reward_amount + #(0, 1, 0, 1)#, # each row is a combination of the condition parameter for block 1 + # # block_2 free component + # (2, 0, 0, 0), # free choice block 2 + # (2, 0, 1, 1), # 0, 1 index for corresponding condition setup, None in column 0 + # (2, 1, 0, 1), # means both cues are on + # (2, 1, 0, 0)] # each row is a combination of the condition parameter for block 1 + ] + +if initial_block is False: + initial_block = random.randrange(1, 2) + +# now shuffle and make a deck for this session +# shuffle requirement + +# # allowing user defined initial_block and initial setup for conditions? +# task_information["initial_block"] = 1 +# + + +# if block_variety == 1: +# consecutive_control = False +# consecutive_max = 0 + + + +def generate_block_sequence(number_block, sequence_length, initial_character): + # if not initial_character: + # initial_character = random.randint(1, 2) + if block_variety == 1: + sequence = [initial_character] * sequence_length + else: + if number_block == 1: + sequence = [initial_character] + else: + if initial_character - 1: + sequence = [initial_character, initial_character - 1] + else: + sequence = [initial_character, initial_character + 1] + sequence = sequence * sequence_length + return sequence + + +# the block list is used for 1) generate a shuffled deck; 2) a list for keeping track of what block is the +# current card is located +block_list = generate_block_sequence(block_variety, block_duration, initial_block) + + +task_information["block_list"] = list( + itertools.chain.from_iterable(itertools.repeat(iterate, block_duration) for iterate in block_list)) + + +def generate_deck(duration, consecutive_permit, repetition_max): + consecutive_count = 0 + row_buffer = -1 + deck_list = [] + for iteration in range(duration): + row_index = random.randrange(0, 2) # for forced choice only + # row_index = random.randrange(0, 8) + # while True: + if row_index == row_buffer and consecutive_permit: + consecutive_count += 1 + if consecutive_count > repetition_max: + while row_index == row_buffer: + row_index = random.randrange(0, 2) # for forced choice only + # row_index = random.randrange(0, 8) + # else: + # break + # else: + # break + row_buffer = row_index + deck_list.append(row_index) + return deck_list + + +def shuffle(block_sequence, duration_block): + deck = [] + for block in block_sequence: + deck_list_buffer = generate_deck(duration_block, consecutive_control, consecutive_max) + current_deck = [] + block_map = task_information['block'][block] + for row_index in deck_list_buffer: + current_deck.append(block_map[row_index]) + deck.extend(current_deck) + return deck + + +task_information["deck"] = shuffle(block_list, block_duration) +print(task_information["deck"]) \ No newline at end of file diff --git a/obsolete/test_session_info.py b/obsolete/test_session_info.py new file mode 100755 index 0000000..ac12b2c --- /dev/null +++ b/obsolete/test_session_info.py @@ -0,0 +1,23 @@ +# fake test_session_info file (used for testing) + +import collections, socket +from datetime import datetime + +test_session_info = collections.OrderedDict() +test_session_info['mouse_name'] = 'testmouse' +test_session_info['basedir'] = '/home/pi/video' +test_session_info['date'] = datetime.now().strftime("%Y-%m-%d") +test_session_info['time'] = datetime.now().strftime('%H%M%S') +test_session_info['datetime'] = test_session_info['date'] + '_' + test_session_info['time'] +test_session_info['basename'] = test_session_info['mouse_name'] + '_' + test_session_info['datetime'] +test_session_info['box_name'] = socket.gethostname() +test_session_info['dir_name'] = test_session_info['basedir'] + "/" + test_session_info['mouse_name'] + "_" + test_session_info['datetime'] +# test_session_info['config'] = 'freely_moving_v1' +test_session_info['config'] = 'head_fixed_v1' +test_session_info['timeout_length'] = 5 # in seconds +test_session_info['reward_size'] = 10 # in microliters + +# visual stimulus +test_session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +test_session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.grat', '/home/pi/gratings/second_grating.grat'] +test_session_info['vis_raws'] = [] \ No newline at end of file diff --git a/obsolete/testing_visualstim.py b/obsolete/testing_visualstim.py new file mode 100755 index 0000000..0fe5b29 --- /dev/null +++ b/obsolete/testing_visualstim.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 + +# testing the visual stim class + +import logging +from visualstim import VisualStim +import time +import collections, pysistence +import socket +from datetime import datetime + + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.StreamHandler() + ] +) + + +# defining immutable mouse dict (once defined for a mouse, this should never change) +mouse_info = pysistence.make_dict({'mouse_name': 'mouse01', + 'fake_field': 'fake_info', + }) + +# making fake session_info +session_info = collections.OrderedDict() +session_info['mouse_name'] = mouse_info['mouse_name'] +#session_info['trainingPhase'] = 4 +session_info['basedir'] = '/home/pi/fakedata' +session_info['weight'] = 32.18 +session_info['manual_date'] = '2021-01-27' +session_info['date'] = datetime.now().strftime("%Y-%m-%d") +session_info['time'] = datetime.now().strftime('%H%M%S') +session_info['datetime'] = session_info['date'] + '_' + session_info['time'] +session_info['basename'] = mouse_info['mouse_name'] + '_' + session_info['datetime'] +session_info['box_name'] = socket.gethostname() +session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info['datetime'] +# session_info['config'] = 'freely_moving_v1' +session_info['config'] = 'head_fixed_v1' + +# visual stimulus +session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.grat', '/home/pi/gratings/second_grating.grat'] +session_info['vis_raws'] = [] + + +logging.info("initiating vstim") +screen = VisualStim(session_info) +# screen.load_stimulus_dir('/home/pi/gratings') + +screen.show_stimulus('first_grating.grat') + +# proof that the threading works - note that other stuff is done while the +# stimulus is playing +for i in range(21): + logging.info("these should be slightly more than 200 ms apart") + time.sleep(0.2) + + + + diff --git a/obsolete/visualization_task.py b/obsolete/visualization_task.py new file mode 100644 index 0000000..d22f21a --- /dev/null +++ b/obsolete/visualization_task.py @@ -0,0 +1,182 @@ +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class VisualizationTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + # if kwargs.get("session_info", None) is None: + # print( + # Fore.RED + # + Style.BRIGHT + # + "Warning: no session_info supplied; making fake one" + # + Style.RESET_ALL + # ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + # else: + # self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + Timeout( + name="cue", + on_enter=["enter_cue"], + on_exit=["exit_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_start", "standby", "reward_available"], + ["active_poke", "reward_available", "cue"], + ["timeup", "cue", "standby"], + ] + + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + # self.pump = behavbox.Pump() + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + self.box.check_plot() + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + # self.box.sound1.blink(0.5, 0.1, 1) + # self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + # self.box.cueLED4.on() + # self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + # self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + # self.pump.reward("1", self.session_info["reward_size"]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + # self.pump.reward("3", self.session_info["reward_size"]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + # self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + # self.box.video_stop() + # self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/obsolete/walk_task.py b/obsolete/walk_task.py new file mode 100644 index 0000000..b64a61a --- /dev/null +++ b/obsolete/walk_task.py @@ -0,0 +1,461 @@ +# python3: headfixed_task.py +""" +author: tian qiu +date: 2023-01-26 +name: walk_task.py +goal: model_based reinforcement learning behavioral training task structure + a simplified version of the headfixed task +description: + an updated test version of soyoun_task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class WalkTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], # format: ['trigger', 'origin', 'destination'] + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = False + self.multiple_choice_error = False + self.error_repeat = False + self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + + self.current_cue = None + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_IR_entry" or self.event_name == "right_IR_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + # print("beeeeeeep") # debug signal + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + if not self.reward_times_up: + if self.reward_time_start: + if time.time() >= self.reward_time_start + self.reward_time: + self.restart() + # first detect the lick signal: + cue_state_choice = self.current_cue + side_mice = None + if self.event_name == "left_IR_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_IR_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + if cue_state_choice == "left": + pump_num = "1" + if cue_state_choice == "right": + pump_num = "2" + reward_size = self.session_info["reward_size"] + if side_mice == cue_state_choice: # if the animal chose correctly + print("Number of lick detected: " + str(self.lick_count)) + if self.lick_count == 0: # if this is the first lick + # self.side_mice_buffer = side_mice + self.pump.reward(pump_num, reward_size) + self.total_reward += 1 + self.reward_time_start = time.time() + print("Reward time start" + str(self.reward_time_start)) + self.lick_count += 1 + + elif self.side_mice_buffer: + if self.lick_count == 0: + # self.reward_error = True + self.check_cue('sound2') + self.wrong_choice_error = True + self.restart() + else: # multiple choice error + # self.reward_error = True + self.check_cue('sound2') + self.multiple_choice_error = True + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.cue_off('all') + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + self.early_lick_error = False + self.lick_count = 0 + self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + self.cue_off('sound1') + print("EVENT NAME: " + str(self.box.event_list)) + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + self.check_cue(self.current_cue) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_cue) + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.trial_number) + ", cue_state distance satisfied") + # self.check_cue('sound2') + self.cue_off(self.current_cue) + self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + # self.cue_off('sound2') + self.reward_times_up = True + self.pump.reward("vaccum", 0) + if self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('wrong_choice_error') + self.wrong_choice_error = False + elif self.multiple_choice_error: + logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) + self.error_repeat = False + self.error_list.append('multiple_choice_error') + self.multiple_choice_error = False + elif self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.error_repeat = True + self.error_list.append('no_choice_error') + else: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.error_list.append('correct_trial') + self.lick_count = 0 + self.reward_time_start = None + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1,0.1,1) + elif cue == 'left': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_on;" + str(self.error_repeat)) + elif cue == 'right': + # self.LED_blink = True + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.sound1.off() + # self.box.sound2.off() + self.box.cueLED1.off() + self.box.cueLED2.off() + if cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'left': + self.box.cueLED1.off() + self.LED_blink = False + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'right': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/outputs/__init__.py b/outputs/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 9289d9c..0000000 --- a/requirements.txt +++ /dev/null @@ -1,20 +0,0 @@ -Adafruit_GPIO -colorama -colorzero -gpiozero -icecream -ipython -matplotlib -mock -numpy -Pillow -pygame -pygame_ce -pygame_gui -pysistence -pytest -rpg -scipy -setuptools -smbus -transitions diff --git a/session_info.py b/session_info.py deleted file mode 100644 index c383e19..0000000 --- a/session_info.py +++ /dev/null @@ -1,97 +0,0 @@ -# put all of your mouse and session info in here - -import pysistence, collections -import socket -from datetime import datetime - - -### PARAMETERS - Rig and defaults (should not change between sessions) ### -# TODO - get rid of all the redundancy in here - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'TM001', - 'fake_field': 'fake_info', - }) - -# Parameters: mouse, session type - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['weight'] = 30 # in grams -session_info['date'] = datetime.now().strftime("%Y-%m-%d") # for example, '2023-09-28' -session_info['task_config'] = 'latent_inference_forage' # ['alternating_latent', 'latent_inference_forage'] - -# behavior parameters - ideally set these to a default for each session type, which is adjustable -session_info['max_trial_number'] = 100 -session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters -session_info["lick_threshold"] = 2 -session_info['reward_time_delay'] = 20 -session_info['intertrial_interval'] = .5 # in seconds -session_info['quiet_ITI'] = False - -session_info['initiation_timeout'] = 120 # s - -session_info['entry_interval'] = 1 # this is the one that delays between choices - ITI? or intertrial_interval? or entry_interval? -session_info['timeout_time'] = 3 -session_info['ContextA_reward_probability'] = 1 -session_info['ContextB_reward_probability'] = 1 - -session_info['correct_reward_probability'] = 1 -session_info['incorrect_reward_probability'] = 0 -session_info['switch_probability'] = .1 - -session_info["ContextA_time"] = 30 # todo - revise this or make adjustable by mouse performance -session_info["ContextB_time"] = 30 -session_info["ContextC_time"] = 30 - -session_info['epoch_length'] = 120 -session_info['dark_period_times'] = [10] - -# Reward pump parameters -session_info["reward_pump1"] = '2' -session_info['reward_pump2'] = '1' - -session_info['reward_size_large'] = [3, 3] -session_info['reward_size_small'] = [0, 0] -session_info['errors_to_reward_delivery'] = 5 -session_info['key_reward_amount'] = 3 - -# Parameters - file saving -session_info['file_basename'] = 'place_holder' -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' - -# Parameters - box and rig -session_info['box_name'] = socket.gethostname() - -session_info["visual_stimulus"] = False -session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -session_info['vis_gratings'] = ['/home/pi/gratings/context_a.dat', - '/home/pi/gratings/context_b.dat'] -session_info['vis_raws'] = [] - -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True - - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 10 # cm - session_info['treadmill_setup']['distance_cue'] = 25 # cm -else: - session_info['treadmill_setup'] = None - - -### DEPRECATED / NOT CURRENTLY IN USE ### -session_info['LED_duration'] = 3 - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -session_info["reward_pump"] = '2' -session_info['reward_size'] = 1 diff --git a/task_protocol/EFO_task/EFO_task.py b/task_protocol/EFO_task/EFO_task.py new file mode 100644 index 0000000..5b86cde --- /dev/null +++ b/task_protocol/EFO_task/EFO_task.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Oct 11 18:02:34 2022 +First tentative to do a new 2 AFC task that has 4 pokes, with the 4th poke being +the reward that is delivered to the animal separate from the choices +@author: eliezyer +""" + + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class EFOTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + # Task has the following states: standby, trial_available, cue, choice_available, and reward_available (punishment?) + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="trial_available", + on_enter=["enter_trial_available"], + on_exit=["exit_trial_available"], + ), + Timeout( + name="start_cue", + on_enter=["enter_start_cue"], + on_exit=["exit_start_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + Timeout( + name="choice_available", + on_enter=["enter_choice_available"], + on_exit=["exit_choice_available"], + ), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_available", "standby", "start_cue"], + ["choice_available", "start_cue", "reward_available"], + ["reward_available", "choice_available", "standby"], + ] + # EFO: STOPPED HERE ON 10/11/2022 + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = behavbox.Pump() + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + self.box.sound1.blink(0.5, 0.1, 1) + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + self.box.cueLED4.on() + self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + self.pump.reward("1", self.session_info["reward_size"]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + self.pump.reward("3", self.session_info["reward_size"]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() + self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/EFO_task/__init__.py b/task_protocol/EFO_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/EFO_task/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/alternating_latent/__init__.py b/task_protocol/alternating_latent/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/task_protocol/alternating_latent/alternating_latent_model.py b/task_protocol/alternating_latent/alternating_latent_model.py deleted file mode 100644 index da60d52..0000000 --- a/task_protocol/alternating_latent/alternating_latent_model.py +++ /dev/null @@ -1,312 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# python3: lick_task_left_and_right_alternate.py -""" -author: Mitch Farrell; edited Matthew Chin -last updated: 2023-06-30 -name: lick_task_left_and_right_alternate.py -""" -from transitions import State, Machine -from transitions.extensions.states import add_state_features, Timeout - -from icecream import ic -import logging -import time - -import random -import numpy as np - -import logging.config -from collections import deque -from typing import Protocol, List, Tuple, Union -from collections import defaultdict - -""" -Model for the task - i.e. only sees the the task state machine and status, necessary parameters, and presenter messages. -""" - -RIGHT_IX = 0 -LEFT_IX = 1 - - -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class AlternateLatent(object): - - def __init__(self, session_info: dict): # name and session_info should be provided as kwargs - # TASK + BEHAVIOR STATUS - self.trial_running = False - self.trial_number = 0 # I don't think stopping at max trials is implemented - do that - - self.last_choice_time = -np.inf - self.rewards_earned_in_block = 0 - self.rewards_available_in_block = random.randint(1, 4) - - # Lick detection - self.lick_side_buffer = np.zeros(2) - - ### TRAINING REWARDS PARAMETERS ### - self.automate_training_rewards = False # keep here, use in controller - self.give_training_reward = False # keep here, use in controller - self.error_count = 0 - self.errors_to_reward = 5 - - # These can't be refactored, session parameters needed for behavbox - # maybe move them into a parameters class - self.choice_interval = session_info['entry_interval'] - self.lick_threshold = session_info['lick_threshold'] - self.machine = self.make_state_machine(session_info['timeout_time']) - self.last_state_fxn = self.switch_to_standby - self.block_type_counter = np.zeros(2) - - # revise these later to make sure you need them - self.trial_choice_list: list = [] - self.trial_correct_list: list = [] - self.trial_choice_times: list = [] - self.trial_reward_given: list = [] - self.event_list = deque() - self.t_session = time.time() - - def make_state_machine(self, timeout_time: float): - # reward_available is not used - it would allow licking either side but this task does not use that - states = [ - State(name='standby', - on_enter=['switch_to_reward_available'], - on_exit=["exit_standby"]), - State(name="right_active", - on_enter=["enter_right_active"], - on_exit=['exit_right_active']), - State(name="left_active", - on_enter=["enter_left_active"], - on_exit=['exit_left_active']), - Timeout(name='timeout', - on_enter=['enter_timeout'], - timeout=timeout_time, - on_timeout=['exit_timeout'])] - - # all of these transition functions are created automatically - transitions = [ - # ['start_trial_logic', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] - - ['switch_to_standby', ['right_active', 'left_active'], 'standby'], - ['switch_to_left_active', '*', 'left_active'], - ['switch_to_right_active', '*', 'right_active'], - ['switch_to_timeout', ['right_active', 'left_active'], 'timeout'], - ['end_task', ['timeout', 'right_active', 'left_active'], 'standby'] - ] - - machine = TimedStateMachine( - model=self, - states=states, - transitions=transitions, - initial='standby' - ) - return machine - - def enter_standby(self): # This function should also call for updating the plot??? - logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str("")) - self.trial_running = False - self.event_list.clear() - # self.last_state_fxn = self.switch_to_standby - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str("")) - # self.last_state = self.state - self.reset_counters() - - def exit_right_active(self): - logging.info(";" + str(time.time()) + ";[transition];exit_right_active;" + str("")) - # self.last_state_fxn = self.switch_to_right_active - # self.reset_counters() - - def exit_left_active(self): - logging.info(";" + str(time.time()) + ";[transition];exit_left_active;" + str("")) - # self.last_state_fxn = self.switch_to_left_active - # self.reset_counters() - - def enter_right_active(self): - self.trial_running = True - self.last_state_fxn = self.switch_to_right_active - logging.info(";" + str(time.time()) + ";[transition];enter_right_active;" + str("")) - print('entering right active') - - def enter_left_active(self): - self.trial_running = True - self.last_state_fxn = self.switch_to_left_active - logging.info(";" + str(time.time()) + ";[transition];enter_left_active;" + str("")) - print('entering left active') - - def enter_timeout(self): - # log the entrance to timeout; reset counters - self.event_list.clear() - self.lick_side_buffer *= 0 - self.trial_running = False - logging.info(";" + str(time.time()) + ";[transition];enter_timeout;" + str("")) - - def exit_timeout(self): - # logs the exit-timeout; doesn't do anything else - self.event_list.clear() - self.lick_side_buffer *= 0 - logging.info(";" + str(time.time()) + ";[transition];exit_timeout;" + str("")) - if self.rewards_earned_in_block >= self.rewards_available_in_block: - self.sample_next_block() - else: - self.last_state_fxn() - - def sample_next_block(self): - self.reset_counters() - self.rewards_available_in_block = random.randint(1, 4) - print('sampling_next_block') - if random.randint(0, 1) == 0: - if self.state != 'right_active': - self.block_type_counter *= 0 - else: - self.block_type_counter[0] += 1 - - if self.block_type_counter[0] >= 2: - self.switch_to_left_active() - else: - self.switch_to_right_active() - - else: - if self.state != 'left_active': - self.block_type_counter *= 0 - else: - self.block_type_counter[1] += 1 - - if self.block_type_counter[1] >= 2: - self.switch_to_right_active() - else: - self.switch_to_left_active() - - def reset_counters(self): - self.lick_side_buffer *= 0 - self.rewards_earned_in_block = 0 - self.error_count = 0 - self.event_list.clear() - - # def determine_choice(self) -> Union[int, np.ndarray[int]]: - def determine_choice(self) -> str: - """Determine whether there has been a choice to the left ports, right ports, or a switch.""" - - sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides - if sides_licked > 1: - # made a switch, reset the counter - self.lick_side_buffer *= 0 - return 'switch' - - if np.amax(self.lick_side_buffer) >= self.lick_threshold: - choice_ix = np.argmax(self.lick_side_buffer) # either 0 or 1 - choice = ['right', 'left'][choice_ix] - self.lick_side_buffer *= 0 - # return choice_ix - return choice - else: - return '' # no choice made/not enough licks - - def run_event_loop(self) -> Tuple[str, bool, float]: - choice_correct = '' # ['correct', 'incorrect', 'switch', ''] - give_training_reward = False - cur_time = time.time() - time_since_start = cur_time - self.t_session - dt = cur_time - self.last_choice_time - - if self.event_list: - event = self.event_list.popleft() - else: - event = '' - - if self.state in ['standby', 'timeout']: - # self.give_training_reward = False # only toggle this in left/right active??? - return choice_correct, give_training_reward, time_since_start - - # self.state is in ['left_active', 'right_active'] - if dt < self.choice_interval: - self.lick_side_buffer *= 0 - return choice_correct, give_training_reward, time_since_start - - if event == 'right_entry': - self.lick_side_buffer[RIGHT_IX] += 1 - elif event == 'left_entry': - self.lick_side_buffer[LEFT_IX] += 1 - - choice_side = self.determine_choice() - # if no choice made, don't mark anything but maybe give reward - if choice_side == 'right': - self.last_choice_time = cur_time - if self.state == 'right_active': - choice_correct = 'correct' - self.log_correct_choice(RIGHT_IX, time_since_start) - else: - choice_correct = 'incorrect' - self.log_incorrect_choice(RIGHT_IX, time_since_start) - - elif choice_side == 'left': - self.last_choice_time = cur_time - if self.state == 'left_active': - choice_correct = 'correct' - self.log_correct_choice(LEFT_IX, time_since_start) - else: - choice_correct = 'incorrect' - self.log_incorrect_choice(LEFT_IX, time_since_start) - - elif choice_side == 'switch': - self.last_choice_time = cur_time # for switches, enter ITI but do not update choices - - # elif choice_side == ['switch', 'none']: # no updates unless giving reward - # self.incorrect_choice_updates(choice_side, cur_time) - # give_reward = self.incorrect_choice_updates(choice_side, cur_time) - - elif (self.error_count >= self.errors_to_reward and self.automate_training_rewards)\ - or self.give_training_reward: - self.last_choice_time = cur_time - give_training_reward = True - if self.state == 'right_active': - choice_side = RIGHT_IX - else: - choice_side = LEFT_IX - self.log_training_reward(choice_side, time_since_start) - - self.give_training_reward = False - return choice_correct, give_training_reward, time_since_start - - def log_correct_choice(self, choice: int, event_time: float) -> None: - self.trial_choice_list.append(choice) - self.trial_choice_times.append(event_time) - self.trial_correct_list.append(True) - self.error_count = 0 - - def log_incorrect_choice(self, choice: int, event_time: float) -> None: - self.trial_choice_list.append(choice) - self.trial_choice_times.append(event_time) - self.trial_correct_list.append(False) - self.error_count += 1 - - def log_training_reward(self, choice: int, event_time: float) -> None: - self.trial_choice_list.append(choice) - self.trial_choice_times.append(event_time) - self.trial_correct_list.append(False) - self.error_count = 0 - - def start_task(self): - """A wrapper function for main function use.""" - self.sample_next_block() - - -def main(): - session_info = defaultdict(list) - session_info['timeout_time'] = 1 - task = AlternateLatent(session_info) - # task.switch_to_left_active() - # task.exit_standby() - # task.switch_to_reward_available() - task.sample_next_block() - print(task.state) - - -if __name__ == '__main__': - main() diff --git a/task_protocol/alternating_latent/alternating_latent_presenter.py b/task_protocol/alternating_latent/alternating_latent_presenter.py deleted file mode 100644 index 4c788f7..0000000 --- a/task_protocol/alternating_latent/alternating_latent_presenter.py +++ /dev/null @@ -1,181 +0,0 @@ -import collections -from typing import Protocol, List, Tuple - -import matplotlib as mpl -import matplotlib.pyplot as plt -import numpy as np - -from icecream import ic -import time -import logging - -from task_protocol.base_classes import Presenter - -SEED = 0 -rng = np.random.default_rng(seed=SEED) - - -PUMP1_IX = 0 -PUMP2_IX = 1 -trial_choice_map = {'right': 0, 'left': 1} - - -class Task(Protocol): - trial_choice_list: List[int] - trial_correct_list: List[bool] - trial_choice_times: List[float] - trial_reward_given: List[bool] - event_list: collections.deque - - state: str - rewards_earned_in_block: int - rewards_available_in_block: int - - def run_event_loop(self) -> Tuple[str, bool, float]: - ... - - def switch_to_timeout(self): - ... - - def sample_next_block(self): - ... - - -class GUI(Protocol): - correct_line: mpl.lines.Line2D - incorrect_line: mpl.lines.Line2D - reward_line: mpl.lines.Line2D - figure_window: plt.Figure - - def check_keyboard(self) -> None: - ... - - def check_plot(self, figure, save_fig: bool = False) -> None: - ... - - -class Box(Protocol): - def video_start(self): - ... - - def video_stop(self): - ... - - -class Pump(Protocol): - def reward(self, pump_key: str, reward_size: float): - ... - - -class AlternatingLatentPresenter(Presenter): - - def __init__(self, task: Task, box: Box, pump: Pump, - gui: GUI, session_info: dict): - - self.task: Task = task - self.gui: GUI = gui - self.box = box - self.pump = pump - self.session_info = session_info - self.pump_keys = (session_info["reward_pump1"], session_info['reward_pump2']) - self.reward_size_large = session_info['reward_size_large'] - self.reward_size_small = session_info['reward_size_small'] - - ############################################################################################### - # event list trigger by the interaction between the RPi and the animal for visualization - # interact_list: lick, choice interaction between the board and the animal for visualization - ############################################################################################### - self.interact_list = [] - - self.keypress_training_reward = False - self.automatic_training_rewards = False - - def run(self) -> None: - """ - Process one event, checking GUI and events as needed. - Currently set to give rewards probabilistically (same reward sizes, unequal reward probabilities) - """ - # make this say if correct real choice or incorrect real choice - choice_correct, give_training_reward, cur_time = self.task.run_event_loop() - # goes through the whole timeout before doing the plotting bits I think - if self.task.state in ['A', 'C1', 'right_active']: - correct_pump = PUMP1_IX - incorrect_pump = PUMP2_IX - elif self.task.state in ['B', 'C2', 'left_active']: - correct_pump = PUMP2_IX - incorrect_pump = PUMP1_IX - else: - raise RuntimeError('state not recognized') - - # give reward if - # 1. training reward/human reward (give reward, regardless of action) - # 2. correct choice and meets correct reward probability - # 3. incorrect but REAL choice (i.e. not a switch) and meets incorrect reward probability - - if give_training_reward: - reward_size = self.reward_size_large[correct_pump] - self.task.rewards_earned_in_block += 1 - self.task.trial_reward_given.append(True) - logging.info(";" + str(time.time()) + ";[reward];giving_reward;" + str("")) - self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) - - elif choice_correct == 'correct': - if rng.random() < self.session_info['correct_reward_probability']: - reward_size = self.reward_size_large[correct_pump] - self.task.rewards_earned_in_block += 1 - self.task.trial_reward_given.append(True) - else: - reward_size = 0 - self.task.trial_reward_given.append(False) - - self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) - - elif choice_correct == ('incorrect' - ''): - if rng.random() < self.session_info['incorrect_reward_probability']: - reward_size = self.reward_size_large[incorrect_pump] # can modify these to a single value, reward large and reward small - self.task.rewards_earned_in_block += 1 - self.task.trial_reward_given.append(True) - else: - reward_size = 0 - self.task.trial_reward_given.append(False) - - self.deliver_reward(pump_key=self.pump_keys[incorrect_pump], reward_size=reward_size) - - if self.task.trial_choice_list: - self.update_plot() - - self.gui.check_keyboard() - if self.task.rewards_earned_in_block > self.task.rewards_available_in_block: - self.task.sample_next_block() - # if choice_correct: # is not None - # self.task.switch_to_timeout() - - def update_plot(self, save_fig: bool = False) -> None: - ix = np.array(self.task.trial_correct_list) - choices = np.array(self.task.trial_choice_list) - times = np.array(self.task.trial_choice_times) - rewards = np.array(self.task.trial_reward_given) - - correct_trials = choices[ix] - correct_times = times[ix] - - incorrect_trials = choices[~ix] - incorrect_times = times[~ix] - - reward_trials = choices[rewards] - reward_times = times[rewards] - - self.gui.figure_window.correct_line.set_data(correct_times, correct_trials) - self.gui.figure_window.error_line.set_data(incorrect_times, incorrect_trials) - self.gui.figure_window.reward_line.set_data(reward_times, reward_trials) - # print('correct trials:', correct_trials) - - # update this to show the last 20-ish trials - if times.size > 1: - T = [times[-20:][0], times[-1]] - else: - T = [times[-1]-.5, times[-1]+.5] - plt.xlim(T) - - self.gui.check_plot(figure=self.gui.figure_window.figure, savefig=save_fig) diff --git a/task_protocol/base_classes.py b/task_protocol/base_classes.py deleted file mode 100644 index 601d0d1..0000000 --- a/task_protocol/base_classes.py +++ /dev/null @@ -1,287 +0,0 @@ -import logging -import time -from typing import List, Tuple, Protocol, Union -from abc import ABC, abstractmethod -from icecream import ic -from transitions import State, Machine -from transitions.extensions.states import add_state_features, Timeout -import numpy as np - - -""" -Abstract base class for use with the Presenter of the behavbox model-view-presenter. -""" - - -class Pump(Protocol): - def reward(self, pump_key: str, reward_size: float): - ... - - -class GUI(Protocol): - keyboard_active: bool - - -class Box(Protocol): - def video_start(self): - ... - - def video_stop(self): - ... - - -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class Model(ABC): - event_list: list[str] - automate_training_rewards: bool - give_training_reward: bool - - trial_choice_list: list[int] = [] - trial_correct_list: list[bool] = [] - trial_choice_times: list[float] = [] - trial_reward_given: list[bool] = [] - - # Lick detection - lick_threshold = 2 - lick_side_buffer = np.zeros(2) - error_count = 0 - rewards_earned_in_block = 0 - - # def determine_choice(self) -> Union[int, np.ndarray[int]]: - # """Determine whether there has been a choice to the left ports, right ports, or a switch.""" - # - # sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides - # if sides_licked > 1: - # # made a switch, reset the counter - # self.lick_side_buffer *= 0 - # return -1 - # - # if np.amax(self.lick_side_buffer) >= self.lick_threshold: - # choice_ix = np.argmax(self.lick_side_buffer) # either 0 or 1 - # # choice = ['right', 'left'][choice_ix] - # self.lick_side_buffer *= 0 - # return choice_ix - # else: - # return -1 # no choice made/not enough licks - - def determine_choice(self) -> str: - """Determine whether there has been a choice to the left ports, right ports, or a switch.""" - - sides_licked = np.sum(self.lick_side_buffer.astype(bool)) # get nonzero sides - if sides_licked > 1: - # made a switch, reset the counter - self.lick_side_buffer *= 0 - choice = 'switch' - - elif np.amax(self.lick_side_buffer) >= self.lick_threshold: - choice_ix = np.argmax(self.lick_side_buffer) # either 0 or 1 - choice = ['right', 'left'][choice_ix] - self.lick_side_buffer *= 0 - else: - choice = '' # no choice made/not enough licks - return choice - - def log_correct_choice(self, choice: int, event_time: float) -> None: - self.trial_choice_list.append(choice) - self.trial_choice_times.append(event_time) - self.trial_correct_list.append(True) - self.error_count = 0 - - def log_incorrect_choice(self, choice: int, event_time: float) -> None: - self.trial_choice_list.append(choice) - self.trial_choice_times.append(event_time) - self.trial_correct_list.append(False) - self.error_count += 1 - - def log_training_reward(self, choice: int, event_time: float) -> None: - self.trial_choice_list.append(choice) - self.trial_choice_times.append(event_time) - self.trial_correct_list.append(False) - self.error_count = 0 - - def reset_counters(self) -> None: - self.lick_side_buffer *= 0 - self.rewards_earned_in_block = 0 - self.error_count = 0 - self.event_list.clear() - - def run_event_loop(self): - ... - - -class Presenter(ABC): - - interact_list: List[Tuple[float, str]] - pump: Pump - task: Model - gui: GUI - session_info: dict - box: Box - - def deliver_reward(self, pump_key: str, reward_size: int) -> None: - self.pump.reward(pump_key, reward_size) - # self.task.switch_to_timeout() - - def left_entry(self) -> None: - self.task.event_list.append("left_entry") - self.interact_list.append((time.time(), "left_entry")) - logging.info(";" + str(time.time()) + ";[action];left_entry") - - def center_entry(self) -> None: - self.task.event_list.append("center_entry") - self.interact_list.append((time.time(), "center_entry")) - logging.info(";" + str(time.time()) + ";[action];center_entry") - - def right_entry(self) -> None: - self.task.event_list.append("right_entry") - self.interact_list.append((time.time(), "right_entry")) - logging.info(";" + str(time.time()) + ";[action];right_entry") - - def left_exit(self) -> None: - self.task.event_list.append("left_exit") - self.interact_list.append((time.time(), "left_exit")) - logging.info(";" + str(time.time()) + ";[action];left_exit") - - def center_exit(self) -> None: - self.task.event_list.append("center_exit") - self.interact_list.append((time.time(), "center_exit")) - logging.info(";" + str(time.time()) + ";[action];center_exit") - - def right_exit(self) -> None: - self.task.event_list.append("right_exit") - self.interact_list.append((time.time(), "right_exit")) - logging.info(";" + str(time.time()) + ";[action];right_exit") - - def IR_1_entry(self) -> None: - self.task.event_list.append("IR_1_entry") - logging.info(str(time.time()) + ", IR_1_entry") - - def IR_2_entry(self) -> None: - self.task.event_list.append("IR_2_entry") - logging.info(str(time.time()) + ", IR_2_entry") - - def IR_3_entry(self) -> None: - self.task.event_list.append("IR_3_entry") - logging.info(str(time.time()) + ", IR_3_entry") - - def IR_4_entry(self) -> None: - self.task.event_list.append("IR_4_entry") - logging.info(str(time.time()) + ", IR_4_entry") - - def IR_5_entry(self) -> None: - self.task.event_list.append("IR_5_entry") - logging.info(str(time.time()) + ", IR_5_entry") - - def IR_1_exit(self) -> None: - self.task.event_list.append("IR_1_exit") - logging.info(str(time.time()) + ", IR_1_exit") - - def IR_2_exit(self) -> None: - self.task.event_list.append("IR_2_exit") - # self.cueLED2.off() - logging.info(str(time.time()) + ", IR_2_exit") - - def IR_3_exit(self) -> None: - self.task.event_list.append("IR_3_exit") - logging.info(str(time.time()) + ", IR_3_exit") - - def IR_4_exit(self) -> None: - self.task.event_list.append("IR_4_exit") - logging.info(str(time.time()) + ", IR_4_exit") - - def IR_5_exit(self) -> None: - self.task.event_list.append("IR_5_exit") - logging.info(str(time.time()) + ", IR_5_exit") - - def K_escape_callback(self) -> None: - self.gui.keyboard_active = False - - def K_1_down_callback(self) -> None: - # left entry - logging.info(";" + str(time.time()) + ";[action];key_pressed_left_entry()") - self.left_entry() - - def K_2_down_callback(self) -> None: - # center entry - logging.info(";" + str(time.time()) + ";[action];key_pressed_center_entry()") - self.center_entry() - - def K_3_down_callback(self) -> None: - # right entry - logging.info(";" + str(time.time()) + ";[action];key_pressed_right_entry()") - self.right_entry() - - def K_1_up_callback(self) -> None: - logging.info(";" + str(time.time()) + ";[action];key_released_left_entry()") - self.left_exit() - - def K_2_up_callback(self) -> None: - logging.info(";" + str(time.time()) + ";[action];key_released_center_entry()") - self.center_exit() - - def K_3_up_callback(self) -> None: - logging.info(";" + str(time.time()) + ";[action];key_released_right_entry()") - self.right_exit() - - def K_q_callback(self) -> None: - # print("Q down: syringe pump 1 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump1") - self.pump.reward("key_1", self.session_info["key_reward_amount"]) - - def K_w_callback(self) -> None: - # print("W down: syringe pump 2 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump2") - self.pump.reward("key_2", self.session_info["key_reward_amount"]) - - def K_e_callback(self) -> None: - # print("E down: syringe pump 3 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump3") - self.pump.reward("key_3", self.session_info["key_reward_amount"]) - - def K_r_callback(self) -> None: - # print("R down: syringe pump 4 moves") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump4") - self.pump.reward("key_4", self.session_info["key_reward_amount"]) - - def K_t_callback(self) -> None: - # print("T down: vacuum on") - logging.info(";" + str(time.time()) + ";[reward];key_pressed_pump_vacuum") - self.pump.reward("key_vacuum", 1) - - def K_a_callback(self) -> None: - # toggle automated training rewards - self.task.automate_training_rewards = not self.task.automate_training_rewards - - def K_g_callback(self) -> None: - # give training reward - self.task.give_training_reward = True - logging.info(";" + str(time.time()) + ";[action];set_give_reward_true") - - def print_controls(self) -> None: - print("[***] KEYBOARD CONTROLS [***]") - print("1, 2, 3: left/center/right nosepoke entry") - print("q, w, e, r: pump 1/2/3/4 reward delivery") - print("t: vacuum activation") - print("a: toggle automated training rewards") - print("g: give training reward") - - def start_session(self) -> None: - ic("TODO: start video") - self.box.video_start() - - def end_session(self) -> None: - ic("TODO: stop video") - self.box.video_stop() - self.update_plot(save_fig=True) - - @abstractmethod - def run(self) -> None: - ... - - @abstractmethod - def update_plot(self, save_fig=False) -> None: - ... diff --git a/task_protocol/gui.py b/task_protocol/gui.py deleted file mode 100644 index 16526e6..0000000 --- a/task_protocol/gui.py +++ /dev/null @@ -1,190 +0,0 @@ -import pygame -import pygame.display -from colorama import Fore, Style - -import matplotlib -matplotlib.use('module://pygame_matplotlib.backend_pygame') -import matplotlib.pyplot as plt -from typing import Protocol - - -RIGHT_IX = 0 -LEFT_IX = 1 - - -class Presenter(Protocol): - - def K_escape_callback(self): - ... - - def K_1_down_callback(self): - ... - - def K_2_down_callback(self): - ... - - def K_3_down_callback(self): - ... - - def K_1_up_callback(self): - ... - - def K_2_up_callback(self): - ... - - def K_3_up_callback(self): - ... - - def K_q_callback(self): - ... - - def K_w_callback(self): - ... - - def K_e_callback(self): - ... - - def K_r_callback(self): - ... - - def K_t_callback(self): - ... - - def K_a_callback(self): - ... - - def K_g_callback(self): - ... - - -class PerformanceFigure: - - def __init__(self, right_ix: int, left_ix: int): - fig, ax = plt.subplots() - self.figure = fig - self.correct_line = ax.plot([], color='g', marker="o", label='Correct', linestyle='', markersize=10)[0] - self.error_line = ax.plot([], color='r', marker="o", label='Error', linestyle='', markersize=10)[0] - self.reward_line = ax.plot([], color='b', marker="v", label='Reward given', linestyle='', markersize=5)[0] - self.text = ax.text(0.05, 0.95, '', transform=ax.transAxes, fontsize=14, - verticalalignment='top')#, bbox=props) - ax.set_yticks([right_ix, left_ix]) - ax.set_yticklabels(['right lick', 'left lick']) - plt.ylim([right_ix - .5, left_ix + .5]) - - -class GUI: - - def __init__(self, session_info: dict): - - self.figure_window = PerformanceFigure(RIGHT_IX, LEFT_IX) - self.fig_name = session_info['basedir'] + "/" + session_info['basename'] + "/" + \ - session_info['basename'] + "_choice_plot" + '.png' - - ############################################################################################### - # pygame window setup and keystroke handler - ############################################################################################### - try: - pygame.init() - self.main_display = pygame.display.set_mode((800, 600)) - pygame.display.set_caption(session_info["box_name"]) - self.check_plot(self.figure_window.figure) - - print( - "\nKeystroke handler initiated. In order for keystrokes to register, the pygame window" - ) - print("must be in the foreground.\n") - print( - Fore.GREEN - + Style.BRIGHT - + " TO EXIT, CLICK THE MAIN TEXT WINDOW AND PRESS CTRL-C " - + Fore.RED - + "ONCE\n" - + Style.RESET_ALL - ) - self.keyboard_active = True - - except Exception as error_message: - print("pygame issue\n") - print(str(error_message)) - - ############################################################################################### - # check for data visualization - uses pygame window to show behavior progress - ############################################################################################### - - def check_plot(self, figure=None, FPS=144, savefig=False): - if figure: - FramePerSec = pygame.time.Clock() - figure.canvas.draw() - self.main_display.blit(figure, (0, 0)) - pygame.display.update() - FramePerSec.tick(FPS) - - if savefig: - plt.figure(figure.number) - plt.savefig(self.fig_name) - - else: - print("No figure available") - - def set_callbacks(self, presenter: Presenter): - self.K_escape_callback = presenter.K_escape_callback - - self.K_1_down_callback = presenter.K_1_down_callback - self.K_2_down_callback = presenter.K_2_down_callback - self.K_3_down_callback = presenter.K_3_down_callback - - self.K_1_up_callback = presenter.K_1_up_callback - self.K_2_up_callback = presenter.K_2_up_callback - self.K_3_up_callback = presenter.K_3_up_callback - - self.K_q_callback = presenter.K_q_callback - self.K_w_callback = presenter.K_w_callback - self.K_e_callback = presenter.K_e_callback - self.K_r_callback = presenter.K_r_callback - self.K_t_callback = presenter.K_t_callback - self.K_a_callback = presenter.K_a_callback - self.K_g_callback = presenter.K_g_callback - - ############################################################################################### - # check for key presses - uses pygame window to simulate nosepokes and licks - ############################################################################################### - - def check_keyboard(self): - - if self.keyboard_active: - for event in pygame.event.get(): - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - self.K_escape_callback() - - # lick port interaction buttons - elif event.key == pygame.K_1: - self.K_1_down_callback() - elif event.key == pygame.K_2: - self.K_2_down_callback() - elif event.key == pygame.K_3: - self.K_3_down_callback() - - # interactive training functions - elif event.key == pygame.K_q: - self.K_q_callback() - elif event.key == pygame.K_w: - self.K_w_callback() - elif event.key == pygame.K_e: - self.K_e_callback() - elif event.key == pygame.K_r: - self.K_r_callback() - elif event.key == pygame.K_t: - self.K_t_callback() - elif event.key == pygame.K_a: - self.K_a_callback() - elif event.key == pygame.K_g: - self.K_g_callback() - - elif event.type == pygame.KEYUP: - if event.key == pygame.K_1: - self.K_1_up_callback() - elif event.key == pygame.K_2: - self.K_2_up_callback() - elif event.key == pygame.K_3: - self.K_3_up_callback() diff --git a/task_protocol/headfixed_task/__init__.py b/task_protocol/headfixed_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/headfixed_task/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/headfixed_task/headfixed_independent_reward_task.py b/task_protocol/headfixed_task/headfixed_independent_reward_task.py new file mode 100644 index 0000000..9484671 --- /dev/null +++ b/task_protocol/headfixed_task/headfixed_independent_reward_task.py @@ -0,0 +1,471 @@ +# python3: headfixed_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training task structure +description: + an updated test version of headfixed_task.py & add foraging reward condition + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class HeadfixedIndependentRewardTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["wait_for_choice"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.correct_trial_number = 0 + self.actual_trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = True + self.multiple_choice_error = False + self.error_repeat = False + + self.pump_num = None + self.reward_size = None + self.current_reward = None + self.reward_check = False + self.reward_size_offset = self.session_info['reward_size_offset'] + + self.block_count = 0 + self.blocknumber = self.session_info["block_number"] + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for foragaing parameters + self.side_choice = None # whether free choice is left or right + self.cue_state = None + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + cue_state = self.current_card[0] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + self.cue_state = cue_state # cue state for foraging + if cue_state == 'all': + side_choice = side_mice + if side_choice == 'left': + self.pump_num = self.current_card[2][0] + self.reward_size = self.current_reward[0] + print("self.current_reward[0]: " + str(self.current_reward[0])) + elif side_choice == 'right': + self.pump_num = self.current_card[2][1] + self.reward_size = self.current_reward[1] + print("self.current_reward[0]: " + str(self.current_reward[1])) + elif cue_state == 'LED_L': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[0] + elif cue_state == 'LED_R': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[1] + print("!!!!!!!!CUE_STATE: " + str(cue_state)) + if side_mice == side_choice: # if the animal chose correctly + self.side_mice_buffer = side_mice + if side_mice == side_choice: # if the animal chose correctly + if self.lick_count == 0: # if this is the first lick + self.side_choice = side_choice # foraging task + self.wrong_choice_error = False + self.reward_check = True + self.lick_count += 1 + self.restart() + elif self.side_mice_buffer: + if self.lick_count == 0: + self.wrong_choice_error = True + self.lick_count += 1 + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.early_lick_error = False + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.lick_count = 0 + self.side_mice_buffer = None + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + self.cue_off('sound1') + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if not self.early_lick_error: + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + if self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('no_choice_error') + elif self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('wrong_choice_error') + elif self.reward_check: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.pump.reward(self.pump_num, self.reward_size) + self.error_repeat = False + self.total_reward += 1 + self.reward_check = False + self.error_list.append('correct_trial') + self.pump_num = None + self.reward_size = None + self.wrong_choice_error = False + + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1, 0.1, 1) + elif cue == 'LED_L': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) + elif cue == 'all': + self.box.cueLED1.on() + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.cueLED1.off() + self.box.cueLED2.off() + elif cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'LED_L': + self.box.cueLED1.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/headfixed_task/headfixed_task.py b/task_protocol/headfixed_task/headfixed_task.py new file mode 100644 index 0000000..76c6da0 --- /dev/null +++ b/task_protocol/headfixed_task/headfixed_task.py @@ -0,0 +1,470 @@ +# python3: headfixed_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: headfixed2FC_task.py +goal: model_free reinforcement learning behavioral training task structure +description: + an updated test version of headfixed_task.py & add foraging reward condition + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class HeadfixedTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name="initiate", + on_enter=["enter_initiate"], + on_exit=["exit_initiate"], + timeout=self.session_info["initiation_timeout"], + on_timeout=["restart"]), + Timeout(name='cue_state', + on_enter=["enter_cue_state"], + on_exit=["exit_cue_state"], + timeout=self.session_info["cue_timeout"], + on_timeout=["restart"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["wait_for_choice"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'initiate'], + ['start_cue', 'initiate', 'cue_state'], + ['evaluate_reward', 'cue_state', 'reward_available'], + ['restart', ['initiate', 'cue_state', 'reward_available'], 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.correct_trial_number = 0 + self.actual_trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.early_lick_error = False + self.initiate_error = False + self.cue_state_error = False + self.wrong_choice_error = True + self.multiple_choice_error = False + self.error_repeat = False + + self.pump_num = None + self.reward_size = None + self.current_reward = None + self.reward_check = False + self.reward_size_offset = self.session_info['reward_size_offset'] + + self.block_count = 0 + self.blocknumber = self.session_info["block_number"] + self.current_card = None + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + + self.treadmill = self.box.treadmill + + self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + self.distance_buffer = None + self.distance_diff = 0 + + # for foragaing parameters + self.side_choice = None # whether free choice is left or right + self.cue_state = None + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + # there can only be lick during the reward available state + # if lick detected prior to reward available state + # the trial will restart and transition to standby + if self.event_name is "left_entry" or self.event_name == "right_entry": + # print("EVENT NAME !!!!!! " + self.event_name) + if self.state == "reward_available" or self.state == "standby" or self.state == "initiate": + pass + else: + self.early_lick_error = True + self.error_repeat = True + self.restart() + if self.state == "standby": + pass + elif self.state == "initiate": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_initiation: + self.initiate_error = False + self.start_cue() + else: + self.initiate_error = True + elif self.state == "cue_state": + self.distance_diff = self.get_distance() - self.distance_buffer + if self.distance_diff >= self.distance_cue: + self.cue_state_error = False + self.evaluate_reward() + else: + self.cue_state_error = True + elif self.state == "reward_available": + cue_state = self.current_card[0] + side_mice = None + if self.event_name == "left_entry": + side_mice = 'left' + self.left_poke_count += 1 + self.left_poke_count_list.append(self.left_poke_count) + self.timeline_left_poke.append(time.time()) + elif self.event_name == "right_entry": + side_mice = 'right' + self.right_poke_count += 1 + self.right_poke_count_list.append(self.right_poke_count) + self.timeline_right_poke.append(time.time()) + if side_mice: + self.side_mice_buffer = side_mice + self.cue_state = cue_state # cue state for foraging + if cue_state == 'all': + side_choice = side_mice + if side_choice == 'left': + self.pump_num = self.current_card[2][0] + self.reward_size = self.current_reward[0] + print("self.current_reward[0]: " + str(self.current_reward[0])) + elif side_choice == 'right': + self.pump_num = self.current_card[2][1] + self.reward_size = self.current_reward[1] + print("self.current_reward[0]: " + str(self.current_reward[1])) + elif cue_state == 'LED_L': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[0] + elif cue_state == 'LED_R': + side_choice = self.current_card[1] + self.pump_num = self.current_card[2] + self.reward_size = self.current_reward[1] + print("!!!!!!!!CUE_STATE: " + str(cue_state)) + if side_mice == side_choice: # if the animal chose correctly + self.side_mice_buffer = side_mice + if side_mice == side_choice: # if the animal chose correctly + if self.lick_count == 0: # if this is the first lick + self.side_choice = side_choice # foraging task + self.wrong_choice_error = False + self.reward_check = True + self.lick_count += 1 + self.restart() + elif self.side_mice_buffer: + if self.lick_count == 0: + self.wrong_choice_error = True + self.lick_count += 1 + self.restart() + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + if self.early_lick_error: + self.error_list.append("early_lick_error") + logging.info(";" + str(time.time()) + ";[error];early_lick_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.early_lick_error = False + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.actual_trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.lick_count = 0 + self.side_mice_buffer = None + self.box.event_list.clear() + pass + + def enter_initiate(self): + # print("!!!!!!!!!!!event name is " + self.event_name) # for debugging purposes + # check error_repeat + logging.info(";" + str(time.time()) + ";[transition];enter_initiate;" + str(self.error_repeat)) + self.check_cue('sound1') + self.trial_running = True + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_initiate(self): + # check the flag to see whether to shuffle or keep the original card + logging.info(";" + str(time.time()) + ";[transition];exit_initiate;" + str(self.error_repeat)) + print("EVENT NAME: " + str(self.box.event_list)) + self.cue_off('sound1') + if self.initiate_error: + self.error_list.append('initiate_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];initiate_error;" + str(self.error_repeat)) + self.error_count += 1 + + def enter_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cue_state;" + str(self.error_repeat)) + # turn on the cue according to the current card + self.check_cue(self.current_card[0]) + # wait for treadmill signal and process the treadmill signal + self.distance_buffer = self.get_distance() + logging.info( + ";" + str(time.time()) + ";[treadmill];" + str(self.distance_buffer) + ";" + str(self.error_repeat)) + + def exit_cue_state(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cue_state;" + str(self.error_repeat)) + self.cue_off(self.current_card[0]) + if not self.early_lick_error: + if self.cue_state_error: + self.check_cue("sound2") + self.error_list.append('cue_state_error') + self.error_repeat = True + logging.info(";" + str(time.time()) + ";[error];cue_state_error;" + str(self.error_repeat)) + self.error_count += 1 + self.cue_state_error = False + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + print(str(time.time()) + ", " + str(self.actual_trial_number) + ", cue_state distance satisfied") + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + if self.lick_count == 0: + logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('no_choice_error') + elif self.wrong_choice_error: + logging.info(";" + str(time.time()) + ";[error];wrong_choice_error;" + str(self.error_repeat)) + self.check_cue('sound2') + self.error_repeat = True + self.error_count += 1 + self.error_list.append('wrong_choice_error') + elif self.reward_check: + logging.info(";" + str(time.time()) + ";[error];correct_trial;" + str(self.error_repeat)) + self.pump.reward(self.pump_num, self.reward_size) + self.error_repeat = False + self.total_reward += 1 + self.reward_check = False + self.error_list.append('correct_trial') + self.pump_num = None + self.reward_size = None + self.wrong_choice_error = False + + + def check_cue(self, cue): + if cue == 'sound1': + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_on;" + str(self.error_repeat)) + self.box.sound1.on() + if cue == 'sound2': + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_on;" + str(self.error_repeat)) + self.box.sound2.blink(1, 0.1, 1) + elif cue == 'LED_L': + self.box.cueLED1.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_L_on;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];cueLED_R_on;" + str(self.error_repeat)) + elif cue == 'all': + self.box.cueLED1.on() + self.box.cueLED2.on() + logging.info(";" + str(time.time()) + ";[cue];LED_L+R_on; " + str(self.error_repeat)) + + def cue_off(self, cue): + if cue == 'all': + self.box.cueLED1.off() + self.box.cueLED2.off() + elif cue == 'sound1': + self.box.sound1.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound1_off;" + str(self.error_repeat)) + elif cue == 'sound2': + self.box.sound2.off() + logging.info(";" + str(time.time()) + ";[cue];cue_sound2_off;" + str(self.error_repeat)) + elif cue == 'LED_L': + self.box.cueLED1.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED1_off;" + str(self.error_repeat)) + elif cue == 'LED_R': + self.box.cueLED2.off() + logging.info(";" + str(time.time()) + ";[cue];cueLED2_off;" + str(self.error_repeat)) + + def get_distance(self): + try: + distance = self.treadmill.distance_cm + except Exception as e: + logging.info(";" + str(time.time()) + ";[system_error];" + str(e) + ";" + str(self.error_repeat)) + self.treadmill = self.box.treadmill + distance = self.treadmill.distance_cm + return distance + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax.plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.left_poke_count_list + time_left = self.timeline_left_poke + trajectory_right = self.right_poke_count_list + time_right = self.timeline_right_poke + print(type(fig)) + + ax[0].plot(time_left, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_right, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py b/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py new file mode 100644 index 0000000..1957312 --- /dev/null +++ b/task_protocol/headfixed_task/run_headfixed_independent_reward_task.py @@ -0,0 +1,265 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed2FC_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: run_headfixed_independent_reward_task.py +goal: model_free reinforcement learning behavioral training run task file +description: + an updated test version of run_headfixed_task.py & add foraging task + +""" +import random +import numpy as np +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed_independent_reward_task import HeadfixedIndependentRewardTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + + import sys + + session_info_path = '/home/pi/experiment_info/headfixed_independent_reward_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_independent_reward import TaskInformation + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + task = HeadfixedIndependentRewardTask(name="headfixed_independent_reward_task", session_info=session_info) + + + def cumsum_positive(input_list): + for index in range(len(input_list)): + if index == 0 and input_list[index] < 0: + input_list[index] = -input_list[index] + elif input_list[index] + input_list[index - 1] < 0: + input_list[index] = input_list[index] - input_list[index - 1] + else: + input_list[index] = input_list[index] + input_list[index - 1] + return input_list + + def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials / change_point)): + temp = np.random.randn(change_point) * scale + rewards_L.append(cumsum_positive(temp) + offset) + temp = np.random.randn(change_point) * scale + rewards_R.append(cumsum_positive(temp) + offset) + rewards_L = np.hstack(rewards_L) + rewards_R = np.hstack(rewards_R) + # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials, :] + # print(reward_LR) + return reward_LR + + def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only + session_start = random.uniform(0, period_width) + session_end = session_start + session_length + value_input = np.arange(session_start, session_end, increment) + + sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale + negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale + left_side_reward = np.random.normal(sine_output, deviation) + right_side_reward = np.random.normal(negative_sine_output, deviation) + reward_list = list(zip(left_side_reward, right_side_reward)) + return reward_list + + if session_info['phase'] == "independent_reward": + # from reward_distribution import generate_reward_trajectory + scale = session_info['independent_reward']['scale'] + offset = session_info['independent_reward']['offset'] + change_point = session_info['independent_reward']['change_point'] + ntrials = session_info['independent_reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + elif session_info['phase'] == "forced_choice": + reward_size = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + session_length = session_info["sine_reward"]["session_length"] + increment = session_info["sine_reward"]["increment"] + period_width = session_info["sine_reward"]["period_width"] + amplitude_offset = session_info["sine_reward"]["amplitude_offset"] + amplitude_scale = session_info["sine_reward"]["amplitude_scale"] + deviation = session_info["sine_reward"]["deviation"] + reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, + amplitude_scale, deviation, session_length) + elif session_info['phase'] == 'foraging_reward': + offset = session_info['foraging_reward']['offset'] + max_reward = session_info['foraging_reward']['max_reward'] + increment = session_info['foraging_reward']['increment'] + reward_distribution = (3,3) + + + first_trial_of_the_session = True + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info + t_end = time.time() + 60 * t_minute + while time.time() < t_end: # time check + if task.error_repeat: # error repeat check + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("Trial " + str(task.actual_trial_number) + " \n") + task.actual_trial_number += 1 + print("*******************************\n") + print("*error_repeat trial* \n" + + " - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + else: + if not first_trial_of_the_session: + print("reward_time_out: " + str(session_info["reward_timeout"])) + sleep(session_info["reward_timeout"]) + else: + first_trial_of_the_session = False + # setup the beginning of a new trial + task.error_count = 0 # reset the error count if previous trial is correct + print("Trial " + str(task.actual_trial_number) + " \n") + task.correct_trial_number += 1 + task.actual_trial_number += 1 + print("*******************************\n") + # acquire new reward contingency and cue association + #print("fraction " + str(session_info['fraction']) + " \n") + task.current_card = task_information.draw_card(session_info['phase'], session_info['fraction']) + if session_info['phase'] == "independent_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) + elif session_info['phase'] == "forced_choice": + task.current_reward = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + elif session_info['phase'] == 'foraging_reward': + reward_L = reward_distribution[0] + reward_R = reward_distribution[1] + task.current_reward = reward_distribution + if task.cue_state == 'all': + if task.side_choice == 'left': + reward_L = reward_L - increment + reward_R = reward_R + increment + if reward_L < 0: + reward_L = 0 + if reward_R > max_reward: + reward_R = max_reward + elif task.side_choice == 'right': + reward_R = reward_R - increment + reward_L = reward_L + increment + if reward_R < 0: + reward_R = 0 + if reward_L > max_reward: + reward_L = max_reward + reward_distribution = (reward_L, reward_R) + task.current_reward = reward_distribution + + + logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + + ";current_reward_" + str(task.current_reward)[1:-1]) + + print(" - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() \ No newline at end of file diff --git a/task_protocol/headfixed_task/run_headfixed_task.py b/task_protocol/headfixed_task/run_headfixed_task.py new file mode 100644 index 0000000..be08437 --- /dev/null +++ b/task_protocol/headfixed_task/run_headfixed_task.py @@ -0,0 +1,265 @@ +#!/usr/bin/env -S ipython3 -i +# run_headfixed2FC_task.py +""" +author: tian qiu & Soyoun Kim +date: 2023-02-16 +name: run_headfixed_independent_reward_task.py +goal: model_free reinforcement learning behavioral training run task file +description: + an updated test version of run_headfixed_task.py & add foraging task + +""" +import random +import numpy as np +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from headfixed_task import HeadfixedTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + + import sys + + session_info_path = '/home/pi/experiment_info/headfixed_task/session_info' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + from task_information_independent_reward import TaskInformation + task_information = TaskInformation() + # print("Imported task_information_headfixed: " + str(task_information.name)) + task = HeadfixedTask(name="headfixed_task", session_info=session_info) + + + def cumsum_positive(input_list): + for index in range(len(input_list)): + if index == 0 and input_list[index] < 0: + input_list[index] = -input_list[index] + elif input_list[index] + input_list[index - 1] < 0: + input_list[index] = input_list[index] - input_list[index - 1] + else: + input_list[index] = input_list[index] + input_list[index - 1] + return input_list + + def generate_reward_trajectory(scale=0.5, offset=3.0, change_point=20, ntrials=200): + # initial reward (need to be random) + rewards_L = [1] + rewards_R = [1] + for a in np.arange(np.round(ntrials / change_point)): + temp = np.random.randn(change_point) * scale + rewards_L.append(cumsum_positive(temp) + offset) + temp = np.random.randn(change_point) * scale + rewards_R.append(cumsum_positive(temp) + offset) + rewards_L = np.hstack(rewards_L) + rewards_R = np.hstack(rewards_R) + # plt.plot(rewards_L,'b');plt.plot(rewards_R,'r--') + reward_LR = [rewards_L, rewards_R] + reward_LR = np.transpose(np.array(reward_LR)) + reward_LR = reward_LR[0:ntrials, :] + # print(reward_LR) + return reward_LR + + def generate_sine_wave(increment, period_width, amplitude_offset, amplitude_scale, deviation, session_length): # for training purpose only + session_start = random.uniform(0, period_width) + session_end = session_start + session_length + value_input = np.arange(session_start, session_end, increment) + + sine_output = (np.sin((np.pi / period_width) * value_input) + amplitude_offset) * amplitude_scale + negative_sine_output = (np.sin((np.pi / period_width) * -value_input) + amplitude_offset) * amplitude_scale + left_side_reward = np.random.normal(sine_output, deviation) + right_side_reward = np.random.normal(negative_sine_output, deviation) + reward_list = list(zip(left_side_reward, right_side_reward)) + return reward_list + + if session_info['phase'] == "independent_reward": + # from reward_distribution import generate_reward_trajectory + scale = session_info['independent_reward']['scale'] + offset = session_info['independent_reward']['offset'] + change_point = session_info['independent_reward']['change_point'] + ntrials = session_info['independent_reward']['ntrials'] + reward_distribution_list = generate_reward_trajectory(scale, offset, change_point, ntrials) + elif session_info['phase'] == "forced_choice": + reward_size = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + session_length = session_info["sine_reward"]["session_length"] + increment = session_info["sine_reward"]["increment"] + period_width = session_info["sine_reward"]["period_width"] + amplitude_offset = session_info["sine_reward"]["amplitude_offset"] + amplitude_scale = session_info["sine_reward"]["amplitude_scale"] + deviation = session_info["sine_reward"]["deviation"] + reward_distribution_list = generate_sine_wave(increment, period_width, amplitude_offset, + amplitude_scale, deviation, session_length) + elif session_info['phase'] == 'foraging_reward': + offset = session_info['foraging_reward']['offset'] + max_reward = session_info['foraging_reward']['max_reward'] + increment = session_info['foraging_reward']['increment'] + reward_distribution = (3,3) + + + first_trial_of_the_session = True + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) # wll add in the session info + t_end = time.time() + 60 * t_minute + while time.time() < t_end: # time check + if task.error_repeat: # error repeat check + task.error_repeat = False + print("punishment_time_out: " + str(session_info["punishment_timeout"])) + sleep(session_info["punishment_timeout"]) + print("Trial " + str(task.actual_trial_number) + " \n") + task.actual_trial_number += 1 + print("*******************************\n") + print("*error_repeat trial* \n" + + " - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + else: + if not first_trial_of_the_session: + print("reward_time_out: " + str(session_info["reward_timeout"])) + sleep(session_info["reward_timeout"]) + else: + first_trial_of_the_session = False + # setup the beginning of a new trial + task.error_count = 0 # reset the error count if previous trial is correct + print("Trial " + str(task.actual_trial_number) + " \n") + task.correct_trial_number += 1 + task.actual_trial_number += 1 + print("*******************************\n") + # acquire new reward contingency and cue association + #print("fraction " + str(session_info['fraction']) + " \n") + task.current_card = task_information.draw_card(session_info['phase'], session_info['fraction']) + if session_info['phase'] == "independent_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + float(task.reward_size_offset) + elif session_info['phase'] == "forced_choice": + task.current_reward = session_info['reward_size'] + elif session_info['phase'] == "sine_reward": + task.current_reward = reward_distribution_list[task.correct_trial_number] + elif session_info['phase'] == 'foraging_reward': + reward_L = reward_distribution[0] + reward_R = reward_distribution[1] + task.current_reward = reward_distribution + if task.cue_state == 'all': + if task.side_choice == 'left': + reward_L = reward_L - increment + reward_R = reward_R + increment + if reward_L < 0: + reward_L = 0 + if reward_R > max_reward: + reward_R = max_reward + elif task.side_choice == 'right': + reward_R = reward_R - increment + reward_L = reward_L + increment + if reward_R < 0: + reward_R = 0 + if reward_L > max_reward: + reward_L = max_reward + reward_distribution = (reward_L, reward_R) + task.current_reward = reward_distribution + + + logging.info(";" + str(time.time()) + ";[condition];current_card_" + str(task.current_card) + + ";current_reward_" + str(task.current_reward)[1:-1]) + + print(" - Current card condition: \n" + + "*******************************\n" + + "*reward_side: " + str(task.current_card[0]) + "\n" + + "*reward_size: " + str(task.current_reward)[1:-1] + "\n") + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() \ No newline at end of file diff --git a/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py b/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py new file mode 100644 index 0000000..4c4bbf1 --- /dev/null +++ b/task_protocol/headfixed_task/session_info_headfixed_independent_reward.py @@ -0,0 +1,130 @@ +from datetime import datetime +import os +import pysistence, collections +import socket +import pandas as pd +import numpy as np + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 0.0 +session_info['manual_date'] = '2023-07-13' +session_info['box_name'] = socket.gethostname() +session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts + +session_info['config'] = 'headfixed2FC' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info["lick_threshold"] = 1 +# visual stimulus +session_info["visual_stimulus"] = False + +session_info['config'] = 'headfixed2FC' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice +session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' + + + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_cue'] = 5 # cm + session_info['treadmill_setup']['distance_initiation'] = 10 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['LED_L', 'LED_R', 'all'] +# session_info['state'] = ['block1', 'block2'] # +session_info['choice'] = ['right', 'left'] # lick port +session_info['air_duration'] = 0 +session_info["vacuum_duration"] = 1 + +""" solenoid calibration information configuration """ + +solenoid_coeff = None +def get_coefficient(): + df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") + pump_coefficient = {} + + for pump_num in range(1, 5): + df_pump = df_calibration[df_calibration['pump_number'] == pump_num] + mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) + on_time = df_pump['on_time'] + + fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first + pump_coefficient[str(pump_num)] = fit_calibration + return pump_coefficient + +try: + solenoid_coeff = get_coefficient() +except Exception as e: + print(e) + +session_info["calibration_coefficient"] = {} + +if solenoid_coeff: + session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] + session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] + session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] + session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] +else: + print("No coefficients, generate the default") + # solenoid valve linear fit coefficient for each pump + session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first + session_info["calibration_coefficient"]['2'] = [0.13, 0] + session_info["calibration_coefficient"]['3'] = [0.13, 0.0] + session_info["calibration_coefficient"]['4'] = [0.13, 0.0] + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['wait_for_choice'] = 60 +session_info['reward_timeout'] = 1 +session_info["punishment_timeout"] = 3 + +session_info["key_reward_amount"] = 2 +session_info['reward_size_offset'] = 2 +session_info['reward_size'] = (5, 5) + +if session_info["phase"] == 'independent_reward': + session_info['independent_reward'] = {} + session_info['independent_reward']['scale'] = 0.5 + session_info['independent_reward']['offset'] = 3.0 + session_info['independent_reward']['change_point'] = 20 + session_info['independent_reward']['ntrials'] = 1000 +elif session_info["phase"] == 'sine_reward': + session_info["sine_reward"] = {} + session_info["sine_reward"]["increment"] = 1 + session_info["sine_reward"]["period_width"] = 40 + session_info["sine_reward"]["amplitude_offset"] = 2 + session_info["sine_reward"]["amplitude_scale"] = 3 + session_info["sine_reward"]["deviation"] = 0 +elif session_info['phase'] == 'foraging_reward': + session_info["foraging_reward"] = {} + session_info["foraging_reward"]["increment"] = 0.25 + session_info["foraging_reward"]["offset"] = 3 + session_info["foraging_reward"]["max_reward"] = 10 + + +session_info['consecutive_control'] = False +if session_info['consecutive_control']: + session_info['consecutive_max'] = 3 \ No newline at end of file diff --git a/task_protocol/headfixed_task/session_info_headfixed_task.py b/task_protocol/headfixed_task/session_info_headfixed_task.py new file mode 100644 index 0000000..5b8795d --- /dev/null +++ b/task_protocol/headfixed_task/session_info_headfixed_task.py @@ -0,0 +1,131 @@ +from datetime import datetime +import os +import pysistence, collections +import socket +import pandas as pd +import numpy as np + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 0.0 +session_info['manual_date'] = '2023-07-13' +session_info['box_name'] = socket.gethostname() +session_info['block_number'] = 1 # 1 (left large) or 2 (right large) which block starts + +session_info['config'] = 'headfixed2FC' + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info["lick_threshold"] = 1 +# visual stimulus +session_info["visual_stimulus"] = False + +session_info['config'] = 'headfixed2FC' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +session_info['fraction'] = 0.3 # 0.3, 0.5,0.7,1 # free choice fraction 1 for all free choice +session_info['phase'] = 'foraging_reward' # 'forced_choice', 'sine_reward' + + + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_cue'] = 5 # cm + session_info['treadmill_setup']['distance_initiation'] = 10 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info['cue'] = ['LED_L', 'LED_R', 'all'] +# session_info['state'] = ['block1', 'block2'] # +session_info['choice'] = ['right', 'left'] # lick port +session_info['air_duration'] = 0 +session_info["vacuum_duration"] = 1 + +""" solenoid calibration information configuration """ + +solenoid_coeff = None +def get_coefficient(): + df_calibration = pd.read_csv("~/experiment_info/calibration_info/calibration.csv") + pump_coefficient = {} + + for pump_num in range(1, 5): + df_pump = df_calibration[df_calibration['pump_number'] == pump_num] + mg_per_pulse = df_pump['weight_fluid'].div(df_pump['iteration']) + on_time = df_pump['on_time'] + + fit_calibration = np.polyfit(mg_per_pulse, on_time, 1) # output with highest power first + pump_coefficient[str(pump_num)] = fit_calibration + return pump_coefficient + +try: + solenoid_coeff = get_coefficient() +except Exception as e: + print(e) + +session_info["calibration_coefficient"] = {} + +if solenoid_coeff: + session_info["calibration_coefficient"]['1'] = solenoid_coeff["1"] + session_info["calibration_coefficient"]['2'] = solenoid_coeff["2"] + session_info["calibration_coefficient"]['3'] = solenoid_coeff["3"] + session_info["calibration_coefficient"]['4'] = solenoid_coeff["4"] +else: + print("No coefficients, generate the default") + # solenoid valve linear fit coefficient for each pump + session_info["calibration_coefficient"]['1'] = [0.13, 0] # highest power first + session_info["calibration_coefficient"]['2'] = [0.13, 0] + session_info["calibration_coefficient"]['3'] = [0.13, 0.0] + session_info["calibration_coefficient"]['4'] = [0.13, 0.0] + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['wait_for_choice'] = 60 +session_info['reward_timeout'] = 1 +session_info["punishment_timeout"] = 3 + +session_info["key_reward_amount"] = 2 +session_info['reward_size_offset'] = 2 +session_info['reward_size'] = (5, 5) + +if session_info["phase"] == 'independent_reward': + session_info['independent_reward'] = {} + session_info['independent_reward']['scale'] = 0.5 + session_info['independent_reward']['offset'] = 3.0 + session_info['independent_reward']['change_point'] = 20 + session_info['independent_reward']['ntrials'] = 1000 +elif session_info["phase"] == 'sine_reward': + session_info["sine_reward"] = {} + session_info["sine_reward"]["increment"] = 1 + session_info["sine_reward"]["period_width"] = 40 + session_info["sine_reward"]["amplitude_offset"] = 2 + session_info["sine_reward"]["amplitude_scale"] = 3 + session_info["sine_reward"]["deviation"] = 0 +elif session_info['phase'] == 'foraging_reward': + session_info["foraging_reward"] = {} + session_info["foraging_reward"]["increment"] = 0.25 + session_info["foraging_reward"]["offset"] = 3 + session_info["foraging_reward"]["max_reward"] = 10 + + +session_info['consecutive_control'] = False +if session_info['consecutive_control']: + session_info['consecutive_max'] = 3 + diff --git a/task_protocol/headfixed_task/task_information_headfixed.py b/task_protocol/headfixed_task/task_information_headfixed.py new file mode 100644 index 0000000..ddcf184 --- /dev/null +++ b/task_protocol/headfixed_task/task_information_headfixed.py @@ -0,0 +1,46 @@ +import random + + +class TaskInformation(object): + def __init__(self, **kwargs): + self.name = "model_based_reinforcement_learning_task" + self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ] + + def draw_card(self, phase="independent_reward", fraction=0.5): + row_start = 0 + row_end = len(self.deck)-1 + + if phase == 'forced_choice': + row_end = 1 + elif phase == 'free_choice': + row_start = 9 + elif phase == 'forced_choice_left': + row_end = 0 + elif phase == 'forced_choice_right': + row_start = 1 + row_end = 1 + else: + if fraction == 0.5: + row_start = 8 + row_end = 11 + elif fraction == 0.7: + row_start = 6 + elif fraction == 0.3: + row_end = 13 + elif fraction == 1: + row_start = 11 + + card = self.deck[random.randint(row_start, row_end)] + return card + +# print(TaskInformation().draw_card()) diff --git a/task_protocol/headfixed_task/task_information_independent_reward.py b/task_protocol/headfixed_task/task_information_independent_reward.py new file mode 100644 index 0000000..a423b6d --- /dev/null +++ b/task_protocol/headfixed_task/task_information_independent_reward.py @@ -0,0 +1,46 @@ +import random + + +class TaskInformation(object): + def __init__(self, **kwargs): + self.name = "model_based_reinforcement_learning_task" + self.deck = [('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('LED_L', 'left', '1'), ('LED_R', 'right', '2'), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ('all', ('left', 'right'), ('1', '2')), ('all', ('left', 'right'), ('1', '2')), + ] + + def draw_card(self, phase="independent_reward", fraction=0.5): + row_start = 0 + row_end = len(self.deck)-1 + + if phase == 'forced_choice': + row_end = 1 + elif phase == 'free_choice': + row_start = 9 + elif phase == 'forced_choice_left': + row_end = 0 + elif phase == 'forced_choice_right': + row_start = 1 + row_end = 1 + else: + if fraction == 0.5: + row_start = 8 + row_end = 11 + elif fraction == 0.7: + row_start = 6 + elif fraction == 0.3: + row_end = 13 + elif fraction == 1: + row_start = 11 + + card = self.deck[random.randint(row_start, row_end)] + return card + +# print(TaskInformation().draw_card()) \ No newline at end of file diff --git a/task_protocol/kelly_task/__init__.py b/task_protocol/kelly_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/kelly_task/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/kelly_task/kelly_record_task.py b/task_protocol/kelly_task/kelly_record_task.py new file mode 100755 index 0000000..a149eb8 --- /dev/null +++ b/task_protocol/kelly_task/kelly_record_task.py @@ -0,0 +1,60 @@ +# Kelly recording task +# This task is designed for recording freely moving animal behavioral task + +import logging +from datetime import datetime +import os +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled + +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox +class KellyRecordTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + print(self.session_info) + + # initialize behavior box + # self.box = behavbox_test.BehavBoxTest(self.session_info) + self.box = behavbox.BehavBox(self.session_info) + def start_session(self): + print("Start recording video") + self.box.video_start() + + def end_session(self): + print("Stop recording video") + self.box.video_stop() diff --git a/task_protocol/kelly_task/kelly_task.py b/task_protocol/kelly_task/kelly_task.py new file mode 100755 index 0000000..f3ce1f1 --- /dev/null +++ b/task_protocol/kelly_task/kelly_task.py @@ -0,0 +1,183 @@ +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class KellyTask(object): + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + ######################################################################## + # Task has three possible states: standby, reward_available, and cue + ######################################################################## + self.states = [ + State(name="standby", on_enter=["enter_standby"], on_exit=["exit_standby"]), + Timeout( + name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + ), + Timeout( + name="cue", + on_enter=["enter_cue"], + on_exit=["exit_cue"], + timeout=self.session_info["timeout_length"], + on_timeout=["timeup"], + ), + ] + # can set later with task.machine.states['cue'].timeout etc. + + ######################################################################## + # list of possible transitions between states + # format is: [event_name, source_state, destination_state] + ######################################################################## + self.transitions = [ + ["trial_start", "standby", "reward_available"], + ["active_poke", "reward_available", "cue"], + ["timeup", "cue", "standby"], + ] + + ######################################################################## + # initialize state machine and behavior box + ######################################################################## + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial="standby", + ) + self.trial_running = False + + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = behavbox.Pump() + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def enter_standby(self): + print("entering standby") + # self.box.sound2.blink(0.5, 0.1, 1) + self.trial_running = False + + def exit_standby(self): + pass + + def enter_reward_available(self): + print("entering reward_available") + print("start white noise") + self.box.sound1.blink(0.5, 0.1, 1) + self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0]) + self.trial_running = True + + def exit_reward_available(self): + print("stop white noise") + + def enter_cue(self): + print("deliver reward") + self.box.cueLED4.on() + self.box.sound3.blink(0.5, 0.1, 1) + # self.pump.reward("left", self.session_info["reward_size"]) + print("start cue") + self.box.cueLED4.off() + # self.box.cueLED1.on() + + + def exit_cue(self): + print("stop cue") + # self.box.sound3.blink(0.5, 0.1, 1) + # self.box.cueLED1.off() + + ######################################################################## + # call the run() method repeatedly in a while loop in the main session + # script it will process all detected events from the behavior box (e.g. + # nosepokes and licks) and trigger the appropriate state transitions + ######################################################################## + def run(self): + + # read in name of an event the box has detected + if self.box.event_list: + event_name = self.box.event_list.popleft() + else: + event_name = "" + + if self.state == "standby": + pass + + elif self.state == "reward_available": + if event_name == "left_IR_entry": + # self.box.sound2.blink(0.5,0.1,1) + self.pump.reward("1", self.session_info["reward_size"]) + self.active_poke() # triggers state transition + if event_name == "right_IR_entry": + self.pump.reward("3", self.session_info["reward_size"]) + # self.box.sound2.blink(0.5,0.1,1) + self.active_poke() # triggers state transition + elif self.state == "cue": + # self.box.sound3.blink(0.5, 0.1, 1) + pass + + # look for keystrokes + self.box.check_keybd() + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.box.video_stop() + self.box.visualstim.myscreen.close() \ No newline at end of file diff --git a/task_protocol/kelly_task/run_kelly_task.py b/task_protocol/kelly_task/run_kelly_task.py new file mode 100755 index 0000000..2c03e74 --- /dev/null +++ b/task_protocol/kelly_task/run_kelly_task.py @@ -0,0 +1,126 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +from icecream import ic +import logging +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from kelly_task import KellyTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + task_info_path = '/home/pi/experiment_info/kelly_task/session_info' + sys.path.insert(0, task_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + # session_info['file_basename'] = session_info['mouse_name'] + "_" + session_info['datetime'] + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + # initiate task object\ + task = KellyTask(name="fentanyl_task", session_info=session_info) + + # # you can change various parameters if you want + # task.machine.states['cue'].timeout = 2 + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump(session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + sleep(10) + # loop over trials + for i in range(2): + logging.info(str("##############################\n" + + str(time.time())) + ", starting_trial, " + str(i) + + str("\n##############################")) + + task.trial_start() + + while task.trial_running: + task.run() + + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + pygame.quit() + + +# # exit because of error +# except (RuntimeError) as ex: +# print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) +# # save dicts to disk +# scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) +# pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + + + + diff --git a/task_protocol/kelly_task/run_record_task.py b/task_protocol/kelly_task/run_record_task.py new file mode 100755 index 0000000..66c7e31 --- /dev/null +++ b/task_protocol/kelly_task/run_record_task.py @@ -0,0 +1,100 @@ +#!/usr/bin/env -S ipython3 -i + +debug_enable = False + +import logging +from datetime import datetime +import os +import logging.config +import socket +import importlib +import colorama +from colorama import Fore, Style +import scipy.io, pickle +from time import sleep + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from kelly_record_task import KellyRecordTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + # There should be a session_info module corresponding to this before running this file + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + task_info_path = '/home/pi/experiment_info/record_task/session_info' + sys.path.insert(0, task_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['mouse_name'] + "_" + session_info[ + 'datetime'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # initiate task object\ + task = KellyRecordTask(name="fentanyl_task", session_info=session_info) + + # start session + print("start_session") + duration_buffer = 10 # it takes 8 seconds for the camera and the video_start function to be set up + duration = int(input("Enter the time in seconds: ")) + duration_buffer + task.start_session() + sleep(duration) + task.end_session() + dir_name = session_info['dir_name'] + basename = session_info['basename'] + file_name = dir_name + "/" + basename + base_dir = '/mnt/hd/' + hd_dir = base_dir + basename + + # Per Kelly's request, remove all the files except the video file from the hard drive +# print("Remove mat - ") +# os.system("rm -r " + hd_dir + "/*.mat") +# print("Remove pkl - ") +# os.system("rm -r " + hd_dir + "/*.pkl") +# print("Remove log -") +# os.system("rm -r " + hd_dir + "/*.log") + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + task.end_session() + # # save dicts to disk + # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) + # # pygame.quit() + + +# exit because of error +except (RuntimeError) as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # # save dicts to disk + # scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info' : session_info}) + # pickle.dump( session_info, open( session_info['file_basename'] + '_session_info.pkl', "wb" ) ) diff --git a/task_protocol/kelly_task/session_info_year-month-date.py b/task_protocol/kelly_task/session_info_year-month-date.py new file mode 100755 index 0000000..5abf3e8 --- /dev/null +++ b/task_protocol/kelly_task/session_info_year-month-date.py @@ -0,0 +1,65 @@ +# put all of your mouse and session info in here +import random +from datetime import datetime +import os +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] +# session_info['trainingPhase'] = 4 +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' +# for actual data save to this dir: +# session_info['basedir'] = '/home/pi/video' +session_info['weight'] = 32.18 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +# session_info['config'] = 'freely_moving_v1' +session_info['experiment_setup'] = 'head_fixed' +session_info['treadmill'] = True +session_info['treadmill_setup'] = {} +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 5 # cm + session_info['treadmill_setup']['distance_short'] = 7 # cm + session_info['treadmill_setup']['distance_long'] = 30 # cm + +# behavior parameters +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['cue_timeout'] = 120 +session_info['reward_timeout'] = 5 +session_info["reward_wait"] = 5 +session_info["punishment_timeout"] = 0 + +# error repeat +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_repeat_max'] = 3 + +# reward parameters +# session_info['reward_size'] = 10 # in microliters +session_info['reward_size'] = {'small': 5, 'large': 10} # in microliters + +# visual stimulus +session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/gratings/first_grating.dat', +# '/home/pi/gratings/second_grating.dat'] +session_info['vis_gratings'] = [] +session_info['vis_raws'] = [] + +# define block_duration and initial block to start the session +session_info['block_duration'] = 2 # each block has this amount of repetition +session_info['block_variety'] = 2 +if session_info['block_variety'] > 1: + initial_block = 1 diff --git a/task_protocol/latent_inference_forage/__init__.py b/task_protocol/latent_inference_forage/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_model.py b/task_protocol/latent_inference_forage/latent_inference_forage_model.py deleted file mode 100644 index f99c3a7..0000000 --- a/task_protocol/latent_inference_forage/latent_inference_forage_model.py +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# python3: latent_inference_forage_task_three_states.py -""" -author: Mitch Farrell; edited Matthew Chin -last updated: 2024-01-24 -name: latent_inference_forage_task_three_states.py -""" -from transitions import State, Machine -from task_protocol.base_classes import TimedStateMachine, Model - -from icecream import ic -import logging -import time - -import numpy as np - -import logging.config -from collections import deque -from typing import Protocol, List, Tuple, Union - -import logging.config -import threading - -rng = np.random.default_rng() -RIGHT_IX = 0 -LEFT_IX = 1 - - -class LatentInferenceForageModel(Model): # subclass from base task - - def __init__(self, session_info: dict): - self.session_info = session_info - - # TASK + BEHAVIOR STATUS - self.right_active = True - self.trial_running = False - self.trial_number = 0 # I don't think stopping at max trials is implemented - do that - - self.last_choice_time = -np.inf - self.rewards_earned_in_block = 0 - self.rewards_available_in_block = rng.integers(1, 4) - - # Lick detection - self.lick_side_buffer = np.zeros(2) - - ### TRAINING REWARDS PARAMETERS ### - self.automate_training_rewards = False # keep here, use in controller - self.give_training_reward = False # keep here, use in controller - self.error_count = 0 - self.errors_to_reward = 5 - - # These can't be refactored, session parameters needed for behavbox - # maybe move them into a parameters class - self.ITI = session_info['intertrial_interval'] - self.lick_threshold = session_info['lick_threshold'] - self.machine = self.make_state_machine() - self.last_state_fxn = self.switch_to_standby - self.block_type_counter = np.zeros(2) - - self.trial_choice_list: list = [] - self.trial_correct_list: list = [] - self.trial_choice_times: list = [] - self.trial_reward_given: list = [] - self.event_list = deque() - self.t_session_start = time.time() - - self.presenter_commands = [] - self.ITI_active = False - self.ITI_thread = None - - self.end_dark_time = 0 - self.next_dark_time = 0 - self.dark_period_thread = None - - # debugging - self.t_ITI_start = 0 - - def make_state_machine(self): - states = [ - State(name='standby', - on_exit=['exit_standby']), - State(name='right_patch', - on_enter=['enter_right_patch'], - on_exit=['exit_right_patch']), - State(name='left_patch', - on_enter=['enter_left_patch'], - on_exit=['exit_left_patch']), - State(name='dark_period', - on_enter=['enter_dark_period'], - on_exit=['exit_dark_period']) - ] - - # all of these transition functions are created automatically - transitions = [ - ['switch_to_right_patch', ['standby', 'dark_period', 'left_patch'], 'right_patch'], - ['switch_to_left_patch', ['standby', 'dark_period', 'right_patch'], 'left_patch'], - ['switch_to_dark_period', ['left_patch', 'right_patch'], 'dark_period'], - ['switch_to_standby', '*', 'standby']] - - machine = TimedStateMachine( - model=self, - states=states, - transitions=transitions, - initial='standby' - ) - return machine - - def run_event_loop(self): - cur_time = time.time() - time_since_start = cur_time - self.t_session_start - - if self.event_list: - event = self.event_list.popleft() - else: - event = '' - - if event == 'right_entry': - self.lick_side_buffer[RIGHT_IX] += 1 - elif event == 'left_entry': - self.lick_side_buffer[LEFT_IX] += 1 - - if self.state in ['standby', 'dark_period']: - self.lick_side_buffer *= 0 - return time_since_start - - if self.state in ['left_patch', 'right_patch'] and cur_time >= self.next_dark_time: - self.lick_side_buffer *= 0 - self.activate_dark_period() - return time_since_start - - if self.ITI_active: - if self.session_info['quiet_ITI'] and self.lick_side_buffer.sum() > 0: - self.ITI_thread.cancel() - self.activate_ITI() - return time_since_start - - choice = self.determine_choice() - if choice == 'right': - self.activate_ITI() - if self.state == 'right_patch': - self.log_correct_choice(RIGHT_IX, time_since_start) - self.give_correct_reward() - else: - self.log_incorrect_choice(RIGHT_IX, time_since_start) - self.give_incorrect_reward() - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str()) - - elif choice == 'left': - self.activate_ITI() - if self.state == 'left_patch': - self.log_correct_choice(LEFT_IX, time_since_start) - self.give_correct_reward() - else: - self.log_incorrect_choice(LEFT_IX, time_since_start) - self.give_incorrect_reward() - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str("")) - - elif choice == 'switch': - self.activate_ITI() - - elif (self.error_count >= self.errors_to_reward and self.automate_training_rewards)\ - or self.give_training_reward: - self.activate_ITI() - self.presenter_commands.append('give_training_reward') - if self.state == 'right_patch': - choice_side = RIGHT_IX - else: - choice_side = LEFT_IX - self.log_training_reward(choice_side, time_since_start) - - self.give_training_reward = False - return time_since_start - - def turn_LED_on(self) -> None: - self.presenter_commands.append('turn_LED_on') - - def turn_LED_off(self) -> None: - self.presenter_commands.append('turn_LED_off') - - def give_correct_reward(self) -> None: - self.presenter_commands.append('give_correct_reward') - - def give_incorrect_reward(self) -> None: - self.presenter_commands.append('give_incorrect_reward') - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str("")) - self.next_dark_time = time.time() + self.session_info['epoch_length'] - self.reset_counters() - - def enter_right_patch(self): - self.trial_running = True - self.last_state_fxn = self.switch_to_right_patch - logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str("")) - - def exit_right_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str("")) - - def enter_left_patch(self): - self.trial_running = True - self.last_state_fxn = self.switch_to_left_patch - logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str("")) - - def exit_left_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str("")) - - def enter_dark_period(self): - logging.info(";" + str(time.time()) + ";[transition];enter_dark_period;" + str("")) - self.rewards_earned_in_block = 0 - self.trial_running = False - - def exit_dark_period(self): - logging.info(";" + str(time.time()) + ";[transition];exit_dark_period;" + str()) - self.next_dark_time = time.time() + self.session_info['epoch_length'] - - def start_task(self): - ic('starting task') - self.next_dark_time = time.time() + self.session_info['epoch_length'] - if rng.random() > 0.5: - self.switch_to_left_patch() - else: - self.switch_to_right_patch() - - def activate_ITI(self): - self.lick_side_buffer *= 0 - self.ITI_active = True - self.turn_LED_off() - t = threading.Timer(interval=self.ITI, function=self.end_ITI) - self.t_ITI_start = time.perf_counter() - t.start() - self.ITI_thread = t - - def end_ITI(self): - ic(time.perf_counter() - self.t_ITI_start) - self.lick_side_buffer *= 0 - self.ITI_active = False - if (self.state - == 'dark_period'): - self.turn_LED_off() - else: - self.turn_LED_on() - - def activate_dark_period(self): - # make sure this overrides ITI, so you don't get an LED turned on after darkmode starts - self.ITI_active = False - if self.ITI_thread: - self.ITI_thread.cancel() - - self.turn_LED_off() - self.reset_counters() - self.switch_to_dark_period() - - t = threading.Timer(rng.choice(self.session_info['dark_period_times']), self.end_dark_period) - t.start() - self.dark_period_thread = t - - def end_dark_period(self): - self.turn_LED_on() - self.reset_counters() - if rng.random() > 0.5: - self.switch_to_left_patch() - else: - self.switch_to_right_patch() - diff --git a/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py b/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py deleted file mode 100644 index e628b68..0000000 --- a/task_protocol/latent_inference_forage/latent_inference_forage_presenter.py +++ /dev/null @@ -1,207 +0,0 @@ -import collections -from typing import Protocol, Tuple - -import matplotlib as mpl -import matplotlib.pyplot as plt -import numpy as np - -from icecream import ic -import time -import logging - -from task_protocol.base_classes import Presenter - -SEED = 0 -rng = np.random.default_rng(seed=SEED) - - -PUMP1_IX = 0 -PUMP2_IX = 1 -trial_choice_map = {'right': 0, 'left': 1} - - -class Task(Protocol): - trial_choice_list: list[int] - trial_correct_list: list[bool] - trial_choice_times: list[float] - trial_reward_given: list[bool] - event_list: collections.deque - - state: str - rewards_earned_in_block: int - rewards_available_in_block: int - - def run_event_loop(self) -> Tuple[str, bool, float]: - ... - - def switch_to_timeout(self): - ... - - def sample_next_block(self): - ... - - -class GUI(Protocol): - correct_line: mpl.lines.Line2D - incorrect_line: mpl.lines.Line2D - reward_line: mpl.lines.Line2D - figure_window: plt.Figure - - def check_keyboard(self) -> None: - ... - - def check_plot(self, figure, save_fig: bool = False) -> None: - ... - - -class Box(Protocol): - def video_start(self): - ... - - def video_stop(self): - ... - - -class Pump(Protocol): - def reward(self, pump_key: str, reward_size: float): - ... - - -class LatentInferenceForagePresenter(Presenter): - - def __init__(self, task: Task, box: Box, pump: Pump, - gui: GUI, session_info: dict): - - self.task: Task = task - self.gui: GUI = gui - self.box = box - self.pump = pump - self.session_info = session_info - self.pump_keys = (session_info["reward_pump1"], session_info['reward_pump2']) - self.reward_size_large = session_info['reward_size_large'] - self.reward_size_small = session_info['reward_size_small'] - - ############################################################################################### - # event list trigger by the interaction between the RPi and the animal for visualization - # interact_list: lick, choice interaction between the board and the animal for visualization - ############################################################################################### - self.interact_list = [] - - self.keypress_training_reward = False - self.automatic_training_rewards = False - - def run(self) -> None: - """ - Process one event, checking GUI and events as needed. - Currently set to give rewards probabilistically (same reward sizes, unequal reward probabilities) - """ - # goes through the whole timeout before doing the plotting bits I think - if self.task.state == 'right_patch': - correct_pump = PUMP1_IX - incorrect_pump = PUMP2_IX - elif self.task.state == 'left_patch': - correct_pump = PUMP2_IX - incorrect_pump = PUMP1_IX - else: - correct_pump = None - incorrect_pump = None - # raise RuntimeError('state not recognized') - - time_since_start = self.task.run_event_loop() - self.perform_task_commands(correct_pump, incorrect_pump) - self.update_plot() - self.gui.check_keyboard() - - def perform_task_commands(self, correct_pump: int, incorrect_pump: int) -> None: - # give reward if - # 1. training reward/human reward (give reward, regardless of action) - # 2. correct choice and meets correct reward probability - # 3. incorrect but REAL choice (i.e. not a switch) and meets incorrect reward probability - # state changes if choice is correct and switch probability is met - - for c in self.task.presenter_commands: - if c == 'turn_LED_on': - self.box.cueLED1.on() - self.box.cueLED2.on() - - elif c == 'turn_LED_off': - self.box.cueLED1.off() - self.box.cueLED2.off() - - elif c == 'give_training_reward': - reward_size = self.reward_size_large[correct_pump] - self.task.rewards_earned_in_block += 1 - self.task.trial_reward_given.append(True) - logging.info(";" + str(time.time()) + ";[reward];giving_reward;" + str("")) - self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) - - elif c == 'give_correct_reward': - if rng.random() < self.session_info['correct_reward_probability']: - reward_size = self.reward_size_large[correct_pump] - self.task.rewards_earned_in_block += 1 - self.task.trial_reward_given.append(True) - else: - reward_size = 0 - self.task.trial_reward_given.append(False) - - if rng.random() < self.session_info['switch_probability']: - if self.task.state == 'right_patch': - self.task.switch_to_left_patch() - elif self.task.state == 'left_patch': - self.task.switch_to_right_patch() - else: - pass - # raise RuntimeError('state not recognized') - - print('current state: {}; rewards earned in block: {}'.format(self.task.state, - self.task.rewards_earned_in_block)) - self.deliver_reward(pump_key=self.pump_keys[correct_pump], reward_size=reward_size) - - elif c == 'give_incorrect_reward': - if rng.random() < self.session_info['incorrect_reward_probability']: - reward_size = self.reward_size_large[ - incorrect_pump] # can modify these to a single value, reward large and reward small - self.task.rewards_earned_in_block += 1 - self.task.trial_reward_given.append(True) - else: - reward_size = 0 - self.task.trial_reward_given.append(False) - - print('current state: {}; rewards earned in block: {}'.format(self.task.state, - self.task.rewards_earned_in_block)) - self.deliver_reward(pump_key=self.pump_keys[incorrect_pump], reward_size=reward_size) - - self.task.presenter_commands.clear() - - def update_plot(self, save_fig: bool = False) -> None: - if self.task.trial_choice_list: - ix = np.array(self.task.trial_correct_list) - choices = np.array(self.task.trial_choice_list) - times = np.array(self.task.trial_choice_times) - rewards = np.array(self.task.trial_reward_given) - - correct_trials = choices[ix] - correct_times = times[ix] - - incorrect_trials = choices[~ix] - incorrect_times = times[~ix] - - reward_trials = choices[rewards] - reward_times = times[rewards] - - self.gui.figure_window.correct_line.set_data(correct_times, correct_trials) - self.gui.figure_window.error_line.set_data(incorrect_times, incorrect_trials) - self.gui.figure_window.reward_line.set_data(reward_times, reward_trials) - # print('correct trials:', correct_trials) - - # update this to show the last 20-ish trials - if times.size > 1: - T = [times[-20:][0], times[-1]] - else: - T = [times[-1]-.5, times[-1]+.5] - plt.xlim(T) - - self.gui.figure_window.text.set_text('State: {}; ITI: {}'.format(self.task.state, - self.task.ITI_active)) - - self.gui.check_plot(figure=self.gui.figure_window.figure, savefig=save_fig) diff --git a/task_protocol/self_admin_task/__init__.py b/task_protocol/self_admin_task/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task_protocol/self_admin_task/__init__.py @@ -0,0 +1 @@ + diff --git a/task_protocol/self_admin_task/remi_self_admin_task.py b/task_protocol/self_admin_task/remi_self_admin_task.py new file mode 100644 index 0000000..76db1a1 --- /dev/null +++ b/task_protocol/self_admin_task/remi_self_admin_task.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python +# coding: utf-8 + + +# remifentanil self-administration task + +# NOTE: THIS TASK WILL BE NEARLY IDENTICAL TO THE SUCROSE SA TASK, EXCEPT THE MOUSE WILL +# OBTAIN AN INTRAVENOUS INFUSION OF REMIFENTANIL INSTEAD OF SUCROSE +# I MOSTLY NEED ASSISTANCE WITH THE ivsa_syringe_pump class (which will presumably end up in the behavbox code, not this code) + +# python3: headfixed_task.py +""" +author: tian qiu +date: 2023-02-28 +name: remi_self_admin_task.py +goal: self administration task adpated via Mitch's instruction +description: + an updated test version of self_admin_Task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox +# import ivsa_syringe_pump # I will need to add the ivsa_syringe_pump class to the behavbox code + + +#######################ivsa_syringe_pump code below######################### +""" +class ivsa_syringe_pump(object,session_info): # changed this to syringe pump + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + self.syringe_pump = LED(23) + self.reward_list = [] + + # COMMENTS ON REWARD LOGIC# + # Syringe pump will be turned on depending on the weight of the mouse + # For a 30g mouse, the syringe pump will be on for 1 second + # For <30g mouse, the syringe pump will be on for <1s + # For >30g mouse, the syringe pump will be on for >1s + def reward(self): # prototype mouse weight equals 30 + infusion_duration = (self.session_info['mouse_weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial + self.syringe_pump.blink(infusion_duration, 0.1, + 1) # season's edit: this is a shorter implement without having a function + self.reward_list.append(("syringe_pump_reward", infusion_duration)) + logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) + # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration + +""" +# COMMENTS ON INJECT LOGIC# +# this code will turn on the syringe pump, sleep for 'infusion_duration', then turn off the syringe pump with a 2nd pulse +# def inject(self, duration): # season's' edit: a function requires the input - infusion duration +# self.on() +# sleep(duration) # season's' edit: a function requires the input - infusion duration +# self.off() +############################################################################ + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class RemiSelfAdminTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] + ['restart', 'reward_available', 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.lever_pressed_time = 0.0 + self.lever_press_interval = self.session_info["lever_press_interval"] + # self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + self.reward_time_delay = self.session_info["reward_time_delay"] + self.reward_time_recent = time.time() + self.reward_pump = self.session_info["reward_pump"] + self.reward_size = self.session_info["reward_size"] + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + # self.distance_buffer = None + # self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + # for the reward function + self.syringe_pump = LED(23) + self.reward_list = [] + + def reward(self): # prototype mouse weight equals 30 + infusion_duration = (self.session_info['weight'] / 30) # season's edit: I would like to suggest having this defined in the session_information, and import this value as self.infusion_duration = self.session_info["infusion_duration"], so you don't need to make the calculation everytime you deliver reward - for the body weight doesn't change within one trial + self.syringe_pump.blink(infusion_duration, 0.1, + 1) # season's edit: this is a shorter implement without having a function + self.reward_list.append(("syringe_pump_reward", infusion_duration)) + logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(infusion_duration)) + # self.inject(infusion_duration) # season's' edit: a function requires the input - infusion duration + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + if self.state == "standby": + pass + elif self.state == "reward_available": + if self.event_name == "reserved_rx1_pressed": + lever_pressed_time_temp = time.time() + lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time + if lever_pressed_dt >= self.lever_press_interval and (time.time() - self.reward_time_recent > self.reward_time_delay): + self.reward() + self.lever_pressed_time = lever_pressed_time_temp + self.reward_time_recent = time.time() + self.total_reward += 1 + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + # self.cue_off('all') + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + # if self.early_lick_error: + # self.error_list.append("early_lick_error") + # self.early_lick_error = False + self.lick_count = 0 + self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + # self.cue_off('all') + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + self.trial_running = True + # self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + # self.cue_off('sound2') + # self.reward_times_up = True + self.pump.reward("vaccum", 0) + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/to_be_refactored/run_C1_C2_task.py b/task_protocol/self_admin_task/run_remi_self_admin_task.py similarity index 81% rename from task_protocol/to_be_refactored/run_C1_C2_task.py rename to task_protocol/self_admin_task/run_remi_self_admin_task.py index 918055c..5825a8e 100644 --- a/task_protocol/to_be_refactored/run_C1_C2_task.py +++ b/task_protocol/self_admin_task/run_remi_self_admin_task.py @@ -1,15 +1,15 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: +#run_self_admin.task #!/usr/bin/env -S ipython3 -i - +# run_self_admin_task.py """ -author: Mitch Farrell -date: 2023-05-16 -name: run_C1_C2_task.py -goal: running the C1_C2_task +author: tian qiu +date: 2023-02-28 +name: run_remi_self_admin_task.py +goal: running the self_admin_Task +description: + adapted from Mitch's run_self_admin_task.py + """ import random from transitions import Machine @@ -47,7 +47,7 @@ ipython.magic("xmode Verbose") # import your task class here -from C1_C2_task import C1_C2_task +from remi_self_admin_task import RemiSelfAdminTask try: # load in session_info file, check that dates are correct, put in automatic @@ -58,7 +58,7 @@ full_module_name = 'session_info_' + datestr import sys - session_info_path = '/home/pi/experiment_info/C1_C2_task/session_info/' + session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' sys.path.insert(0, session_info_path) tempmod = importlib.import_module(full_module_name) session_info = tempmod.session_info @@ -89,7 +89,8 @@ ] ) - task = C1_C2_task(name="C1_C2_task", session_info=session_info) + + task = RemiSelfAdminTask(name="remi_self_admin_task", session_info=session_info) # start session task.start_session() @@ -101,16 +102,16 @@ t_minute = int(input("Enter the time in minutes: ")) t_end = time.time() + 60 * t_minute - i = True #running this while loop until break encountered - task.start_trial_logic() #shifts state from standby to Context B - while i: #change this to a while loop to run through repeatedly, but maintain the original while loop for running the trial + for i in range(session_info['max_trial_number']): + print("Trial " + str(i) + "\n") if time.time() >= t_end: - i = False print("Times up, finishing up") - task.end_task() break - while task.trial_running: #trial running in both standby and reward_available - task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) raise SystemExit # graceful exit @@ -131,4 +132,3 @@ scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) task.end_session() - diff --git a/task_protocol/to_be_refactored/run_A_B_task.py b/task_protocol/self_admin_task/run_self_admin_task.py similarity index 81% rename from task_protocol/to_be_refactored/run_A_B_task.py rename to task_protocol/self_admin_task/run_self_admin_task.py index 967be77..cf52841 100644 --- a/task_protocol/to_be_refactored/run_A_B_task.py +++ b/task_protocol/self_admin_task/run_self_admin_task.py @@ -1,15 +1,15 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: +#run_self_admin.task #!/usr/bin/env -S ipython3 -i - +# run_self_admin_task.py """ -author: Mitch Farrell -date: 2023-05-16 -name: run_A_B_task.py -goal: running the A_B_task +author: tian qiu +date: 2023-01-25 +name: run_self_admin_task.py +goal: running the self_admin_Task +description: + adapted from Mitch's run_self_admin_task.py + """ import random from transitions import Machine @@ -47,7 +47,7 @@ ipython.magic("xmode Verbose") # import your task class here -from A_B_task import A_B_task +from self_admin_task import SelfAdminTask try: # load in session_info file, check that dates are correct, put in automatic @@ -58,7 +58,7 @@ full_module_name = 'session_info_' + datestr import sys - session_info_path = '/home/pi/experiment_info/A_B_task/session_info/' + session_info_path = '/home/pi/experiment_info/self_admin_task/session_info' sys.path.insert(0, session_info_path) tempmod = importlib.import_module(full_module_name) session_info = tempmod.session_info @@ -89,7 +89,8 @@ ] ) - task = A_B_task(name="A_B_task", session_info=session_info) + + task = SelfAdminTask(name="self_admin_task", session_info=session_info) # start session task.start_session() @@ -101,16 +102,16 @@ t_minute = int(input("Enter the time in minutes: ")) t_end = time.time() + 60 * t_minute - i = True #running this while loop until break encountered - task.start_trial_logic() #shifts state from standby to Context B - while i: #change this to a while loop to run through repeatedly, but maintain the original while loop for running the trial + for i in range(session_info['max_trial_number']): + print("Trial " + str(i) + "\n") if time.time() >= t_end: - i = False print("Times up, finishing up") - task.end_task() break - while task.trial_running: #trial running in both standby and reward_available - task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + logging.info(";" + str(time.time()) + ";[transition];start_trial()") + task.start_trial() # initiate the time state machine, start_trial() is a trigger + while task.trial_running: + task.run() # run command trigger additional functions outside of the state machine + print("error_count: " + str(task.error_count)) raise SystemExit # graceful exit @@ -131,4 +132,3 @@ scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) task.end_session() - diff --git a/task_protocol/self_admin_task/self_admin_task.py b/task_protocol/self_admin_task/self_admin_task.py new file mode 100644 index 0000000..1f04a15 --- /dev/null +++ b/task_protocol/self_admin_task/self_admin_task.py @@ -0,0 +1,310 @@ +# python3: headfixed_task.py +""" +author: tian qiu +date: 2023-01-26 +name: self_admin_Task.py +goal: self administration task adpated via Mitch's instruction +description: + an updated test version of self_admin_Task.py + +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled +# updated with reorganization (on 7/11/2023) +import sys +sys.path.insert(0,'/home/pi/RPi4_behavior_boxes/essential') +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class SelfAdminTask(object): + # Define states. States where the animals is waited to make their decision + + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # initialize the state machine + self.states = [ + State(name='standby', + on_enter=["enter_standby"], + on_exit=["exit_standby"]), + Timeout(name='reward_available', + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"], + timeout=self.session_info["reward_timeout"], + on_timeout=["restart"]) + ] + self.transitions = [ + ['start_trial', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] + ['restart', 'reward_available', 'standby'] + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby' + ) + self.trial_running = False + + # trial statistics + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.lever_pressed_time = 0.0 + self.lever_press_interval = self.session_info["lever_press_interval"] + # self.reward_time_start = None # for reward_available state time keeping purpose + self.reward_time = 10 # sec. could be incorporate into the session_info; available time for reward + self.reward_times_up = False + self.reward_pump = self.session_info["reward_pump"] + self.reward_size = self.session_info["reward_size"] + + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + + self.left_poke_count = 0 + self.right_poke_count = 0 + self.timeline_left_poke = [] + self.left_poke_count_list = [] + self.timeline_right_poke = [] + self.right_poke_count_list = [] + self.event_name = "" + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.treadmill = self.box.treadmill + + # self.distance_initiation = self.session_info['treadmill_setup']['distance_initiation'] + # self.distance_cue = self.session_info['treadmill_setup']['distance_cue'] + # self.distance_buffer = None + # self.distance_diff = 0 + + # for refining the lick detection + self.lick_count = 0 + self.side_mice_buffer = None + self.LED_blink = False + try: + self.lick_threshold = self.session_info["lick_threshold"] + except: + print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") + self.lick_threshold = 1 + + # session_statistics + self.total_reward = 0 + + ######################################################################## + # functions called when state transitions occur + ######################################################################## + def run(self): + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = "" + if self.state == "standby": + pass + elif self.state == "reward_available": + if self.event_name == "reserved_rx1_pressed": + lever_pressed_time_temp = time.time() + lever_pressed_dt = lever_pressed_time_temp - self.lever_pressed_time + if lever_pressed_dt >= self.lever_press_interval: + self.pump.reward(self.reward_pump, self.reward_size) + self.lever_pressed_time = lever_pressed_time_temp + self.total_reward += 1 + # self.active_press += 1 + # self.active_press_count_list.append(self.left_poke_count) + # self.timeline_active_press.append(time.time()) + # elif self.event_name == "reserved_rx2_pressed": + # + # self.inactive_press += 1 + # self.inactive_press_count_list.append(self.right_poke_count) + # self.timeline_inactive_press.append(time.time()) + + # Lick detection: + # if self.event_name == "left_IR_entry": + # self.left_poke_count += 1 + # self.left_poke_count_list.append(self.left_poke_count) + # self.timeline_left_poke.append(time.time()) + # self.lick_count += 1 + + # look for keystrokes + self.box.check_keybd() + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;" + str(self.error_repeat)) + # self.cue_off('all') + self.update_plot_choice() + # self.update_plot_error() + self.trial_running = False + # self.reward_error = False + # if self.early_lick_error: + # self.error_list.append("early_lick_error") + # self.early_lick_error = False + # self.lick_count = 0 + # self.side_mice_buffer = None + print(str(time.time()) + ", Total reward up till current session: " + str(self.total_reward)) + logging.info(";" + str(time.time()) + ";[trial];trial_" + str(self.trial_number) + ";" + str(self.error_repeat)) + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) + self.box.event_list.clear() + pass + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;" + str(self.error_repeat)) + self.trial_running = True + # self.reward_times_up = False + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;" + str(self.error_repeat)) + # self.cue_off('sound2') + # self.reward_times_up = True + self.pump.reward("vaccum", 0) + # if self.multiple_choice_error: + # logging.info(";" + str(time.time()) + ";[error];multiple_choice_error;" + str(self.error_repeat)) + # self.error_repeat = False + # self.error_list.append('multiple_choice_error') + # self.multiple_choice_error = False + # elif self.lick_count == 0: + # logging.info(";" + str(time.time()) + ";[error];no_choice_error;" + str(self.error_repeat)) + # self.error_repeat = True + # self.error_list.append('no_choice_error') + # self.lick_count = 0 + # self.reward_time_start = None + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + + self.box.check_plot(fig) + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + + def integrate_plot(self, save_fig=False): + + fig, ax = plt.subplots(2, 1) + + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + \ + self.session_info['basename'] + "_summery" + '.png') + self.box.check_plot(fig) + + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/self_admin_task/session_info_self_admin.py b/task_protocol/self_admin_task/session_info_self_admin.py new file mode 100644 index 0000000..340fd91 --- /dev/null +++ b/task_protocol/self_admin_task/session_info_self_admin.py @@ -0,0 +1,66 @@ +# session_info_self_admin.py + +# put all of your mouse and session info in here + +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' + +session_info['weight'] = 32.18 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +# session_info['config'] = 'freely_moving_v1' +session_info['config'] = 'self_admin' + +session_info['max_trial_number'] = 100 + +# behavior parameters +session_info['timeout_length'] = 5 # in seconds +session_info['reward_size'] = 10 # in microliters +session_info["lick_threshold"] = 2 +# visual stimulus +session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', +# '/home/pi/second_grating.dat'] +# session_info['vis_raws'] = [] + +# task related information + +session_info['config'] = 'headfixed_walk' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True + +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 10 # cm + session_info['treadmill_setup']['distance_cue'] = 25 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 + +# condition setup +session_info["reward_pump"] = '1' +session_info['reward_size'] = 5 + + +# define timeout during each condition +session_info['initiation_timeout'] = 120 # s +session_info['reward_timeout'] = 60 +# session_info["punishment_timeout"] = 1 diff --git a/task_protocol/session_info_sample.py b/task_protocol/session_info_sample.py deleted file mode 100644 index da879ad..0000000 --- a/task_protocol/session_info_sample.py +++ /dev/null @@ -1,90 +0,0 @@ -# put all of your mouse and session info in here - -import pysistence, collections -import socket -from datetime import datetime - - -### PARAMETERS - Rig and defaults (should not change between sessions) ### - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'TM001', - 'fake_field': 'fake_info', - }) - -# Parameters: mouse, session type - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['weight'] = 30 # in grams -session_info['date'] = datetime.now().strftime("%Y-%m-%d") # for example, '2023-09-28' -session_info['task_config'] = 'alternating_latent' - -# behavior parameters - ideally set these to a default for each session type, which is adjustable -session_info['max_trial_number'] = 100 -session_info['timeout_length'] = 5 # in seconds -session_info['reward_size'] = 10 # in microliters -session_info["lick_threshold"] = 2 -session_info['reward_time_delay'] = 20 - -session_info['initiation_timeout'] = 120 # s - -session_info['entry_interval'] = 1 # this is the one that delays between choices -session_info['timeout_time'] = 3 -session_info['ContextA_reward_probability'] = 1 -session_info['ContextB_reward_probability'] = 1 - -session_info['correct_reward_probability'] = 1 -session_info['incorrect_reward_probability'] = 0 - -session_info["ContextA_time"] = 30 # todo - revise this or make adjustable by mouse performance -session_info["ContextB_time"] = 30 -session_info["ContextC_time"] = 30 - -# Reward pump parameters -session_info["reward_pump1"] = '2' -session_info['reward_pump2'] = '1' - -session_info['reward_size_large'] = [3, 3] -session_info['reward_size_small'] = [0, 0] -session_info['errors_to_reward_delivery'] = 5 -session_info['key_reward_amount'] = 3 - -# Parameters - file saving -session_info['file_basename'] = 'place_holder' -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' - -# Parameters - box and rig -session_info['box_name'] = socket.gethostname() - -session_info["visual_stimulus"] = False -session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -session_info['vis_gratings'] = ['/home/pi/gratings/context_a.dat', - '/home/pi/gratings/context_b.dat'] -session_info['vis_raws'] = [] - -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True - - -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 10 # cm - session_info['treadmill_setup']['distance_cue'] = 25 # cm -else: - session_info['treadmill_setup'] = None - - -### DEPRECATED / NOT CURRENTLY IN USE ### -session_info['LED_duration'] = 3 - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 - -session_info["reward_pump"] = '2' -session_info['reward_size'] = 1 \ No newline at end of file diff --git a/task_protocol/to_be_refactored/A_B_C1_C2_task.py b/task_protocol/to_be_refactored/A_B_C1_C2_task.py deleted file mode 100644 index a220156..0000000 --- a/task_protocol/to_be_refactored/A_B_C1_C2_task.py +++ /dev/null @@ -1,599 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - -# python3: A_B_C1_C2_task.py -""" -author: Mitch Farrell -date: 2023-06-09 -name: A_B_C1_C2_task.py -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np -import random - -# from IPython.display import display, HTML -# -# display(HTML("")) - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - -class A_B_C1_C2_task(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - # Function to generate random list with no 3 in a row of same kind and no two consecutive Contexts - self.context_order_list = [] - self.last_element = -1 - while len(self.context_order_list) < 80: - self.k = random.randint(0, 3) - if self.k != self.last_element: - self.context_order_list.append(self.k) - self.last_element = self.k - - self.context_timing_list = [] - self.context_time_pool = [15, 20, 25, 30, 35] * 16 - for i in range(len(self.context_order_list)): - random.shuffle(self.context_time_pool) - self.context_timing_list.append(self.context_time_pool.pop()) - - self.intercontext_interval_time = [10, 15, 20, 25, 30] * 16 - self.intercontext_interval_list = self.intercontext_interval_time - random.shuffle(self.intercontext_interval_list) - - self.context_order_list_names = self.context_order_list.copy() - for idx, element in enumerate(self.context_order_list_names): - if element == 0: - self.context_order_list_names[idx] = 'ContextA' - elif element == 1: - self.context_order_list_names[idx] = 'ContextB' - elif element == 2: - self.context_order_list_names[idx] = 'ContextC1' - elif element == 3: - self.context_order_list_names[idx] = 'ContextC2' - - self.full_task_list = [] - for i in range(len(self.context_order_list)): - self.full_task_list.append(self.context_timing_list[i]) - self.full_task_list.append(self.intercontext_interval_list[i]) - - self.full_task_names_and_times = [] - for i in range(len(self.context_order_list_names)): - self.full_task_names_and_times.append([self.context_order_list_names[i], self.context_timing_list[i]]) - self.full_task_names_and_times.append(['intercontext_interval', self.intercontext_interval_list[i]]) - - self.full_task_names_and_times.append(['task_end', 60]) - - logging.info(self.full_task_names_and_times) - - self.trial_counter = 0 - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_exit=["exit_standby"]), - State(name="ContextA", - on_enter=["enter_ContextA"], - on_exit = ['exit_ContextA']), - State(name="ContextB", - on_enter=["enter_ContextB"], - on_exit=['exit_ContextB']), - State(name="ContextC1", - on_enter=["enter_ContextC1"], - on_exit=['exit_ContextC1']), - State(name="ContextC2", - on_enter=["enter_ContextC2"], - on_exit=['exit_ContextC2']), - State(name="intercontext_interval", - on_enter=["enter_intercontext_interval"], - on_exit=["exit_intercontext_interval"]) - ] - - self.transitions = [ - ['switch_to_intercontext_interval', ['ContextA','ContextB', 'ContextC1','ContextC2'], 'intercontext_interval'], - ['end_task', ['ContextA','ContextB','ContextC1', 'ContextC2', 'intercontext_interval'], 'standby'], - ['switch_to_ContextA', 'intercontext_interval', 'ContextA'], - ['switch_to_ContextB', 'intercontext_interval', 'ContextB'], - ['switch_to_ContextC1', 'intercontext_interval', 'ContextC1'], - ['switch_to_ContextC2', 'intercontext_interval', 'ContextC2'] - - ] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - - self.machine.add_transition('start_trial_logic', 'standby', 'ContextA', conditions='start_in_ContextA') - self.machine.add_transition('start_trial_logic', 'standby', 'ContextB', conditions='start_in_ContextB') - self.machine.add_transition('start_trial_logic', 'standby', 'ContextC1', conditions='start_in_ContextC1') - self.machine.add_transition('start_trial_logic', 'standby', 'ContextC2', conditions='start_in_ContextC2') - - # trial statistics - self.intercontext_interval_time = 0 - self.current_state_time = 0 - self.random_ITI = 3 - self.LED_delay_time = 0.3 - self.LED_on_time = 0 - self.trial_running = False - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.entry_time = 0.0 - self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - - self.reward_size1 = self.session_info["reward_size1"] #large, right - self.reward_size2 = self.session_info['reward_size2'] #small, left - self.reward_size3 = self.session_info['reward_size3'] #large, left - self.reward_size4 = self.session_info['reward_size4'] #small, right - - self.ContextA_time = 0 - self.ContextB_time = 0 - self.ContextC1_time = 0 - self.ContextC2_time = 0 - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - def run(self): - if self.state == "standby": - pass - elif self.state == 'intercontext_interval': - self.trial_running = False - self.intercontext_interval_time = time.time() - while (time.time() - self.intercontext_interval_time) <= self.current_state_time: - pass - self.switch_to_ContextA_B_C1_C2() - elif self.state == 'ContextA': - self.trial_running = False - self.ContextA_time = time.time() - self.LED_bool = False - self.prior_reward_time = 0 - while (time.time() - self.ContextA_time) <= self.current_state_time: # need to be able to jump out of this loop even in a below while loop; runs when ContextB_duration hasn't elapsed - if not self.LED_bool: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextA_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size2) - self.prior_reward_time = time.time() - self.random_ITI = 3 #2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size1) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - if (time.time() - self.ContextA_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - elif self.state == 'ContextB': - self.trial_running = False - self.ContextB_time = time.time() # assign the context switch time to this variable - self.LED_bool = False - self.prior_reward_time = 0 - while (time.time() - self.ContextB_time) <= self.current_state_time: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextB_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size3) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size4) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - if (time.time() - self.ContextB_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - elif self.state == 'ContextC1': - self.trial_running = False - self.ContextC1_time = time.time() - self.LED_bool = False - self.prior_reward_time = 0 - while (time.time() - self.ContextC1_time) <= self.current_state_time: - if not self.LED_bool: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextC1_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size2) - self.prior_reward_time = time.time() - self.random_ITI = 3 #2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size1) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - if (time.time() - self.ContextC1_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - elif self.state == 'ContextC2': - self.trial_running = False - self.ContextC2_time = time.time() # assign the context switch time to this variable - self.LED_bool = False - self.prior_reward_time = 0 - while (time.time() - self.ContextC2_time) <= self.current_state_time: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextC2_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size3) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size4) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - if (time.time() - self.ContextC2_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - def start_in_ContextA(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': - return True - else: - return False - def start_in_ContextB(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': - return True - else: - return False - - def start_in_ContextC1(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': - return True - else: - return False - - def start_in_ContextC2(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': - return True - else: - return False - - def switch_to_ContextA_B_C1_C2(self): - self.trial_counter += 1 - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': - self.switch_to_ContextA() - elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': - self.switch_to_ContextB() - elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': - self.switch_to_ContextC1() - elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': - self.switch_to_ContextC2() - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby") - self.box.event_list.clear() - - def enter_ContextA(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextA") - self.box.sound1.blink(0.1, 0.1) - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + - str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - str(self.full_task_names_and_times[self.trial_counter][1])) - if self.full_task_names_and_times[self.trial_counter][1] == 15: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 20: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[1],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 25: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[2],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 30: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[3],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 35: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[4],0) - self.trial_running = True - - def exit_ContextA(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextA") - self.box.sound1.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - - def enter_ContextB(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextB") - self.box.sound1.blink(0.2, 0.1) - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + - str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - str(self.full_task_names_and_times[self.trial_counter][1])) - if self.full_task_names_and_times[self.trial_counter][1] == 15: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[5],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 20: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[6],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 25: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[7],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 30: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[8],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 35: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[9],0) - self.trial_running = True - - def exit_ContextB(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextB") - self.box.sound1.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - - def enter_ContextC1(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextC1") - self.box.sound2.on() - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + - str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - str(self.full_task_names_and_times[self.trial_counter][1])) - self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) - self.trial_running = True - - def exit_ContextC1(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextC1") - self.box.sound2.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - self.box.visualstim.myscreen.display_greyscale(0) - - def enter_ContextC2(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextC2") - self.box.sound2.on() - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + - str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - str(self.full_task_names_and_times[self.trial_counter][1])) - self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) - self.trial_running = True - - def exit_ContextC2(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextC2") - self.box.sound2.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - self.box.visualstim.myscreen.display_greyscale(0) - - def enter_intercontext_interval(self): - logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval") - # logging.info(";" + str(time.time()) + ";[transition];enter_inter_" + - # str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - # str(self.full_task_names_and_times[self.trial_counter][1])) - self.trial_running = True - - def exit_intercontext_interval(self): - logging.info(";" + str(time.time()) + ";[transition];exit_intercontext_interval") - self.box.event_list.clear() - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() - diff --git a/task_protocol/to_be_refactored/A_B_task.py b/task_protocol/to_be_refactored/A_B_task.py deleted file mode 100644 index 1381a8d..0000000 --- a/task_protocol/to_be_refactored/A_B_task.py +++ /dev/null @@ -1,482 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - -# python3: A_B_task.py -""" -author: Mitch Farrell -date: 2023-05-15 -name: A_B_task.py -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -# from IPython.display import display, HTML -# -# display(HTML("")) - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox -import random - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - -class A_B_task(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - # Initialize duration lists for contexts and intercontext intervals - self.ContextA_durations = [15, 20, 25, 30, 35] * 8 - self.ContextB_durations = [15, 20, 25, 30, 35] * 8 - self.intercontext_interval_durations = [10, 15, 20, 25, 30] * 16 - - # Shuffling duration lists - random.shuffle(self.ContextA_durations) - random.shuffle(self.ContextB_durations) - random.shuffle(self.intercontext_interval_durations) - - # Initialize context names and counts - self.contexts = ['ContextA', 'ContextB'] - self.context_counts = {'ContextA': 0, 'ContextB': 0} - - # Initialize task list and total duration - self.full_task_names_and_times = [] - self.total_duration = 0 - - # Previous two contexts - self.prev_contexts = ['', ''] - - while self.total_duration < 3600: - # Select a context different from the last two (unless we're in the final 10) - while True: - self.context = random.choice(self.contexts) - if (not (self.prev_contexts[0] == self.prev_contexts[1] == self.context) and self.context_counts[self.context] < 40) or ( - (self.context_counts['ContextA'] >= 30 and self.context_counts['ContextB'] >= 30)): - break - - # Update previous context indicators and increment count - self.prev_contexts[0] = self.prev_contexts[1] - self.prev_contexts[1] = self.context - self.context_counts[self.context] += 1 - - # Select a duration for the context if we have any left for this context - if self.context == 'ContextA' and self.ContextA_durations: - self.duration = self.ContextA_durations.pop() - elif self.context == 'ContextB' and self.ContextB_durations: - self.duration = self.ContextB_durations.pop() - else: - continue - - # Ensure total duration does not exceed 3600 - if self.total_duration + self.duration > 3600: - continue - - # Append the context and its duration to the task list - self.full_task_names_and_times.append([self.context, self.duration]) - self.total_duration += self.duration - - # Select a duration for the intercontext interval - if self.intercontext_interval_durations: - self.interval_duration = self.intercontext_interval_durations.pop() - - # Ensure total duration does not exceed 3600 - if self.total_duration + self.interval_duration > 3600: - continue - - # Append the intercontext interval and its duration to the task list - self.full_task_names_and_times.append(['intercontext_interval', self.interval_duration]) - self.total_duration += self.interval_duration - self.full_task_names_and_times.append(['task_end', 60]) - - logging.info(self.full_task_names_and_times) - - self.trial_counter = 0 - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_exit=["exit_standby"]), - State(name="ContextA", - on_enter=["enter_ContextA"], - on_exit=['exit_ContextA']), - State(name="ContextB", - on_enter=["enter_ContextB"], - on_exit=['exit_ContextB']), - State(name="intercontext_interval", - on_enter=["enter_intercontext_interval"], - on_exit=["exit_intercontext_interval"]) - ] - - self.transitions = [ - ['switch_to_intercontext_interval', ['ContextA','ContextB'], 'intercontext_interval'], - ['end_task', ['ContextA','ContextB','intercontext_interval'], 'standby'], - ['switch_to_ContextA', 'intercontext_interval', 'ContextA'], - ['switch_to_ContextB', 'intercontext_interval', 'ContextB']] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - - self.machine.add_transition('start_trial_logic', 'standby', 'ContextA', conditions='start_in_ContextA') - self.machine.add_transition('start_trial_logic', 'standby', 'ContextB', conditions='start_in_ContextB') - - # trial statistics - self.right_entry_bool = True - self.left_entry_bool = True - self.intercontext_interval_time = 0 - self.current_state_time = 0 - self.random_ITI = 3 #random.randint(2, 4) - self.LED_delay_time = 0.3 - self.LED_on_time = 0 - self.trial_running = False - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.entry_time = 0.0 - self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - - self.reward_size1 = self.session_info["reward_size1"] #large, right - self.reward_size2 = self.session_info['reward_size2'] #small, left - self.reward_size3 = self.session_info['reward_size3'] #large, left - self.reward_size4 = self.session_info['reward_size4'] #small, right - - self.ContextA_time = 0 - self.ContextB_time = 0 - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - def run(self): - if self.state == "standby": - pass - elif self.state == 'intercontext_interval': - self.trial_running = False - self.intercontext_interval_time = time.time() - while (time.time() - self.intercontext_interval_time) <= self.current_state_time: - pass - self.switch_to_ContextA_B() - elif self.state == 'ContextA': - self.trial_running = False - self.ContextA_time = time.time() - self.LED_bool = False - self.prior_reward_time = 0 - self.left_entry_bool = False - while (time.time() - self.ContextA_time) <= self.current_state_time: - if not self.LED_bool: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextA_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size2) - self.prior_reward_time = time.time() - self.random_ITI = 3 #2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - self.left_entry_bool = True - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size1) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - if (time.time() - self.ContextA_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - elif self.state == 'ContextB': - self.trial_running = False - self.ContextB_time = time.time() # assign the context switch time to this variable - self.LED_bool = False - self.prior_reward_time = 0 - self.right_entry_bool = False - while (time.time() - self.ContextB_time) <= self.current_state_time: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextB_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size3) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size4) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - self.right_entry_bool = True - if (time.time() - self.ContextB_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - def start_in_ContextA(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': - return True - else: - return False - def start_in_ContextB(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': - return True - else: - return False - - def switch_to_ContextA_B(self): - self.trial_counter += 1 - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextB': - self.switch_to_ContextB() - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextA': - self.switch_to_ContextA() - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby") - self.box.event_list.clear() - - def enter_ContextA(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextA") - self.box.sound1.blink(0.1, 0.1) - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_ContextA_" + - str(self.full_task_names_and_times[self.trial_counter][1])) - if self.full_task_names_and_times[self.trial_counter][1] == 15: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[0],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 20: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[1],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 25: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[2],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 30: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[3],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 35: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[4],0) - self.trial_running = True - - def exit_ContextA(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextA") - self.box.sound1.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - - def enter_ContextB(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextB") - self.box.sound1.blink(0.2, 0.1) - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_ContextB_" + - str(self.full_task_names_and_times[self.trial_counter][1])) - if self.full_task_names_and_times[self.trial_counter][1] == 15: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[5],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 20: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[6],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 25: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[7],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 30: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[8],0) - elif self.full_task_names_and_times[self.trial_counter][1] == 35: - self.box.visualstim.show_grating(list(self.box.visualstim.gratings)[9],0) - self.trial_running = True - - def exit_ContextB(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextB") - self.box.sound1.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - - def enter_intercontext_interval(self): - logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval") - # logging.info(";" + str(time.time()) + ";[transition];enter_inter_" + - # str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - # str(self.full_task_names_and_times[self.trial_counter][1])) - self.trial_running = True - - def exit_intercontext_interval(self): - logging.info(";" + str(time.time()) + ";[transition];exit_intercontext_interval") - self.box.event_list.clear() - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() \ No newline at end of file diff --git a/task_protocol/to_be_refactored/C1_C2_task.py b/task_protocol/to_be_refactored/C1_C2_task.py deleted file mode 100644 index 52bac21..0000000 --- a/task_protocol/to_be_refactored/C1_C2_task.py +++ /dev/null @@ -1,464 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - -# python3: A_B_task.py -""" -author: Mitch Farrell -date: 2023-05-15 -name: A_B_task.py -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -# from IPython.display import display, HTML -# -# display(HTML("")) - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox -import random - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - -class C1_C2_task(object): - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - # Initialize duration lists for contexts and intercontext intervals - self.ContextC1_durations = [15, 20, 25, 30, 35] * 8 - self.ContextC2_durations = [15, 20, 25, 30, 35] * 8 - self.intercontext_interval_durations = [10, 15, 20, 25, 30] * 16 - - # Shuffling duration lists - random.shuffle(self.ContextC1_durations) - random.shuffle(self.ContextC2_durations) - random.shuffle(self.intercontext_interval_durations) - - # Initialize context names and counts - self.contexts = ['ContextC1', 'ContextC2'] - self.context_counts = {'ContextC1': 0, 'ContextC2': 0} - - # Initialize task list and total duration - self.full_task_names_and_times = [] - self.total_duration = 0 - - # Previous two contexts - self.prev_contexts = ['', ''] - - while self.total_duration < 3600: - # Select a context different from the last two (unless we're in the final 10) - while True: - self.context = random.choice(self.contexts) - if (not (self.prev_contexts[0] == self.prev_contexts[1] == self.context) and self.context_counts[ - self.context] < 40) or ( - (self.context_counts['ContextC1'] >= 30 and self.context_counts['ContextC2'] >= 30)): - break - - # Update previous context indicators and increment count - self.prev_contexts[0] = self.prev_contexts[1] - self.prev_contexts[1] = self.context - self.context_counts[self.context] += 1 - - # Select a duration for the context if we have any left for this context - if self.context == 'ContextC1' and self.ContextC1_durations: - self.duration = self.ContextC1_durations.pop() - elif self.context == 'ContextC2' and self.ContextC2_durations: - self.duration = self.ContextC2_durations.pop() - else: - continue - - # Ensure total duration does not exceed 3600 - if self.total_duration + self.duration > 3600: - continue - - # Append the context and its duration to the task list - self.full_task_names_and_times.append([self.context, self.duration]) - self.total_duration += self.duration - - # Select a duration for the intercontext interval - if self.intercontext_interval_durations: - self.interval_duration = self.intercontext_interval_durations.pop() - - # Ensure total duration does not exceed 3600 - if self.total_duration + self.interval_duration > 3600: - continue - - # Append the intercontext interval and its duration to the task list - self.full_task_names_and_times.append(['intercontext_interval', self.interval_duration]) - self.total_duration += self.interval_duration - self.full_task_names_and_times.append(['task_end', 60]) - logging.info(self.full_task_names_and_times) - # print(f"This is the order of the Contexts and intercontext_intervals along with their respective durations: {self.full_task_names_and_times}") - - self.trial_counter = 0 - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_exit=["exit_standby"]), - State(name="ContextC1", - on_enter=["enter_ContextC1"], - on_exit = ['exit_ContextC1']), - State(name="ContextC2", - on_enter=["enter_ContextC2"], - on_exit=['exit_ContextC2']), - State(name="intercontext_interval", - on_enter=["enter_intercontext_interval"], - on_exit=["exit_intercontext_interval"]) - ] - - self.transitions = [ - ['switch_to_intercontext_interval', ['ContextC1','ContextC2'], 'intercontext_interval'], - ['end_task', ['ContextC1','ContextC2','intercontext_interval'], 'standby'], - ['switch_to_ContextC1', 'intercontext_interval', 'ContextC1'], - ['switch_to_ContextC2', 'intercontext_interval', 'ContextC2']] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - - self.machine.add_transition('start_trial_logic', 'standby', 'ContextC1', conditions='start_in_ContextC1') - self.machine.add_transition('start_trial_logic', 'standby', 'ContextC2', conditions='start_in_ContextC2') - - # trial statistics - self.intercontext_interval_time = 0 - self.current_state_time = 0 - self.random_ITI = 3 #random.randint(2, 4) - self.LED_delay_time = 0.3 - self.LED_on_time = 0 - self.trial_running = False - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.entry_time = 0.0 - self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - - self.reward_size1 = self.session_info["reward_size1"] #large, right - self.reward_size2 = self.session_info['reward_size2'] #small, left - self.reward_size3 = self.session_info['reward_size3'] #large, left - self.reward_size4 = self.session_info['reward_size4'] #small, right - - self.ContextC1_time = 0 - self.ContextC2_time = 0 - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - - def run(self): - if self.state == "standby": - pass - elif self.state == 'intercontext_interval': - self.trial_running = False - self.intercontext_interval_time = time.time() - while (time.time() - self.intercontext_interval_time) <= self.current_state_time: - pass - self.switch_to_ContextC1_C2() - elif self.state == 'ContextC1': - self.trial_running = False - self.ContextC1_time = time.time() - self.LED_bool = False - self.prior_reward_time = 0 - while (time.time() - self.ContextC1_time) <= self.current_state_time: - if not self.LED_bool: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: #first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextC1_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size2) - self.prior_reward_time = time.time() - self.random_ITI = 3 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size1) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - if (time.time() - self.ContextC1_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - elif self.state == 'ContextC2': - self.trial_running = False - self.ContextC2_time = time.time() # assign the context switch time to this variable - self.LED_bool = False - self.prior_reward_time = 0 - while (time.time() - self.ContextC2_time) <= self.current_state_time: - if self.prior_reward_time == 0 or time.time() - self.prior_reward_time > self.random_ITI: # first trial after entering the state - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and time.time() - self.ContextC2_time <= self.current_state_time: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == "left_entry" and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump2, self.reward_size3) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - elif self.event_name == 'right_entry' and time.time() - self.LED_on_time > self.LED_delay_time: - self.box.cueLED1.off() - self.box.cueLED2.off() - self.pump.reward(self.reward_pump1, self.reward_size4) - self.prior_reward_time = time.time() - self.random_ITI = 3 # 2,3,4 - logging.info(";" + str(time.time()) + ";[transition];current_ITI_" + str(self.random_ITI)) - self.LED_bool = False - if (time.time() - self.ContextC2_time) >= self.current_state_time: - self.switch_to_intercontext_interval() - def start_in_ContextC1(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': - return True - else: - return False - def start_in_ContextC2(self): - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': - return True - else: - return False - - def switch_to_ContextC1_C2(self): - self.trial_counter += 1 - if self.full_task_names_and_times[self.trial_counter][0] == 'ContextC1': - self.switch_to_ContextC1() - elif self.full_task_names_and_times[self.trial_counter][0] == 'ContextC2': - self.switch_to_ContextC2() - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby") - self.box.event_list.clear() - - def enter_ContextC1(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextC1") - self.box.sound2.on() - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + - str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - str(self.full_task_names_and_times[self.trial_counter][1])) - self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) - self.trial_running = True - - def exit_ContextC1(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextC1") - self.box.sound2.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - self.box.visualstim.myscreen.display_greyscale(0) - - def enter_ContextC2(self): - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - logging.info(";" + str(time.time()) + ";[transition];enter_ContextC2") - self.box.sound2.on() - logging.info(";" + str(time.time()) + ";[transition];current_state_and_duration_" + - str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - str(self.full_task_names_and_times[self.trial_counter][1])) - self.box.visualstim.myscreen.display_greyscale(self.session_info['gray_level']['default']) - self.trial_running = True - - def exit_ContextC2(self): - logging.info(";" + str(time.time()) + ";[transition];exit_ContextC2") - self.box.sound2.off() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.box.event_list.clear() - self.trial_counter += 1 - self.current_state_time = self.full_task_names_and_times[self.trial_counter][1] - self.box.visualstim.myscreen.display_greyscale(0) - - def enter_intercontext_interval(self): - logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval") - # logging.info(";" + str(time.time()) + ";[transition];enter_intercontext_interval_" + - # str(self.full_task_names_and_times[self.trial_counter][0]) + '_' + - # str(self.full_task_names_and_times[self.trial_counter][1])) - self.trial_running = True - - def exit_intercontext_interval(self): - logging.info(";" + str(time.time()) + ";[transition];exit_intercontext_interval") - self.box.event_list.clear() - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() - diff --git a/task_protocol/to_be_refactored/latent_inference_forage_task.py b/task_protocol/to_be_refactored/latent_inference_forage_task.py deleted file mode 100644 index 69dd349..0000000 --- a/task_protocol/to_be_refactored/latent_inference_forage_task.py +++ /dev/null @@ -1,345 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - - -# python3: latent_inference_forage_task.py -""" -author: Mitch Farrell -date: 2023-09-20 -name: latent_inference_forage_task.py -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -# from IPython.display import display, HTML -# -# display(HTML("")) - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - -class LatentInferenceForageTask(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_exit=["exit_standby"]), - State(name="right_patch", - on_enter=["enter_right_patch"], - on_exit=["exit_right_patch"]), - State(name="left_patch", - on_enter=["enter_left_patch"], - on_exit=["exit_left_patch"]) - ] - - self.transitions = [ - ['start_in_right_patch', 'standby', 'right_patch'], - ['start_in_left_patch', 'standby', 'left_patch'], - - ['switch_to_right_patch', 'left_patch', 'right_patch'], - ['switch_to_left_patch', 'right_patch', 'left_patch'], - - ['end_task', ['left_patch','right_patch'], 'standby']] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - - # trial statistics - self.trial_running = False - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.lick_time = 0.0 - self.lick_interval = self.session_info["lick_interval"] - # self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - self.reward_size1 = self.session_info['reward_size1'] - self.reward_size2 = self.session_info['reward_size2'] - self.reward_size3 = self.session_info['reward_size3'] - self.reward_size4 = self.session_info['reward_size4'] - self.ITI = self.session_info['ITI'] - self.p_switch = self.session_info['p_switch'] - self.p_reward = self.session_info['p_reward'] - self.reward_earned = False - - self.ContextA_time = 0 - self.ContextB_time = 0 - self.LED_on_time_plus_LED_duration = 0 - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - self.right_entry_error = False - self.left_entry_error = False - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - self.right_licks = 0 - self.left_licks = 0 - - def run(self): - if self.state == 'standby': - pass - elif self.state == 'right_patch': - self.trial_running = False - self.LED_bool = False - self.prior_choice_time = 0 - self.reward_earned = False - self.box.event_list.clear() - while self.state == 'right_patch': - if not self.LED_bool: - if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == 'right_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - if self.p_reward >= random.random(): - self.pump.reward(self.reward_pump1, self.reward_size1) #1 reward - if self.p_switch >= random.random(): - self.LED_bool = False - time.sleep(1) - self.switch_to_left_patch() - else: - self.pump.reward(self.reward_pump1, self.reward_size2) #0 reward - if self.event_name == 'left_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str(self.error_repeat)) - elif self.state == 'left_patch': - self.trial_running = False - self.LED_bool = False - self.prior_choice_time = 0 - self.reward_earned = False - self.box.event_list.clear() - while self.state == 'left_patch': - if not self.LED_bool: - if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool: - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == 'left_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - if self.p_reward >= random.random(): - self.pump.reward(self.reward_pump2, self.reward_size1) # 1 reward - if self.p_switch >= random.random(): - self.LED_bool = False - time.sleep(1) - self.switch_to_right_patch() - else: - self.pump.reward(self.reward_pump2, self.reward_size2) # 0 reward - if self.event_name == 'right_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_left_patch;" + str(self.error_repeat)) - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - - def enter_right_patch(self): - logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str(self.error_repeat)) - self.trial_running = True - def exit_right_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str(self.error_repeat)) - - def enter_left_patch(self): - logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str(self.error_repeat)) - self.trial_running = True - def exit_left_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str(self.error_repeat)) - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() - self.box.cueLED1.off() - self.box.cueLED2.off() - diff --git a/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py b/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py deleted file mode 100644 index ed49ae2..0000000 --- a/task_protocol/to_be_refactored/latent_inference_forage_task_three_states.py +++ /dev/null @@ -1,376 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - - -# python3: latent_inference_forage_task_three_states.py -""" -author: Mitch Farrell -date: 2023-10-26 -name: latent_inference_forage_task_three_states.py -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -# from IPython.display import display, HTML -# -# display(HTML("")) - -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled - -import behavbox - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - -class LatentInferenceForageTaskThreeStates(object): - # Define states. States where the animals is waited to make their decision - - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - - # initialize the state machine - self.states = [ - State(name='standby', - on_exit=["exit_standby"]), - State(name="right_patch", - on_enter=["enter_right_patch"], - on_exit=["exit_right_patch"]), - State(name="left_patch", - on_enter=["enter_left_patch"], - on_exit=["exit_left_patch"]), - State(name='dark_period', - on_enter=['enter_dark_period'], - on_exit=['exit_dark_period']) - ] - - self.transitions = [ - ['start_in_right_patch', 'standby', 'right_patch'], - ['start_in_left_patch', 'standby', 'left_patch'], - - ['switch_to_right_patch', ['dark_period', 'left_patch'], 'right_patch'], - ['switch_to_left_patch', ['dark_period', 'right_patch'], 'left_patch'], - - ['switch_to_dark_period', ['left_patch', 'right_patch'], 'dark_period'], - - ['end_task', ['dark_period', 'left_patch','right_patch'], 'standby']] - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby' - ) - - # trial statistics - self.dark_period_times = [10] - self.end_dark_time = 0 - self.next_dark_time = 0 - self.trial_running = False - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.lick_time = 0.0 - self.lick_interval = self.session_info["lick_interval"] - # self.reward_time_start = None # for reward_available state time keeping purpose - self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - self.reward_size1 = self.session_info['reward_size1'] - self.reward_size2 = self.session_info['reward_size2'] - self.reward_size3 = self.session_info['reward_size3'] - self.reward_size4 = self.session_info['reward_size4'] - self.ITI = self.session_info['ITI'] - self.p_switch = self.session_info['p_switch'] - self.p_reward = self.session_info['p_reward'] - self.reward_earned = False - - self.ContextA_time = 0 - self.ContextB_time = 0 - self.LED_on_time_plus_LED_duration = 0 - - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - - self.left_poke_count = 0 - self.right_poke_count = 0 - self.timeline_left_poke = [] - self.left_poke_count_list = [] - self.timeline_right_poke = [] - self.right_poke_count_list = [] - self.event_name = "" - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.treadmill = self.box.treadmill - self.right_entry_error = False - self.left_entry_error = False - # for refining the lick detection - self.lick_count = 0 - self.side_mice_buffer = None - self.LED_blink = False - try: - self.lick_threshold = self.session_info["lick_threshold"] - except: - print("No lick_threshold defined in session_info. Therefore, default defined as 2 \n") - self.lick_threshold = 1 - - # session_statistics - self.total_reward = 0 - self.right_licks = 0 - self.left_licks = 0 - - def run(self): - if self.state == 'standby' or self.state == 'dark_period': - pass - elif self.state == 'right_patch': - self.trial_running = False - self.LED_bool = False - self.prior_choice_time = 0 - self.reward_earned = False - self.box.event_list.clear() - while self.state == 'right_patch' and self.next_dark_time > time.time(): - if not self.LED_bool: - if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and self.next_dark_time > time.time(): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == 'right_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - if self.p_reward >= random.random(): - self.pump.reward(self.reward_pump1, self.reward_size1) #1 reward - if self.p_switch >= random.random(): - self.LED_bool = False - time.sleep(1) - self.switch_to_left_patch() - else: - self.pump.reward(self.reward_pump1, self.reward_size2) #0 reward - if self.event_name == 'left_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_right_patch;" + str(self.error_repeat)) - if self.next_dark_time < time.time(): - self.switch_to_dark_period() - elif self.state == 'left_patch': - self.trial_running = False - self.LED_bool = False - self.prior_choice_time = 0 - self.reward_earned = False - self.box.event_list.clear() - while self.state == 'left_patch' and self.next_dark_time > time.time(): - if not self.LED_bool: - if self.prior_choice_time == 0 or time.time() - self.prior_choice_time > self.ITI: - self.box.cueLED1.on() - self.box.cueLED2.on() - self.LED_on_time = time.time() - self.LED_bool = True - self.box.event_list.clear() - while self.LED_bool and self.next_dark_time > time.time(): - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == 'left_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - if self.p_reward >= random.random(): - self.pump.reward(self.reward_pump2, self.reward_size1) # 1 reward - if self.p_switch >= random.random(): - self.LED_bool = False - time.sleep(1) - self.switch_to_right_patch() - else: - self.pump.reward(self.reward_pump2, self.reward_size2) # 0 reward - if self.event_name == 'right_entry': - self.prior_choice_time = time.time() - self.box.cueLED1.off() - self.box.cueLED2.off() - self.LED_bool = False - logging.info(";" + str(time.time()) + ";[transition];wrong_choice_left_patch;" + str(self.error_repeat)) - if self.next_dark_time < time.time(): - self.switch_to_dark_period() - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;" + str(self.error_repeat)) - self.end_dark_time = time.time() - self.next_dark_time = self.end_dark_time + 120 - - def enter_right_patch(self): - logging.info(";" + str(time.time()) + ";[transition];enter_right_patch;" + str(self.error_repeat)) - self.trial_running = True - def exit_right_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_right_patch;" + str(self.error_repeat)) - - def enter_left_patch(self): - logging.info(";" + str(time.time()) + ";[transition];enter_left_patch;" + str(self.error_repeat)) - self.trial_running = True - - def exit_left_patch(self): - logging.info(";" + str(time.time()) + ";[transition];exit_left_patch;" + str(self.error_repeat)) - - def enter_dark_period(self): - logging.info(";" + str(time.time()) + ";[transition];enter_dark_period;" + str(self.error_repeat)) - self.trial_running = False - self.box.cueLED1.off() - self.box.cueLED2.off() - time.sleep(random.choice(self.dark_period_times)) - self.end_dark_time = time.time() - self.next_dark_time = self.end_dark_time + 120 - if random.random() > 0.5: - self.switch_to_left_patch() - else: - self.switch_to_right_patch() - - def exit_dark_period(self): - logging.info(";" + str(time.time()) + ";[transition];exit_dark_period;" + str(self.error_repeat)) - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - - self.box.check_plot(fig) - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - - def integrate_plot(self, save_fig=False): - - fig, ax = plt.subplots(2, 1) - - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) - - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() - self.box.cueLED1.off() - self.box.cueLED2.off() - From 21666bfba6e902fc138d7adc47ffcc492bd2671c Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 5 Sep 2024 17:50:58 -0400 Subject: [PATCH 115/135] Add files via upload Files from Mitch that need to be in my branch now --- julia_test_self_admin.py | 446 ++++++++++++++++++++++++++ run_julia_test_self_admin.py | 137 ++++++++ session_info_julia_test_self_admin.py | 59 ++++ 3 files changed, 642 insertions(+) create mode 100644 julia_test_self_admin.py create mode 100644 run_julia_test_self_admin.py create mode 100644 session_info_julia_test_self_admin.py diff --git a/julia_test_self_admin.py b/julia_test_self_admin.py new file mode 100644 index 0000000..9bbe337 --- /dev/null +++ b/julia_test_self_admin.py @@ -0,0 +1,446 @@ +# add in all the imports etc +# !/usr/bin/env python +# coding: utf-8 +# In[ ]: +# python3: JB_Cocaine_Cue_Learning.py +""" +author: Julia Benville +date: 2024-08-05 +name: JB_Cocaine_Cue_Learning.py (adapted from remi_self_admin_lever_task.py) +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +# from IPython.display import display, HTML +# +# display(HTML("")) +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class CocaineSelfAdminLeverTask(object): + # Define states. States where the animals is waited to make their decision + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + # initialize the state for DRUG CUE LEARNING ONLY + self.states = [ + State(name='standby', + on_enter=['switch_to_reward_available'], + on_exit=["exit_standby"]), + State(name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"]), + Timeout(name='timeout', + on_enter=['enter_timeout'], + on_exit=['exit_timeout'], + timeout=self.session_info['timeout_time'], + on_timeout=['switch_to_reward_available'])] + + self.transitions = [ + ['start_trial_logic', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] + ['switch_to_standby', 'reward_available', 'standby'], + ['switch_to_reward_available', ['standby', 'timeout'], 'reward_available'], + ['switch_to_timeout', 'reward_available', 'timeout'], + ['end_task', ['reward_available', 'timeout'], 'standby']] + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby') + + # trial statistics + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.entry_time = 0.0 + self.entry_interval = self.session_info[ + "entry_interval"] # update lever_press_interval to entry_interval--make this 3s instead of 1s + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + self.DCL_time = 0 # changed from two contexts to this? just drug cue learning + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + self.timeline_left_poke = [] + self.timeline_right_poke = [] + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.syringe_pump = LED(17) + self.treadmill = self.box.treadmill + # for refining the lick detection REMOVING + self.reward_list = [] + self.left_poke_count_list = [] + self.right_poke_count_list = [] + # session_statistics + self.total_reward = 0 + + def reward(self): # prototype mouse weight equals 30 + infusion_duration = (self.session_info['weight'] / 30) #6.25 uL for a 30g mouse + self.syringe_pump.blink(2*infusion_duration, 0.1, 1) #2 second infusion duration for 6.25 ul (hence 2*) + self.reward_list.append(("syringe_pump_reward", 2*infusion_duration)) + logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(2*infusion_duration)) + + def fill_cath(self): + self.syringe_pump.blink(3.76, 0.1, 1) #3.125ul/second, calculated cath holds ~11.74ul; 3.76 seconds delivers ~12ul into cath; will need to update based on instech catheters + logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul;" + '3.76_second_infusion') + + def run(self): + if self.state == "standby" or self.state == 'timeout': + pass + elif self.state == 'reward_available': + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + if self.event_name == 'right_entry': + self.reward() + self.switch_to_timeout() + self.box.check_keybd() + + def enter_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];enter_standby;") + self.trial_running = False + self.box.event_list.clear() + + def exit_standby(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;") + self.box.event_list.clear() + self.fill_cath() + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;") + self.box.cueLED2.on() + self.box.event_list.clear() + self.trial_running = True + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;") + self.box.cueLED2.off() + self.box.event_list.clear() + + def enter_timeout(self): + logging.info(";" + str(time.time()) + ";[transition];enter_timeout;") + self.trial_running = False + self.box.sound2.on() + self.box.event_list.clear() + + def exit_timeout(self): + logging.info(";" + str(time.time()) + ";[transition];exit_timeout;") + self.box.sound2.off() + self.box.event_list.clear() + + #duy_visualization code commented out below# + # # import packages for starting a new process and plotting trial progress in real time + # # RPi4 does not have a graphical interface, we use pygame with backends for plotting + # import matplotlib + # matplotlib.use("Agg") + # import matplotlib.backends.backend_agg as agg + # import matplotlib.pyplot as plt + # import pygame + # from pygame.locals import * + # import numpy as np + # from multiprocessing import Process, Value + # + # # all modules above this line will have logging disabled + # logging.config.dictConfig({ + # 'version': 1, + # 'disable_existing_loggers': True, + # }) + # + # if debug_enable: + # # enabling debugger + # from IPython import get_ipython + # ipython = get_ipython() + # ipython.magic("pdb on") + # ipython.magic("xmode Verbose") + # + # # import the go_nogo_task task class here + # from go_nogo_task_phase2_final import go_nogo_phase2 + # + # # define the plotting function here + # def plot_trial_progress(current_trial, trial_list, combine_trial_outcome, hit_count, miss_count, + # cr_count, fa_count, lick_times, vstimON_time, plot_dprime, dprimebinp): + # ######################################################################## + # # initialize the figure + # ######################################################################## + # fig = plt.figure(figsize=(14, 9)) + # ax1 = fig.add_subplot(231) # outcome + # ax2 = fig.add_subplot(212) # eventplot + # ax3 = fig.add_subplot(232) + # ax4 = fig.add_subplot(233) + # + # ######################################################################## + # # create an outcome plot + # ######################################################################## + # if current_trial < 14: + # textstr = '\n'.join(( + # f"trial {trial_list[0]} : {combine_trial_outcome[0]}", + # f"trial {trial_list[1]} : {combine_trial_outcome[1]}", + # f"trial {trial_list[2]} : {combine_trial_outcome[2]}", + # f"trial {trial_list[3]} : {combine_trial_outcome[3]}", + # f"trial {trial_list[4]} : {combine_trial_outcome[4]}", + # f"trial {trial_list[5]} : {combine_trial_outcome[5]}", + # f"trial {trial_list[6]} : {combine_trial_outcome[6]}", + # f"trial {trial_list[7]} : {combine_trial_outcome[7]}", + # f"trial {trial_list[8]} : {combine_trial_outcome[8]}", + # f"trial {trial_list[9]} : {combine_trial_outcome[9]}", + # f"trial {trial_list[10]} : {combine_trial_outcome[10]}", + # f"trial {trial_list[11]} : {combine_trial_outcome[11]}", + # f"trial {trial_list[12]} : {combine_trial_outcome[12]}", + # f"trial {trial_list[13]} : {combine_trial_outcome[13]}", + # f" ", + # f"percent hit : {round(((hit_count[current_trial] / (hit_count[current_trial] + miss_count[current_trial])) * 100), 1)}%", + # f" ")) + # + # elif current_trial >= 14: + # textstr = '\n'.join(( + # f"trial {trial_list[0 + (current_trial - 13)]} : {combine_trial_outcome[0 + (current_trial - 13)]}", + # f"trial {trial_list[1 + (current_trial - 13)]} : {combine_trial_outcome[1 + (current_trial - 13)]}", + # f"trial {trial_list[2 + (current_trial - 13)]} : {combine_trial_outcome[2 + (current_trial - 13)]}", + # f"trial {trial_list[3 + (current_trial - 13)]} : {combine_trial_outcome[3 + (current_trial - 13)]}", + # f"trial {trial_list[4 + (current_trial - 13)]} : {combine_trial_outcome[4 + (current_trial - 13)]}", + # f"trial {trial_list[5 + (current_trial - 13)]} : {combine_trial_outcome[5 + (current_trial - 13)]}", + # f"trial {trial_list[6 + (current_trial - 13)]} : {combine_trial_outcome[6 + (current_trial - 13)]}", + # f"trial {trial_list[7 + (current_trial - 13)]} : {combine_trial_outcome[7 + (current_trial - 13)]}", + # f"trial {trial_list[8 + (current_trial - 13)]} : {combine_trial_outcome[8 + (current_trial - 13)]}", + # f"trial {trial_list[9 + (current_trial - 13)]} : {combine_trial_outcome[9 + (current_trial - 13)]}", + # f"trial {trial_list[10 + (current_trial - 13)]} : {combine_trial_outcome[10 + (current_trial - 13)]}", + # f"trial {trial_list[11 + (current_trial - 13)]} : {combine_trial_outcome[11 + (current_trial - 13)]}", + # f"trial {trial_list[12 + (current_trial - 13)]} : {combine_trial_outcome[12 + (current_trial - 13)]}", + # f"trial {trial_list[13 + (current_trial - 13)]} : {combine_trial_outcome[13 + (current_trial - 13)]}", + # f" ", + # f"percent hit : {round(((hit_count[current_trial] / (hit_count[current_trial] + miss_count[current_trial])) * 100), 1)}%", + # f" ")) + # + # ax1.set_title('Trial Outcome', fontsize=11) + # ax1.text(0.05, 0.95, textstr, fontsize=11, verticalalignment='top') + # ax1.set_xticklabels([]) + # ax1.set_xticks([]) + # ax1.set_yticks([]) + # ax1.set_yticklabels([]) + # + # ######################################################################## + # # create eventplot (vertical) + # ######################################################################## + # # create a 2D array for eventplot + # events_to_plot = [lick_times, [reward_time]] + # if combine_trial_outcome[current_trial] == "FA !!!": + # plot_period = 7 # in seconds, how long to plot since the start of trial + # plot_bin_number = 800 + # else: + # plot_period = 7 + # plot_bin_number = 800 + # + # # create vstim time data + # vstim_duration = 3 # in seconds, pre-generated + # vstim_bins = plot_bin_number # number of bins + # time_vstim_on = vstimON_time + # time_vstim_index_on = int(round(time_vstim_on * vstim_bins / plot_period)) + # time_vstim_index_off = int(time_vstim_index_on + round(vstim_duration * (vstim_bins / plot_period))) + # vstim_plot_data_x = np.linspace(0, plot_period, num=vstim_bins) + # vstim_plot_data_y = np.zeros(vstim_bins) - 1 + # range_of_vstim_on = int(time_vstim_index_off - time_vstim_index_on) + # vstim_plot_data_y[time_vstim_index_on:time_vstim_index_off] = np.zeros(range_of_vstim_on) - 0.2 + # + # # set different colors for each set of positions + # colors1 = ['C{}'.format(c) for c in range(2)] + # # set different line properties for each set of positions + # lineoffsets1 = np.array([3, 2]) + # linelengths1 = [0.8, 0.8] + # ax2.eventplot(events_to_plot, colors=colors1, lineoffsets=lineoffsets1, linelengths=linelengths1) + # ax2.plot(vstim_plot_data_x, vstim_plot_data_y) + # ax2.set_xlim([-0.5, 7]) # 8s total to show (trial duration) + # ax2.set_xlabel('Time since trial start (s)', fontsize=9) + # ax2.set_yticks((-1, 2, 3)) + # ax2.set_yticklabels(('vstim', 'reward', 'lick')) + # + # ######################################################################## + # # create cumulative outcome plot + # ######################################################################## + # # Get data to plot for current trial + # outcome_xvalue = np.linspace(0, current_trial, num=current_trial + 1) + # outcome_hit_count_yvalue = hit_count[0:current_trial + 1] + # outcome_miss_count_yvalue = miss_count[0:current_trial + 1] + # outcome_cr_count_yvalue = cr_count[0:current_trial + 1] + # outcome_fa_count_yvalue = fa_count[0:current_trial + 1] + # + # # Plot + # ax3.plot(outcome_xvalue, outcome_hit_count_yvalue, 'r-') + # ax3.lines[-1].set_label('Hit') + # ax3.plot(outcome_xvalue, outcome_miss_count_yvalue, 'b-') + # ax3.lines[-1].set_label('Miss') + # ax3.plot(outcome_xvalue, outcome_cr_count_yvalue, 'c-') + # ax3.lines[-1].set_label('CR') + # ax3.plot(outcome_xvalue, outcome_fa_count_yvalue, 'm-') + # ax3.lines[-1].set_label('FA') + # + # ax3.set_title('Cummulative outcome', fontsize=11) + # ax3.set_xlim([0, current_trial + 1]) + # ax3.set_xlabel('Current trial', fontsize=9) + # ax3.set_ylabel('Number of trials', fontsize=9) + # ax3.legend() + # + # ######################################################################## + # # create the d' figure + # ######################################################################## + # + # if plot_dprime == True: + # ax4_x_values = np.linspace(0, current_trial, num=current_trial + 1) + # ax4_y_values = dprimebinp[0:current_trial + 1] + # ax4.plot(ax4_x_values, ax4_y_values, 'r-') + # ax4.set_title('D-prime', fontsize=11) + # ax4.set_xlim([0, current_trial + 1]) + # ax4.set_xlabel('Current trial', fontsize=9) + # + # ######################################################################## + # # draw on canvas to display via pygame + # ######################################################################## + # canvas = agg.FigureCanvasAgg(fig) + # canvas.draw() + # renderer = canvas.get_renderer() + # raw_data = renderer.tostring_rgb() + # pygame.init() + # window = pygame.display.set_mode((1400, 900), DOUBLEBUF) + # screen = pygame.display.get_surface() + # size = canvas.get_width_height() + # surf = pygame.image.fromstring(raw_data, size, "RGB") + # screen.blit(surf, (0, 0)) + # pygame.display.flip() + # plt.close(fig) + # time.sleep(3) # sleep for 3 seconds for pygame to remain displayed + # pygame.quit() + + def update_plot(self): + fig, axes = plt.subplots(1, 1, ) + axes.plot([1, 2], [1, 2], color='green', label='test') + self.box.check_plot(fig) + + def update_plot_error(self): + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + fig, ax = plt.subplots(1, 1, ) + ax.bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax = plt.gca() + ax.set_xticks(ticks, labels) + ax.set_xticklabels(labels=labels, rotation=70) + self.box.check_plot(fig) + + + def update_plot_choice(self, save_fig=False): + trajectory_active = self.left_poke_count_list + time_active = self.timeline_left_poke + trajectory_inactive = self.right_poke_count_list + time_inactive = self.timeline_right_poke + fig, ax = plt.subplots(1, 1, ) + print(type(fig)) + ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') + ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_lever_choice_plot" + '.png') + self.box.check_plot(fig) + ## not sure if the above is right with the licks? + + + def integrate_plot(self, save_fig=False): + fig, ax = plt.subplots(2, 1) + trajectory_left = self.active_press + time_active_press = self.timeline_active_press + trajectory_right = self.right_poke_count_list + time_inactive_press = self.timeline_inactive_press + print(type(fig)) + ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') + ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') + error_event = self.error_list + labels, counts = np.unique(error_event, return_counts=True) + ticks = range(len(counts)) + ax[1].bar(ticks, counts, align='center', tick_label=labels) + # plt.xticks(ticks, labels) + # plt.title(session_name) + ax[1] = plt.gca() + ax[1].set_xticks(ticks, labels) + ax[1].set_xticklabels(labels=labels, rotation=70) + ######################################################################## + # methods to start and end the behavioral session + ######################################################################## + + def start_session(self): + ic("TODO: start video") + self.box.video_start() + + def end_session(self): + ic("TODO: stop video") + self.update_plot_choice(save_fig=True) + self.box.video_stop() + self.box.cueLED2.off() + ##also unsure if the things above are correct with the licks? + if save_fig: + plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ + 'basename'] + "_summery" + '.png') + self.box.check_plot(fig) \ No newline at end of file diff --git a/run_julia_test_self_admin.py b/run_julia_test_self_admin.py new file mode 100644 index 0000000..eca98a7 --- /dev/null +++ b/run_julia_test_self_admin.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + + +#run_julia_task_self_admin.py + +#!/usr/bin/env -S ipython3 -i +# run_julia_task_self_admin.py +""" +author: Mitch Farrell +date: 2024-08-30 +name: run_julia_task_self_admin.py +""" +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# all modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # enabling debugger + from IPython import get_ipython + + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# import your task class here +from julia_test_self_admin import CocaineSelfAdminLeverTask + +try: + # load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + session_info_path = '/home/pi/experiment_info/julia_test_self_admin/session_info/' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # sends copy of log output to screen + ] + ) + + task = CocaineSelfAdminLeverTask(name="julia_test_self_admin", session_info=session_info) + + # start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + # loop over trials + # Set a timer + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + i = True + task.start_trial_logic() + while i: + if time.time() >= t_end: + i = False + print("Times up, finishing up") + task.end_task() + break + while task.trial_running: #trial running in both standby and reward_available + if time.time() < t_end: + task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + raise SystemExit + +# graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# exit because of error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # save dicts to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() + diff --git a/session_info_julia_test_self_admin.py b/session_info_julia_test_self_admin.py new file mode 100644 index 0000000..9bbd6ef --- /dev/null +++ b/session_info_julia_test_self_admin.py @@ -0,0 +1,59 @@ +# session_info_julia_test_self_admin.py + +# put all of your mouse and session info in here + +import pysistence, collections +import socket + +# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (the user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['file_basename'] = 'place_holder' + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' + +session_info['weight'] = 32.18 +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +# session_info['config'] = 'freely_moving_v1' #?? +session_info['config'] = 'self_admin' #?? + +session_info['max_trial_number'] = 100 #safetyprecaution + +# behavior parameters +session_info['timeout_length'] = 20 # in seconds + + +#removed below for visual stim +# visual stimulus +#session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', +# '/home/pi/second_grating.dat'] +# session_info['vis_raws'] = [] + +# task related information + +session_info['config'] = 'headfixed_self_admin' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +#edit any of the below? anything for LED/tone or not in this doc? +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 10 # cm + session_info['treadmill_setup']['distance_cue'] = 25 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 \ No newline at end of file From ad9c925e92e734f2597a06ba5023a00211dd9d67 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Tue, 17 Sep 2024 09:22:57 -0400 Subject: [PATCH 116/135] Update run_julia_test_self_admin.py updates with a graceful exit --- run_julia_test_self_admin.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/run_julia_test_self_admin.py b/run_julia_test_self_admin.py index eca98a7..0a3afe9 100644 --- a/run_julia_test_self_admin.py +++ b/run_julia_test_self_admin.py @@ -106,14 +106,12 @@ i = True task.start_trial_logic() while i: - if time.time() >= t_end: + if t_end < time.time(): i = False - print("Times up, finishing up") task.end_task() - break - while task.trial_running: #trial running in both standby and reward_available - if time.time() < t_end: - task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop + print("Times up, finishing up") + while task.trial_running and t_end < time.time(): #trial running in both standby and reward_available + task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop raise SystemExit # graceful exit @@ -134,4 +132,3 @@ scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) task.end_session() - From 3dd443a3faad402e5a23c80caa60bfa685060b68 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Tue, 17 Sep 2024 09:23:51 -0400 Subject: [PATCH 117/135] Update session_info_julia_test_self_admin.py updates from mitch --- session_info_julia_test_self_admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/session_info_julia_test_self_admin.py b/session_info_julia_test_self_admin.py index 9bbd6ef..7d329e8 100644 --- a/session_info_julia_test_self_admin.py +++ b/session_info_julia_test_self_admin.py @@ -56,4 +56,4 @@ session_info['error_repeat'] = True if session_info['error_repeat']: - session_info['error_max'] = 3 \ No newline at end of file + session_info['error_max'] = 3 From 0d2fe7bf6df033e38db0178a2b79e5ce0c38526a Mon Sep 17 00:00:00 2001 From: juliabenville Date: Wed, 25 Sep 2024 16:19:04 -0400 Subject: [PATCH 118/135] Update session_info_julia_test_self_admin.py --- session_info_julia_test_self_admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/session_info_julia_test_self_admin.py b/session_info_julia_test_self_admin.py index 7d329e8..fe395f3 100644 --- a/session_info_julia_test_self_admin.py +++ b/session_info_julia_test_self_admin.py @@ -25,8 +25,8 @@ session_info['manual_date'] = '202x-xx-xx' session_info['box_name'] = socket.gethostname() -# session_info['config'] = 'freely_moving_v1' #?? -session_info['config'] = 'self_admin' #?? +# session_info['config'] = 'freely_moving_v1' +session_info['config'] = 'self_admin' session_info['max_trial_number'] = 100 #safetyprecaution From 89a884728c70b05c70c6bdd8ad8431420b046f89 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Wed, 25 Sep 2024 16:30:27 -0400 Subject: [PATCH 119/135] Update julia_test_self_admin.py mitch notes changes --- julia_test_self_admin.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/julia_test_self_admin.py b/julia_test_self_admin.py index 9bbe337..f72c8a9 100644 --- a/julia_test_self_admin.py +++ b/julia_test_self_admin.py @@ -74,26 +74,33 @@ def __init__(self, **kwargs): # name and session_info should be provided as kwa else: self.session_info = kwargs.get("session_info", None) ic(self.session_info) - # initialize the state for DRUG CUE LEARNING ONLY + # initialize the state for DRUG CUE LEARNING ONLY, this is NEW with the cath filling problem edited self.states = [ State(name='standby', - on_enter=['switch_to_reward_available'], - on_exit=["exit_standby"]), + on_exit=["exit_standby"]), State(name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"]), + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"]), Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=self.session_info['timeout_time'], + on_timeout=['switch_to_reward_available']), + Timeout(name='cath_fill', + on_enter=['enter_cath_fill'], + on_exit=['exit_cath_fill'], + timeout=self.session_info['cath_fill'], on_timeout=['switch_to_reward_available'])] + #edited relevant to updates with syringe filling issue + self.transitions = [ - ['start_trial_logic', 'standby', 'reward_available'], # format: ['trigger', 'origin', 'destination'] - ['switch_to_standby', 'reward_available', 'standby'], - ['switch_to_reward_available', ['standby', 'timeout'], 'reward_available'], + ['start_trial_logic', 'standby', 'cath_fill'], # format: ['trigger', 'origin', 'destination'] + ['switch_to_reward_available', [‘cath_fill’, 'timeout'], 'reward_available'], ['switch_to_timeout', 'reward_available', 'timeout'], ['end_task', ['reward_available', 'timeout'], 'standby']] + + self.machine = TimedStateMachine( model=self, states=self.states, @@ -192,6 +199,12 @@ def exit_timeout(self): self.box.sound2.off() self.box.event_list.clear() + def enter_cath_fill(self): + # self.error_repeat = False + logging.info(";" + str(time.time()) + ";[transition];exit_standby;") + self.box.event_list.clear() + self.fill_cath() + #duy_visualization code commented out below# # # import packages for starting a new process and plotting trial progress in real time # # RPi4 does not have a graphical interface, we use pygame with backends for plotting @@ -443,4 +456,4 @@ def end_session(self): if save_fig: plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) \ No newline at end of file + self.box.check_plot(fig) From 4d0bb8b71a2b71ad6d0793575309cbef2bd6349d Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 26 Sep 2024 10:28:15 -0400 Subject: [PATCH 120/135] Create julia_DCL_self_admin.py From ChatGPT edits to new task 1. 2 hours or 40 infusions 2. Trace interval --- julia_DCL_self_admin.py | 255 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 julia_DCL_self_admin.py diff --git a/julia_DCL_self_admin.py b/julia_DCL_self_admin.py new file mode 100644 index 0000000..db8e992 --- /dev/null +++ b/julia_DCL_self_admin.py @@ -0,0 +1,255 @@ +# add in all the imports etc +# !/usr/bin/env python +# coding: utf-8 +# In[ ]: +# python3: JB_Cocaine_Cue_Learning.py +""" +author: Julia Benville +date: 2024-08-05 +name: JB_Cocaine_Cue_Learning.py (adapted from remi_self_admin_lever_task.py) +""" +import importlib +from transitions import Machine +from transitions import State +from transitions.extensions.states import add_state_features, Timeout +import pysistence, collections +from icecream import ic +import logging +import time +from datetime import datetime +import os +from gpiozero import PWMLED, LED, Button +from colorama import Fore, Style +import logging.config +from time import sleep +import random +import threading +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.figure as fg +import numpy as np + +# from IPython.display import display, HTML +# +# display(HTML("")) +logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": True, + } +) +# all modules above this line will have logging disabled +import behavbox + + +# adding timing capability to the state machine +@add_state_features(Timeout) +class TimedStateMachine(Machine): + pass + + +class CocaineSelfAdminLeverTask(object): + # Define states. States where the animals is waited to make their decision + def __init__(self, **kwargs): # name and session_info should be provided as kwargs + # if no name or session, make fake ones (for testing purposes) + if kwargs.get("name", None) is None: + self.name = "name" + print( + Fore.RED + + Style.BRIGHT + + "Warning: no name supplied; making fake one" + + Style.RESET_ALL + ) + else: + self.name = kwargs.get("name", None) + if kwargs.get("session_info", None) is None: + print( + Fore.RED + + Style.BRIGHT + + "Warning: no session_info supplied; making fake one" + + Style.RESET_ALL + ) + from fake_session_info import fake_session_info + self.session_info = fake_session_info + else: + self.session_info = kwargs.get("session_info", None) + ic(self.session_info) + + # Initialize the state for DRUG CUE LEARNING ONLY, this is NEW with the cath filling problem edited + self.states = [ + State(name='standby', + on_exit=["exit_standby"]), + State(name="reward_available", + on_enter=["enter_reward_available"], + on_exit=["exit_reward_available"]), + Timeout(name='timeout', + on_enter=['enter_timeout'], + on_exit=['exit_timeout'], + timeout=self.session_info['timeout_time'], + on_timeout=['switch_to_reward_available']), + Timeout(name='cath_fill', + on_enter=['enter_cath_fill'], + on_exit=['exit_cath_fill'], + timeout=self.session_info['cath_fill'], + on_timeout=['switch_to_reward_available'])] + + # Add a new state for ending the session when conditions are met + self.states.append( + State(name='session_end', + on_enter=["enter_session_end"]) + ) + + self.transitions = [ + ['start_trial_logic', 'standby', 'cath_fill'], # format: ['trigger', 'origin', 'destination'] + ['switch_to_reward_available', ['cath_fill', 'timeout'], 'reward_available'], + ['switch_to_timeout', 'reward_available', 'timeout'], + ['end_task', ['reward_available', 'timeout'], 'standby'], + # New transition for ending the session + ['end_session', 'reward_available', 'session_end'], + ] + + self.machine = TimedStateMachine( + model=self, + states=self.states, + transitions=self.transitions, + initial='standby') + + # trial statistics + self.trial_running = False + self.innocent = True + self.trial_number = 0 + self.error_count = 0 + self.error_list = [] + self.error_repeat = False + self.entry_time = 0.0 + self.entry_interval = self.session_info[ + "entry_interval"] # update lever_press_interval to entry_interval--make this 3s instead of 1s + self.reward_time = 10 + self.reward_times_up = False + self.reward_pump1 = self.session_info["reward_pump1"] + self.reward_pump2 = self.session_info['reward_pump2'] + self.DCL_time = 0 # changed from two contexts to this? just drug cue learning + self.active_press = 0 + self.inactive_press = 0 + self.timeline_active_press = [] + self.active_press_count_list = [] + self.timeline_inactive_press = [] + self.inactive_press_count_list = [] + self.timeline_left_poke = [] + self.timeline_right_poke = [] + # initialize behavior box + self.box = behavbox.BehavBox(self.session_info) + self.pump = self.box.pump + self.syringe_pump = LED(17) + self.treadmill = self.box.treadmill + # for refining the lick detection REMOVING + self.reward_list = [] + self.left_poke_count_list = [] + self.right_poke_count_list = [] + # session_statistics + self.total_reward = 0 + self.infusions = 0 # Track the number of infusions + self.start_time = time.time() # Record the start time of the session + + def reward(self): # prototype mouse weight equals 30 + infusion_duration = (self.session_info['weight'] / 30) # 6.25 uL for a 30g mouse + self.syringe_pump.blink(2 * infusion_duration, 0.1, 1) # 2 second infusion duration for 6.25 ul (hence 2*) + self.reward_list.append(("syringe_pump_reward", 2 * infusion_duration)) + logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(2 * infusion_duration)) + + def fill_cath(self): + self.syringe_pump.blink(3.76, 0.1, 1) # 3.125ul/second, calculated cath holds ~11.74ul; 3.76 seconds delivers ~12ul into cath; will need to update based on instech catheters + logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul;" + '3.76_second_infusion') + + def run(self): + if self.state == "standby" or self.state == 'timeout': + pass + elif self.state == 'reward_available': + if self.box.event_list: + self.event_name = self.box.event_list.popleft() + else: + self.event_name = '' + + # Check for session end condition (40 infusions or 2 hours) + if self.infusions >= 40 or (time.time() - self.start_time) >= 7200: # 7200 seconds = 2 hours + self.end_session() + return # Exit run if session ended + + if self.event_name == 'right_entry': + self.process_active_lever_press() # Process the active lever press + + self.box.check_keybd() + + def process_active_lever_press(self): + # New behavior for active lever press + logging.info(";" + str(time.time()) + ";[lever_press];active_lever_pressed;") + + self.box.cueLED2.off() # Turn off the LED + self.box.sound2.on() # Turn on the noise + sleep(2) # Wait for 2 seconds + + self.box.sound2.off() # Turn off the noise after 2 seconds + self.box.cueLED2.on() # Turn the LED back on after 2 seconds + + sleep(1) # Wait for 1 second before infusion + self.reward() # Infuse drug + self.infusions += 1 # Increment infusion count + self.switch_to_timeout() # Switch to timeout state + + def enter_standby(self): + logging.info(";" + str(time.time()) + ";[transition];enter_standby;") + self.trial_running = False + self.box.event_list.clear() + + def exit_standby(self): + logging.info(";" + str(time.time()) + ";[transition];exit_standby;") + self.box.event_list.clear() + self.fill_cath() + + def enter_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;") + self.box.cueLED2.on() + self.box.event_list.clear() + self.trial_running = True + + def exit_reward_available(self): + logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;") + self.box.cueLED2.off() + self.box.event_list.clear() + + def enter_timeout(self): + logging.info(";" + str(time.time()) + ";[transition];enter_timeout;") + self.trial_running = False + self.box.sound2.on() + self.box.event_list.clear() + + def exit_timeout(self): + logging.info(";" + str(time.time()) + ";[transition];exit_timeout;") + self.box.sound2.off() + + def enter_cath_fill(self): + logging.info(";" + str(time.time()) + ";[transition];enter_cath_fill;") + self.trial_running = False + self.box.event_list.clear() + + def exit_cath_fill(self): + logging.info(";" + str(time.time()) + ";[transition];exit_cath_fill;") + self.fill_cath() + + def enter_session_end(self): + logging.info(";" + str(time.time()) + ";[transition];enter_session_end;") + self.box.cueLED2.off() # Turn off the LED + # Add any other session end logic needed here + + def end_session(self): + self.state = "session_end" + logging.info("Session has ended due to reaching infusion limit or time limit.") + + def end_task(self): + logging.info("Ending task...") + self.box.clean_exit() + +# to run it as a script +if __name__ == "__main__": + task = CocaineSelfAdminLeverTask(name="MouseTest", session_info={'weight': 30, 'timeout_time': 10, 'cath_fill': 3}) + task.run() From db479110af43d043ca77031e98ad81fd64c46ff3 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 26 Sep 2024 11:04:48 -0400 Subject: [PATCH 121/135] Update julia_DCL_self_admin.py changes for our the 12.5ul --- julia_DCL_self_admin.py | 181 +++++++++++++--------------------------- 1 file changed, 60 insertions(+), 121 deletions(-) diff --git a/julia_DCL_self_admin.py b/julia_DCL_self_admin.py index db8e992..2764b77 100644 --- a/julia_DCL_self_admin.py +++ b/julia_DCL_self_admin.py @@ -1,18 +1,16 @@ -# add in all the imports etc -# !/usr/bin/env python +#!/usr/bin/env python # coding: utf-8 -# In[ ]: -# python3: JB_Cocaine_Cue_Learning.py + """ author: Julia Benville date: 2024-08-05 name: JB_Cocaine_Cue_Learning.py (adapted from remi_self_admin_lever_task.py) """ + import importlib -from transitions import Machine -from transitions import State +from transitions import Machine, State from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections +import pysistence from icecream import ic import logging import time @@ -24,145 +22,91 @@ from time import sleep import random import threading -import matplotlib import matplotlib.pyplot as plt -import matplotlib.figure as fg import numpy as np +import behavbox -# from IPython.display import display, HTML -# -# display(HTML("")) +# Configure logging logging.config.dictConfig( { "version": 1, "disable_existing_loggers": True, } ) -# all modules above this line will have logging disabled -import behavbox - -# adding timing capability to the state machine +# Adding timing capability to the state machine @add_state_features(Timeout) class TimedStateMachine(Machine): pass class CocaineSelfAdminLeverTask(object): - # Define states. States where the animals is waited to make their decision - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - # if no name or session, make fake ones (for testing purposes) + def __init__(self, **kwargs): + # Set name and session_info if kwargs.get("name", None) is None: self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) + print(Fore.RED + Style.BRIGHT + "Warning: no name supplied; using default 'name'" + Style.RESET_ALL) else: - self.name = kwargs.get("name", None) + self.name = kwargs.get("name") + if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) + print(Fore.RED + Style.BRIGHT + "Warning: no session_info supplied; using default session_info" + Style.RESET_ALL) from fake_session_info import fake_session_info self.session_info = fake_session_info else: - self.session_info = kwargs.get("session_info", None) + self.session_info = kwargs.get("session_info") + ic(self.session_info) - # Initialize the state for DRUG CUE LEARNING ONLY, this is NEW with the cath filling problem edited + # Define states and transitions self.states = [ - State(name='standby', - on_exit=["exit_standby"]), - State(name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"]), - Timeout(name='timeout', - on_enter=['enter_timeout'], - on_exit=['exit_timeout'], - timeout=self.session_info['timeout_time'], - on_timeout=['switch_to_reward_available']), - Timeout(name='cath_fill', - on_enter=['enter_cath_fill'], - on_exit=['exit_cath_fill'], - timeout=self.session_info['cath_fill'], - on_timeout=['switch_to_reward_available'])] - - # Add a new state for ending the session when conditions are met - self.states.append( - State(name='session_end', - on_enter=["enter_session_end"]) - ) + State(name='standby', on_exit=["exit_standby"]), + State(name="reward_available", on_enter=["enter_reward_available"], on_exit=["exit_reward_available"]), + Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=self.session_info['timeout_time'], on_timeout=['switch_to_reward_available']), + Timeout(name='cath_fill', on_enter=['enter_cath_fill'], on_exit=['exit_cath_fill'], timeout=self.session_info['cath_fill'], on_timeout=['switch_to_reward_available']) + ] + + self.states.append(State(name='session_end', on_enter=["enter_session_end"])) self.transitions = [ - ['start_trial_logic', 'standby', 'cath_fill'], # format: ['trigger', 'origin', 'destination'] + ['start_trial_logic', 'standby', 'cath_fill'], ['switch_to_reward_available', ['cath_fill', 'timeout'], 'reward_available'], ['switch_to_timeout', 'reward_available', 'timeout'], ['end_task', ['reward_available', 'timeout'], 'standby'], - # New transition for ending the session ['end_session', 'reward_available', 'session_end'], ] - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby') + self.machine = TimedStateMachine(model=self, states=self.states, transitions=self.transitions, initial='standby') - # trial statistics + # Initialize variables for trials self.trial_running = False - self.innocent = True self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.entry_time = 0.0 - self.entry_interval = self.session_info[ - "entry_interval"] # update lever_press_interval to entry_interval--make this 3s instead of 1s + self.entry_interval = self.session_info['entry_interval'] self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - self.DCL_time = 0 # changed from two contexts to this? just drug cue learning - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - self.timeline_left_poke = [] - self.timeline_right_poke = [] - # initialize behavior box + self.reward_list = [] + self.infusions = 0 # Track the number of infusions + self.start_time = time.time() # Record session start time + + # Initialize behavior box self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump self.syringe_pump = LED(17) - self.treadmill = self.box.treadmill - # for refining the lick detection REMOVING - self.reward_list = [] - self.left_poke_count_list = [] - self.right_poke_count_list = [] - # session_statistics self.total_reward = 0 - self.infusions = 0 # Track the number of infusions - self.start_time = time.time() # Record the start time of the session - def reward(self): # prototype mouse weight equals 30 - infusion_duration = (self.session_info['weight'] / 30) # 6.25 uL for a 30g mouse - self.syringe_pump.blink(2 * infusion_duration, 0.1, 1) # 2 second infusion duration for 6.25 ul (hence 2*) - self.reward_list.append(("syringe_pump_reward", 2 * infusion_duration)) - logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(2 * infusion_duration)) + def reward(self): + # Updated for 0.75 mg/kg dose with a 12.5 µL infusion per bolus + infusion_duration = 12.5 / 3.125 # 12.5 µL at 3.125 µL/sec rate + self.syringe_pump.blink(infusion_duration, 0.1, 1) # Infuse drug for calculated duration + self.reward_list.append(("syringe_pump_reward", infusion_duration)) + logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward;" + str(infusion_duration)) def fill_cath(self): - self.syringe_pump.blink(3.76, 0.1, 1) # 3.125ul/second, calculated cath holds ~11.74ul; 3.76 seconds delivers ~12ul into cath; will need to update based on instech catheters - logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul;" + '3.76_second_infusion') + # Update to fill catheter with ~12 µL + infusion_duration = 12 / 3.125 # 12 µL at 3.125 µL/sec rate + self.syringe_pump.blink(infusion_duration, 0.1, 1) # Infuse ~12 µL + logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul;" + str(infusion_duration) + "_second_infusion") def run(self): - if self.state == "standby" or self.state == 'timeout': + if self.state in ["standby", "timeout"]: pass elif self.state == 'reward_available': if self.box.event_list: @@ -170,31 +114,27 @@ def run(self): else: self.event_name = '' - # Check for session end condition (40 infusions or 2 hours) - if self.infusions >= 40 or (time.time() - self.start_time) >= 7200: # 7200 seconds = 2 hours + # Check for session end (40 infusions or 2 hours) + if self.infusions >= 40 or (time.time() - self.start_time) >= 7200: self.end_session() - return # Exit run if session ended + return if self.event_name == 'right_entry': - self.process_active_lever_press() # Process the active lever press + self.process_active_lever_press() self.box.check_keybd() def process_active_lever_press(self): - # New behavior for active lever press logging.info(";" + str(time.time()) + ";[lever_press];active_lever_pressed;") - - self.box.cueLED2.off() # Turn off the LED - self.box.sound2.on() # Turn on the noise - sleep(2) # Wait for 2 seconds - - self.box.sound2.off() # Turn off the noise after 2 seconds - self.box.cueLED2.on() # Turn the LED back on after 2 seconds - - sleep(1) # Wait for 1 second before infusion + self.box.cueLED2.off() # Turn off LED + self.box.sound2.on() # Play sound + sleep(2) + self.box.sound2.off() # Turn sound off + self.box.cueLED2.on() # Turn LED back on + sleep(1) self.reward() # Infuse drug - self.infusions += 1 # Increment infusion count - self.switch_to_timeout() # Switch to timeout state + self.infusions += 1 + self.switch_to_timeout() def enter_standby(self): logging.info(";" + str(time.time()) + ";[transition];enter_standby;") @@ -221,7 +161,6 @@ def enter_timeout(self): logging.info(";" + str(time.time()) + ";[transition];enter_timeout;") self.trial_running = False self.box.sound2.on() - self.box.event_list.clear() def exit_timeout(self): logging.info(";" + str(time.time()) + ";[transition];exit_timeout;") @@ -238,18 +177,18 @@ def exit_cath_fill(self): def enter_session_end(self): logging.info(";" + str(time.time()) + ";[transition];enter_session_end;") - self.box.cueLED2.off() # Turn off the LED - # Add any other session end logic needed here + self.box.cueLED2.off() def end_session(self): self.state = "session_end" - logging.info("Session has ended due to reaching infusion limit or time limit.") + logging.info("Session ended due to reaching infusion or time limit.") def end_task(self): logging.info("Ending task...") self.box.clean_exit() -# to run it as a script + +# To run as a script if __name__ == "__main__": task = CocaineSelfAdminLeverTask(name="MouseTest", session_info={'weight': 30, 'timeout_time': 10, 'cath_fill': 3}) task.run() From 020f867f0384d254a6d080d0121eed0b0142d82e Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 26 Sep 2024 13:02:43 -0400 Subject: [PATCH 122/135] Update julia_DCL_self_admin.py updates for cues --- julia_DCL_self_admin.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/julia_DCL_self_admin.py b/julia_DCL_self_admin.py index 2764b77..9754f0f 100644 --- a/julia_DCL_self_admin.py +++ b/julia_DCL_self_admin.py @@ -62,7 +62,7 @@ def __init__(self, **kwargs): self.states = [ State(name='standby', on_exit=["exit_standby"]), State(name="reward_available", on_enter=["enter_reward_available"], on_exit=["exit_reward_available"]), - Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=self.session_info['timeout_time'], on_timeout=['switch_to_reward_available']), + Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=23, on_timeout=['switch_to_reward_available']), # Timeout lasts 23 seconds Timeout(name='cath_fill', on_enter=['enter_cath_fill'], on_exit=['exit_cath_fill'], timeout=self.session_info['cath_fill'], on_timeout=['switch_to_reward_available']) ] @@ -126,16 +126,20 @@ def run(self): def process_active_lever_press(self): logging.info(";" + str(time.time()) + ";[lever_press];active_lever_pressed;") - self.box.cueLED2.off() # Turn off LED - self.box.sound2.on() # Play sound - sleep(2) - self.box.sound2.off() # Turn sound off - self.box.cueLED2.on() # Turn LED back on - sleep(1) - self.reward() # Infuse drug + self.box.cueLED2.off() # Turn off LED immediately at time 0 + self.box.sound2.on() # Play sound immediately at time 0 + + # Schedule LED and sound events after specific delays + threading.Timer(2, self._handle_led_sound_switch).start() # Switch LED on and sound off at second 2 + threading.Timer(3, self.reward).start() # Start the infusion at second 3 + self.infusions += 1 self.switch_to_timeout() + def _handle_led_sound_switch(self): + self.box.sound2.off() # Turn sound off at second 2 + self.box.cueLED2.on() # Turn LED back on at second 2 + def enter_standby(self): logging.info(";" + str(time.time()) + ";[transition];enter_standby;") self.trial_running = False @@ -190,5 +194,5 @@ def end_task(self): # To run as a script if __name__ == "__main__": - task = CocaineSelfAdminLeverTask(name="MouseTest", session_info={'weight': 30, 'timeout_time': 10, 'cath_fill': 3}) + task = CocaineSelfAdminLeverTask(name="MouseTest", session_info={'weight': 30, 'timeout_time': 23, 'cath_fill': 3}) task.run() From f0a26c932b7277a07b5c477544b003be79018089 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 26 Sep 2024 13:16:03 -0400 Subject: [PATCH 123/135] Update julia_DCL_self_admin.py finsihing timeline of the task --- julia_DCL_self_admin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/julia_DCL_self_admin.py b/julia_DCL_self_admin.py index 9754f0f..b020c9f 100644 --- a/julia_DCL_self_admin.py +++ b/julia_DCL_self_admin.py @@ -62,7 +62,7 @@ def __init__(self, **kwargs): self.states = [ State(name='standby', on_exit=["exit_standby"]), State(name="reward_available", on_enter=["enter_reward_available"], on_exit=["exit_reward_available"]), - Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=23, on_timeout=['switch_to_reward_available']), # Timeout lasts 23 seconds + Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=20, on_timeout=['switch_to_reward_available']), # Timeout lasts 20 seconds after infusion Timeout(name='cath_fill', on_enter=['enter_cath_fill'], on_exit=['exit_cath_fill'], timeout=self.session_info['cath_fill'], on_timeout=['switch_to_reward_available']) ] @@ -134,7 +134,8 @@ def process_active_lever_press(self): threading.Timer(3, self.reward).start() # Start the infusion at second 3 self.infusions += 1 - self.switch_to_timeout() + # Start the 20-second timeout after the 3-second infusion + threading.Timer(3, self.switch_to_timeout).start() # Switch to timeout 3 seconds after the lever press def _handle_led_sound_switch(self): self.box.sound2.off() # Turn sound off at second 2 From 62e8da6dfafb9bd4342feae3255ddaacc44b7fbc Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 26 Sep 2024 13:38:46 -0400 Subject: [PATCH 124/135] Create run_julia_IVSA.py --- run_julia_IVSA.py | 135 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 run_julia_IVSA.py diff --git a/run_julia_IVSA.py b/run_julia_IVSA.py new file mode 100644 index 0000000..a86681f --- /dev/null +++ b/run_julia_IVSA.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# coding: utf-8 + +#run_julia_task_self_admin.py + +#!/usr/bin/env -S ipython3 -i +# run_julia_task_self_admin.py +""" +author: Julia Benville +date: 2024-09-26 +name: run_julia_task_self_admin.py +""" + +import random +from transitions import Machine +from transitions import State +from icecream import ic +import logging +from datetime import datetime +import os +import logging.config +import pysistence, collections +import socket +import importlib +import colorama +import warnings +import scipy.io, pickle +import pygame +from colorama import Fore, Style +import time +from time import sleep + +debug_enable = False + +# All modules above this line will have logging disabled +logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, +}) + +if debug_enable: + # Enabling debugger + from IPython import get_ipython + ipython = get_ipython() + ipython.magic("pdb on") + ipython.magic("xmode Verbose") + +# Import your task class here +from julia_DCL_self_admin import CocaineSelfAdminLeverTask + +try: + # Load in session_info file, check that dates are correct, put in automatic + # time and date stamps for when the experiment was run + + datestr = datetime.now().strftime("%Y-%m-%d") + timestr = datetime.now().strftime('%H%M%S') + full_module_name = 'session_info_' + datestr + import sys + + # Update file paths to match your setup + session_info_path = '/home/pi/experiment_info/julia_DCL_self_admin/session_info/' + sys.path.insert(0, session_info_path) + tempmod = importlib.import_module(full_module_name) + session_info = tempmod.session_info + mouse_info = tempmod.mouse_info + + session_info['date'] = datestr + session_info['time'] = timestr + session_info['datetime'] = session_info['date'] + '_' + session_info['time'] + session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] + session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] + + if session_info['manual_date'] != session_info['date']: # Check if file is updated + print('wrong date!!') + raise RuntimeError('manual_date field in session_info file is not updated') + + # Make data directory and initialize logfile + os.makedirs(session_info['dir_name']) + os.chdir(session_info['dir_name']) + session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", + datefmt=('%H:%M:%S'), + handlers=[ + logging.FileHandler(session_info['file_basename'] + '.log'), + logging.StreamHandler() # Sends copy of log output to screen + ] + ) + + # Initialize task + task = CocaineSelfAdminLeverTask(name="julia_DCL_self_admin", session_info=session_info) + + # Start session + task.start_session() + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + sleep(10) + + # Loop over trials + # Set a timer for the experiment duration + t_minute = int(input("Enter the time in minutes: ")) + t_end = time.time() + 60 * t_minute + + i = True + task.start_trial_logic() + while i: + if t_end < time.time(): + i = False + task.end_task() + print("Times up, finishing up") + while task.trial_running and t_end < time.time(): # Trial running in both standby and reward_available + task.run() # This breaks out of the loop during transitions between blocks + # and permits checking the t_end clock in this loop + raise SystemExit + +# Graceful exit +except (KeyboardInterrupt, SystemExit): + print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) + ic('about to call end_session()') + task.end_session() + ic('just called end_session()') + # Save session information to disk + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + pygame.quit() + +# Exit due to error +except RuntimeError as ex: + print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) + # Save session information to disk in case of an error + scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) + pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) + task.end_session() From 561e49027873727dc3de22ac946b41a6434b8b6e Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 26 Sep 2024 13:54:33 -0400 Subject: [PATCH 125/135] Create session_info_julia_IVSA chat created updates --- session_info_julia_IVSA | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 session_info_julia_IVSA diff --git a/session_info_julia_IVSA b/session_info_julia_IVSA new file mode 100644 index 0000000..4fd279c --- /dev/null +++ b/session_info_julia_IVSA @@ -0,0 +1,58 @@ +# session_info_julia_test_self_admin.py + +import pysistence, collections +import socket + +# Defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) +mouse_info = pysistence.make_dict({'mouse_name': 'test', + 'fake_field': 'fake_info', + }) + +# Information for this session (user should edit this each session) +session_info = collections.OrderedDict() +session_info['mouse_info'] = mouse_info +session_info['mouse_name'] = mouse_info['mouse_name'] + +session_info['file_basename'] = 'place_holder' + +session_info['basedir'] = '/home/pi/buffer' +session_info['external_storage'] = '/mnt/hd' +session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' + +# Mouse weight is entered here and read by the task file +session_info['weight'] = 32.18 # Modify this as needed + +session_info['manual_date'] = '202x-xx-xx' +session_info['box_name'] = socket.gethostname() + +session_info['config'] = 'self_admin' + +session_info['max_trial_number'] = 100 # Safety precaution + +# Behavior parameters +session_info['timeout_length'] = 20 # in seconds + +# Added cath_fill for catheter fill duration +session_info['cath_fill'] = 3 # in seconds, modify as needed for the task + +# removed below for visual stim +# visual stimulus +# session_info["visual_stimulus"] = False +# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli +# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', +# '/home/pi/second_grating.dat'] +# session_info['vis_raws'] = [] + +# Task-related information +session_info['config'] = 'headfixed_self_admin' +session_info['treadmill_setup'] = {} +session_info['treadmill'] = True +if session_info['treadmill']: + session_info['treadmill_setup']['distance_initiation'] = 10 # cm + session_info['treadmill_setup']['distance_cue'] = 25 # cm +else: + session_info['treadmill_setup'] = None + +session_info['error_repeat'] = True +if session_info['error_repeat']: + session_info['error_max'] = 3 From 369225bd68e23a776ef0701b23693744c64d547c Mon Sep 17 00:00:00 2001 From: juliabenville Date: Thu, 26 Sep 2024 13:55:55 -0400 Subject: [PATCH 126/135] Update julia_DCL_self_admin.py updates from the session info file --- julia_DCL_self_admin.py | 107 ++++++++++++---------------------------- 1 file changed, 31 insertions(+), 76 deletions(-) diff --git a/julia_DCL_self_admin.py b/julia_DCL_self_admin.py index b020c9f..5c90f7b 100644 --- a/julia_DCL_self_admin.py +++ b/julia_DCL_self_admin.py @@ -4,14 +4,13 @@ """ author: Julia Benville date: 2024-08-05 -name: JB_Cocaine_Cue_Learning.py (adapted from remi_self_admin_lever_task.py) +name: julia_DCL_self_admin.py (adapted from remi_self_admin_lever_task.py) """ import importlib from transitions import Machine, State from transitions.extensions.states import add_state_features, Timeout import pysistence -from icecream import ic import logging import time from datetime import datetime @@ -39,7 +38,6 @@ class TimedStateMachine(Machine): pass - class CocaineSelfAdminLeverTask(object): def __init__(self, **kwargs): # Set name and session_info @@ -56,13 +54,19 @@ def __init__(self, **kwargs): else: self.session_info = kwargs.get("session_info") - ic(self.session_info) + # Access mouse weight from session info + self.mouse_weight = self.session_info['weight'] # Read mouse weight from session_info + + # Define drug dosage parameters + self.dosage_mg_per_kg = 0.75 # 0.75 mg/kg + self.infusion_rate_ul_per_sec = 3.125 # Infusion rate in µL/sec + self.bolus_volume_ul = 12.5 # Bolus volume per infusion in µL # Define states and transitions self.states = [ State(name='standby', on_exit=["exit_standby"]), State(name="reward_available", on_enter=["enter_reward_available"], on_exit=["exit_reward_available"]), - Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=20, on_timeout=['switch_to_reward_available']), # Timeout lasts 20 seconds after infusion + Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=20, on_timeout=['switch_to_reward_available']), Timeout(name='cath_fill', on_enter=['enter_cath_fill'], on_exit=['exit_cath_fill'], timeout=self.session_info['cath_fill'], on_timeout=['switch_to_reward_available']) ] @@ -78,103 +82,61 @@ def __init__(self, **kwargs): self.machine = TimedStateMachine(model=self, states=self.states, transitions=self.transitions, initial='standby') - # Initialize variables for trials - self.trial_running = False - self.trial_number = 0 - self.entry_interval = self.session_info['entry_interval'] - self.reward_time = 10 - self.reward_list = [] - self.infusions = 0 # Track the number of infusions - self.start_time = time.time() # Record session start time - - # Initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.syringe_pump = LED(17) - self.total_reward = 0 + self.syringe_pump = PWMLED(17) + self.infusions = 0 + self.start_time = time.time() + + def calculate_infusion_duration(self): + # Calculate drug infusion duration based on bolus volume and infusion rate + dose_volume = self.bolus_volume_ul + infusion_duration = dose_volume / self.infusion_rate_ul_per_sec + return infusion_duration def reward(self): - # Updated for 0.75 mg/kg dose with a 12.5 µL infusion per bolus - infusion_duration = 12.5 / 3.125 # 12.5 µL at 3.125 µL/sec rate - self.syringe_pump.blink(infusion_duration, 0.1, 1) # Infuse drug for calculated duration - self.reward_list.append(("syringe_pump_reward", infusion_duration)) - logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward;" + str(infusion_duration)) + # Infusion duration calculation + infusion_duration = self.calculate_infusion_duration() + + # Infuse drug for calculated duration + self.syringe_pump.blink(infusion_duration, 0.1, 1) + logging.info(f";{time.time()};[reward];syringe_pump_reward;{infusion_duration}") def fill_cath(self): - # Update to fill catheter with ~12 µL - infusion_duration = 12 / 3.125 # 12 µL at 3.125 µL/sec rate - self.syringe_pump.blink(infusion_duration, 0.1, 1) # Infuse ~12 µL - logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul;" + str(infusion_duration) + "_second_infusion") + # Use 'cath_fill' value from session_info for the catheter fill duration + self.syringe_pump.blink(self.session_info['cath_fill'], 0.1, 1) + logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul") def run(self): if self.state in ["standby", "timeout"]: pass elif self.state == 'reward_available': - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - - # Check for session end (40 infusions or 2 hours) if self.infusions >= 40 or (time.time() - self.start_time) >= 7200: self.end_session() return - - if self.event_name == 'right_entry': - self.process_active_lever_press() - - self.box.check_keybd() - - def process_active_lever_press(self): - logging.info(";" + str(time.time()) + ";[lever_press];active_lever_pressed;") - self.box.cueLED2.off() # Turn off LED immediately at time 0 - self.box.sound2.on() # Play sound immediately at time 0 - - # Schedule LED and sound events after specific delays - threading.Timer(2, self._handle_led_sound_switch).start() # Switch LED on and sound off at second 2 - threading.Timer(3, self.reward).start() # Start the infusion at second 3 - - self.infusions += 1 - # Start the 20-second timeout after the 3-second infusion - threading.Timer(3, self.switch_to_timeout).start() # Switch to timeout 3 seconds after the lever press - - def _handle_led_sound_switch(self): - self.box.sound2.off() # Turn sound off at second 2 - self.box.cueLED2.on() # Turn LED back on at second 2 + self.infusions += 1 + threading.Timer(3, self.reward).start() # Start infusion 3 seconds after lever press + threading.Timer(3, self.switch_to_timeout).start() # Switch to timeout 3 seconds after lever press def enter_standby(self): logging.info(";" + str(time.time()) + ";[transition];enter_standby;") - self.trial_running = False - self.box.event_list.clear() def exit_standby(self): logging.info(";" + str(time.time()) + ";[transition];exit_standby;") - self.box.event_list.clear() self.fill_cath() def enter_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;") - self.box.cueLED2.on() - self.box.event_list.clear() - self.trial_running = True def exit_reward_available(self): logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;") - self.box.cueLED2.off() - self.box.event_list.clear() def enter_timeout(self): logging.info(";" + str(time.time()) + ";[transition];enter_timeout;") - self.trial_running = False - self.box.sound2.on() def exit_timeout(self): logging.info(";" + str(time.time()) + ";[transition];exit_timeout;") - self.box.sound2.off() def enter_cath_fill(self): logging.info(";" + str(time.time()) + ";[transition];enter_cath_fill;") - self.trial_running = False - self.box.event_list.clear() def exit_cath_fill(self): logging.info(";" + str(time.time()) + ";[transition];exit_cath_fill;") @@ -182,7 +144,7 @@ def exit_cath_fill(self): def enter_session_end(self): logging.info(";" + str(time.time()) + ";[transition];enter_session_end;") - self.box.cueLED2.off() + self.syringe_pump.off() def end_session(self): self.state = "session_end" @@ -190,10 +152,3 @@ def end_session(self): def end_task(self): logging.info("Ending task...") - self.box.clean_exit() - - -# To run as a script -if __name__ == "__main__": - task = CocaineSelfAdminLeverTask(name="MouseTest", session_info={'weight': 30, 'timeout_time': 23, 'cath_fill': 3}) - task.run() From d4642092ec0f12342d5b530c9cbfc0f73c8f2e7f Mon Sep 17 00:00:00 2001 From: juliabenville Date: Mon, 30 Sep 2024 11:59:23 -0400 Subject: [PATCH 127/135] Update julia_DCL_self_admin.py updates with syringe pump --- julia_DCL_self_admin.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/julia_DCL_self_admin.py b/julia_DCL_self_admin.py index 5c90f7b..3222b01 100644 --- a/julia_DCL_self_admin.py +++ b/julia_DCL_self_admin.py @@ -58,9 +58,26 @@ def __init__(self, **kwargs): self.mouse_weight = self.session_info['weight'] # Read mouse weight from session_info # Define drug dosage parameters - self.dosage_mg_per_kg = 0.75 # 0.75 mg/kg - self.infusion_rate_ul_per_sec = 3.125 # Infusion rate in µL/sec - self.bolus_volume_ul = 12.5 # Bolus volume per infusion in µL + self.dosage_mg_per_kg = 0.75 # 0.75 mg/kg dosage per infusion + self.infusion_rate_ul_per_sec = 6.25 # Infusion rate in µL/sec (converted from 375 µL/min) + self.solution_concentration_mg_per_ml = 1.8 # Concentration of cocaine solution in mg/mL + + # Calculate the required dosage for this mouse in mg per infusion + dosage_mg = self.dosage_mg_per_kg * self.mouse_weight # Amount of cocaine in mg needed per infusion + + # Calculate the required bolus volume in µL based on the solution concentration + self.bolus_volume_ul = (dosage_mg / self.solution_concentration_mg_per_ml) * 1000 # Convert from mL to µL + + # Calculate infusion time in seconds based on bolus volume and infusion rate + self.infusion_time_sec = self.bolus_volume_ul / self.infusion_rate_ul_per_sec + + # Print statements for debugging (optional) + print(f"Mouse weight: {self.mouse_weight} kg") + print(f"Dosage per infusion: {dosage_mg} mg") + print(f"Bolus volume: {self.bolus_volume_ul} µL") + print(f"Infusion time: {self.infusion_time_sec} seconds") + +# Now, you can use self.bolus_volume_ul and self.infusion_time_sec to control your infusion pump. # Define states and transitions self.states = [ From 0cd9a234bffaa28475c1846b2bdd3c567e697155 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Wed, 2 Oct 2024 09:03:10 -0400 Subject: [PATCH 128/135] Rename session_info_julia_IVSA to session_info_julia_IVSA.py changed to .py --- session_info_julia_IVSA => session_info_julia_IVSA.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename session_info_julia_IVSA => session_info_julia_IVSA.py (100%) diff --git a/session_info_julia_IVSA b/session_info_julia_IVSA.py similarity index 100% rename from session_info_julia_IVSA rename to session_info_julia_IVSA.py From 5afc01135de5356318700e96fce4aa55dbcd9baa Mon Sep 17 00:00:00 2001 From: juliabenville Date: Mon, 11 Nov 2024 14:04:13 -0500 Subject: [PATCH 129/135] Delete session_info_julia_test_self_admin.py --- session_info_julia_test_self_admin.py | 59 --------------------------- 1 file changed, 59 deletions(-) delete mode 100644 session_info_julia_test_self_admin.py diff --git a/session_info_julia_test_self_admin.py b/session_info_julia_test_self_admin.py deleted file mode 100644 index fe395f3..0000000 --- a/session_info_julia_test_self_admin.py +++ /dev/null @@ -1,59 +0,0 @@ -# session_info_julia_test_self_admin.py - -# put all of your mouse and session info in here - -import pysistence, collections -import socket - -# defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (the user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['file_basename'] = 'place_holder' - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' - -session_info['weight'] = 32.18 -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -# session_info['config'] = 'freely_moving_v1' -session_info['config'] = 'self_admin' - -session_info['max_trial_number'] = 100 #safetyprecaution - -# behavior parameters -session_info['timeout_length'] = 20 # in seconds - - -#removed below for visual stim -# visual stimulus -#session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', -# '/home/pi/second_grating.dat'] -# session_info['vis_raws'] = [] - -# task related information - -session_info['config'] = 'headfixed_self_admin' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True -#edit any of the below? anything for LED/tone or not in this doc? -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 10 # cm - session_info['treadmill_setup']['distance_cue'] = 25 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 From 48a8a0ce12757f81bf3afc7d8a85cb8d77f825f9 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Mon, 11 Nov 2024 14:04:22 -0500 Subject: [PATCH 130/135] Delete session_info_julia_IVSA.py --- session_info_julia_IVSA.py | 58 -------------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 session_info_julia_IVSA.py diff --git a/session_info_julia_IVSA.py b/session_info_julia_IVSA.py deleted file mode 100644 index 4fd279c..0000000 --- a/session_info_julia_IVSA.py +++ /dev/null @@ -1,58 +0,0 @@ -# session_info_julia_test_self_admin.py - -import pysistence, collections -import socket - -# Defining immutable mouse dict (once defined for a mouse, NEVER EDIT IT) -mouse_info = pysistence.make_dict({'mouse_name': 'test', - 'fake_field': 'fake_info', - }) - -# Information for this session (user should edit this each session) -session_info = collections.OrderedDict() -session_info['mouse_info'] = mouse_info -session_info['mouse_name'] = mouse_info['mouse_name'] - -session_info['file_basename'] = 'place_holder' - -session_info['basedir'] = '/home/pi/buffer' -session_info['external_storage'] = '/mnt/hd' -session_info['flipper_filename'] = '/home/pi/buffer/flipper_timestamp' - -# Mouse weight is entered here and read by the task file -session_info['weight'] = 32.18 # Modify this as needed - -session_info['manual_date'] = '202x-xx-xx' -session_info['box_name'] = socket.gethostname() - -session_info['config'] = 'self_admin' - -session_info['max_trial_number'] = 100 # Safety precaution - -# Behavior parameters -session_info['timeout_length'] = 20 # in seconds - -# Added cath_fill for catheter fill duration -session_info['cath_fill'] = 3 # in seconds, modify as needed for the task - -# removed below for visual stim -# visual stimulus -# session_info["visual_stimulus"] = False -# session_info['gray_level'] = 40 # the pixel value from 0-255 for the screen between stimuli -# session_info['vis_gratings'] = ['/home/pi/first_grating.dat', -# '/home/pi/second_grating.dat'] -# session_info['vis_raws'] = [] - -# Task-related information -session_info['config'] = 'headfixed_self_admin' -session_info['treadmill_setup'] = {} -session_info['treadmill'] = True -if session_info['treadmill']: - session_info['treadmill_setup']['distance_initiation'] = 10 # cm - session_info['treadmill_setup']['distance_cue'] = 25 # cm -else: - session_info['treadmill_setup'] = None - -session_info['error_repeat'] = True -if session_info['error_repeat']: - session_info['error_max'] = 3 From 26afdc0d2faf6b400cdb5dc24c9542e4e066480a Mon Sep 17 00:00:00 2001 From: juliabenville Date: Mon, 11 Nov 2024 14:04:31 -0500 Subject: [PATCH 131/135] Delete run_julia_test_self_admin.py --- run_julia_test_self_admin.py | 134 ----------------------------------- 1 file changed, 134 deletions(-) delete mode 100644 run_julia_test_self_admin.py diff --git a/run_julia_test_self_admin.py b/run_julia_test_self_admin.py deleted file mode 100644 index 0a3afe9..0000000 --- a/run_julia_test_self_admin.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - - -#run_julia_task_self_admin.py - -#!/usr/bin/env -S ipython3 -i -# run_julia_task_self_admin.py -""" -author: Mitch Farrell -date: 2024-08-30 -name: run_julia_task_self_admin.py -""" -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# all modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # enabling debugger - from IPython import get_ipython - - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# import your task class here -from julia_test_self_admin import CocaineSelfAdminLeverTask - -try: - # load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - session_info_path = '/home/pi/experiment_info/julia_test_self_admin/session_info/' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # sends copy of log output to screen - ] - ) - - task = CocaineSelfAdminLeverTask(name="julia_test_self_admin", session_info=session_info) - - # start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - # loop over trials - # Set a timer - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - i = True - task.start_trial_logic() - while i: - if t_end < time.time(): - i = False - task.end_task() - print("Times up, finishing up") - while task.trial_running and t_end < time.time(): #trial running in both standby and reward_available - task.run() #breaks out of this while loop during transitions between blocks; this will permit checking the t_end clock in this loop - raise SystemExit - -# graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# exit because of error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # save dicts to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() From de8aff4a26e4bbcf33043ad015933f1bb3c1a6f1 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Mon, 11 Nov 2024 14:04:39 -0500 Subject: [PATCH 132/135] Delete julia_DCL_self_admin.py --- julia_DCL_self_admin.py | 171 ---------------------------------------- 1 file changed, 171 deletions(-) delete mode 100644 julia_DCL_self_admin.py diff --git a/julia_DCL_self_admin.py b/julia_DCL_self_admin.py deleted file mode 100644 index 3222b01..0000000 --- a/julia_DCL_self_admin.py +++ /dev/null @@ -1,171 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -""" -author: Julia Benville -date: 2024-08-05 -name: julia_DCL_self_admin.py (adapted from remi_self_admin_lever_task.py) -""" - -import importlib -from transitions import Machine, State -from transitions.extensions.states import add_state_features, Timeout -import pysistence -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib.pyplot as plt -import numpy as np -import behavbox - -# Configure logging -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) - -# Adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - -class CocaineSelfAdminLeverTask(object): - def __init__(self, **kwargs): - # Set name and session_info - if kwargs.get("name", None) is None: - self.name = "name" - print(Fore.RED + Style.BRIGHT + "Warning: no name supplied; using default 'name'" + Style.RESET_ALL) - else: - self.name = kwargs.get("name") - - if kwargs.get("session_info", None) is None: - print(Fore.RED + Style.BRIGHT + "Warning: no session_info supplied; using default session_info" + Style.RESET_ALL) - from fake_session_info import fake_session_info - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info") - - # Access mouse weight from session info - self.mouse_weight = self.session_info['weight'] # Read mouse weight from session_info - - # Define drug dosage parameters - self.dosage_mg_per_kg = 0.75 # 0.75 mg/kg dosage per infusion - self.infusion_rate_ul_per_sec = 6.25 # Infusion rate in µL/sec (converted from 375 µL/min) - self.solution_concentration_mg_per_ml = 1.8 # Concentration of cocaine solution in mg/mL - - # Calculate the required dosage for this mouse in mg per infusion - dosage_mg = self.dosage_mg_per_kg * self.mouse_weight # Amount of cocaine in mg needed per infusion - - # Calculate the required bolus volume in µL based on the solution concentration - self.bolus_volume_ul = (dosage_mg / self.solution_concentration_mg_per_ml) * 1000 # Convert from mL to µL - - # Calculate infusion time in seconds based on bolus volume and infusion rate - self.infusion_time_sec = self.bolus_volume_ul / self.infusion_rate_ul_per_sec - - # Print statements for debugging (optional) - print(f"Mouse weight: {self.mouse_weight} kg") - print(f"Dosage per infusion: {dosage_mg} mg") - print(f"Bolus volume: {self.bolus_volume_ul} µL") - print(f"Infusion time: {self.infusion_time_sec} seconds") - -# Now, you can use self.bolus_volume_ul and self.infusion_time_sec to control your infusion pump. - - # Define states and transitions - self.states = [ - State(name='standby', on_exit=["exit_standby"]), - State(name="reward_available", on_enter=["enter_reward_available"], on_exit=["exit_reward_available"]), - Timeout(name='timeout', on_enter=['enter_timeout'], on_exit=['exit_timeout'], timeout=20, on_timeout=['switch_to_reward_available']), - Timeout(name='cath_fill', on_enter=['enter_cath_fill'], on_exit=['exit_cath_fill'], timeout=self.session_info['cath_fill'], on_timeout=['switch_to_reward_available']) - ] - - self.states.append(State(name='session_end', on_enter=["enter_session_end"])) - - self.transitions = [ - ['start_trial_logic', 'standby', 'cath_fill'], - ['switch_to_reward_available', ['cath_fill', 'timeout'], 'reward_available'], - ['switch_to_timeout', 'reward_available', 'timeout'], - ['end_task', ['reward_available', 'timeout'], 'standby'], - ['end_session', 'reward_available', 'session_end'], - ] - - self.machine = TimedStateMachine(model=self, states=self.states, transitions=self.transitions, initial='standby') - - self.syringe_pump = PWMLED(17) - self.infusions = 0 - self.start_time = time.time() - - def calculate_infusion_duration(self): - # Calculate drug infusion duration based on bolus volume and infusion rate - dose_volume = self.bolus_volume_ul - infusion_duration = dose_volume / self.infusion_rate_ul_per_sec - return infusion_duration - - def reward(self): - # Infusion duration calculation - infusion_duration = self.calculate_infusion_duration() - - # Infuse drug for calculated duration - self.syringe_pump.blink(infusion_duration, 0.1, 1) - logging.info(f";{time.time()};[reward];syringe_pump_reward;{infusion_duration}") - - def fill_cath(self): - # Use 'cath_fill' value from session_info for the catheter fill duration - self.syringe_pump.blink(self.session_info['cath_fill'], 0.1, 1) - logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul") - - def run(self): - if self.state in ["standby", "timeout"]: - pass - elif self.state == 'reward_available': - if self.infusions >= 40 or (time.time() - self.start_time) >= 7200: - self.end_session() - return - self.infusions += 1 - threading.Timer(3, self.reward).start() # Start infusion 3 seconds after lever press - threading.Timer(3, self.switch_to_timeout).start() # Switch to timeout 3 seconds after lever press - - def enter_standby(self): - logging.info(";" + str(time.time()) + ";[transition];enter_standby;") - - def exit_standby(self): - logging.info(";" + str(time.time()) + ";[transition];exit_standby;") - self.fill_cath() - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;") - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;") - - def enter_timeout(self): - logging.info(";" + str(time.time()) + ";[transition];enter_timeout;") - - def exit_timeout(self): - logging.info(";" + str(time.time()) + ";[transition];exit_timeout;") - - def enter_cath_fill(self): - logging.info(";" + str(time.time()) + ";[transition];enter_cath_fill;") - - def exit_cath_fill(self): - logging.info(";" + str(time.time()) + ";[transition];exit_cath_fill;") - self.fill_cath() - - def enter_session_end(self): - logging.info(";" + str(time.time()) + ";[transition];enter_session_end;") - self.syringe_pump.off() - - def end_session(self): - self.state = "session_end" - logging.info("Session ended due to reaching infusion or time limit.") - - def end_task(self): - logging.info("Ending task...") From 0d04b68b48f0ad48ffcbb387902ca37072a7c814 Mon Sep 17 00:00:00 2001 From: juliabenville Date: Mon, 11 Nov 2024 14:04:48 -0500 Subject: [PATCH 133/135] Delete julia_test_self_admin.py --- julia_test_self_admin.py | 459 --------------------------------------- 1 file changed, 459 deletions(-) delete mode 100644 julia_test_self_admin.py diff --git a/julia_test_self_admin.py b/julia_test_self_admin.py deleted file mode 100644 index f72c8a9..0000000 --- a/julia_test_self_admin.py +++ /dev/null @@ -1,459 +0,0 @@ -# add in all the imports etc -# !/usr/bin/env python -# coding: utf-8 -# In[ ]: -# python3: JB_Cocaine_Cue_Learning.py -""" -author: Julia Benville -date: 2024-08-05 -name: JB_Cocaine_Cue_Learning.py (adapted from remi_self_admin_lever_task.py) -""" -import importlib -from transitions import Machine -from transitions import State -from transitions.extensions.states import add_state_features, Timeout -import pysistence, collections -from icecream import ic -import logging -import time -from datetime import datetime -import os -from gpiozero import PWMLED, LED, Button -from colorama import Fore, Style -import logging.config -from time import sleep -import random -import threading -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.figure as fg -import numpy as np - -# from IPython.display import display, HTML -# -# display(HTML("")) -logging.config.dictConfig( - { - "version": 1, - "disable_existing_loggers": True, - } -) -# all modules above this line will have logging disabled -import behavbox - - -# adding timing capability to the state machine -@add_state_features(Timeout) -class TimedStateMachine(Machine): - pass - - -class CocaineSelfAdminLeverTask(object): - # Define states. States where the animals is waited to make their decision - def __init__(self, **kwargs): # name and session_info should be provided as kwargs - # if no name or session, make fake ones (for testing purposes) - if kwargs.get("name", None) is None: - self.name = "name" - print( - Fore.RED - + Style.BRIGHT - + "Warning: no name supplied; making fake one" - + Style.RESET_ALL - ) - else: - self.name = kwargs.get("name", None) - if kwargs.get("session_info", None) is None: - print( - Fore.RED - + Style.BRIGHT - + "Warning: no session_info supplied; making fake one" - + Style.RESET_ALL - ) - from fake_session_info import fake_session_info - self.session_info = fake_session_info - else: - self.session_info = kwargs.get("session_info", None) - ic(self.session_info) - # initialize the state for DRUG CUE LEARNING ONLY, this is NEW with the cath filling problem edited - self.states = [ - State(name='standby', - on_exit=["exit_standby"]), - State(name="reward_available", - on_enter=["enter_reward_available"], - on_exit=["exit_reward_available"]), - Timeout(name='timeout', - on_enter=['enter_timeout'], - on_exit=['exit_timeout'], - timeout=self.session_info['timeout_time'], - on_timeout=['switch_to_reward_available']), - Timeout(name='cath_fill', - on_enter=['enter_cath_fill'], - on_exit=['exit_cath_fill'], - timeout=self.session_info['cath_fill'], - on_timeout=['switch_to_reward_available'])] - - #edited relevant to updates with syringe filling issue - - self.transitions = [ - ['start_trial_logic', 'standby', 'cath_fill'], # format: ['trigger', 'origin', 'destination'] - ['switch_to_reward_available', [‘cath_fill’, 'timeout'], 'reward_available'], - ['switch_to_timeout', 'reward_available', 'timeout'], - ['end_task', ['reward_available', 'timeout'], 'standby']] - - - self.machine = TimedStateMachine( - model=self, - states=self.states, - transitions=self.transitions, - initial='standby') - - # trial statistics - self.trial_running = False - self.innocent = True - self.trial_number = 0 - self.error_count = 0 - self.error_list = [] - self.error_repeat = False - self.entry_time = 0.0 - self.entry_interval = self.session_info[ - "entry_interval"] # update lever_press_interval to entry_interval--make this 3s instead of 1s - self.reward_time = 10 - self.reward_times_up = False - self.reward_pump1 = self.session_info["reward_pump1"] - self.reward_pump2 = self.session_info['reward_pump2'] - self.DCL_time = 0 # changed from two contexts to this? just drug cue learning - self.active_press = 0 - self.inactive_press = 0 - self.timeline_active_press = [] - self.active_press_count_list = [] - self.timeline_inactive_press = [] - self.inactive_press_count_list = [] - self.timeline_left_poke = [] - self.timeline_right_poke = [] - # initialize behavior box - self.box = behavbox.BehavBox(self.session_info) - self.pump = self.box.pump - self.syringe_pump = LED(17) - self.treadmill = self.box.treadmill - # for refining the lick detection REMOVING - self.reward_list = [] - self.left_poke_count_list = [] - self.right_poke_count_list = [] - # session_statistics - self.total_reward = 0 - - def reward(self): # prototype mouse weight equals 30 - infusion_duration = (self.session_info['weight'] / 30) #6.25 uL for a 30g mouse - self.syringe_pump.blink(2*infusion_duration, 0.1, 1) #2 second infusion duration for 6.25 ul (hence 2*) - self.reward_list.append(("syringe_pump_reward", 2*infusion_duration)) - logging.info(";" + str(time.time()) + ";[reward];syringe_pump_reward" + str(2*infusion_duration)) - - def fill_cath(self): - self.syringe_pump.blink(3.76, 0.1, 1) #3.125ul/second, calculated cath holds ~11.74ul; 3.76 seconds delivers ~12ul into cath; will need to update based on instech catheters - logging.info(";" + str(time.time()) + ";[reward];catheter_filled_with_~12ul;" + '3.76_second_infusion') - - def run(self): - if self.state == "standby" or self.state == 'timeout': - pass - elif self.state == 'reward_available': - if self.box.event_list: - self.event_name = self.box.event_list.popleft() - else: - self.event_name = '' - if self.event_name == 'right_entry': - self.reward() - self.switch_to_timeout() - self.box.check_keybd() - - def enter_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];enter_standby;") - self.trial_running = False - self.box.event_list.clear() - - def exit_standby(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;") - self.box.event_list.clear() - self.fill_cath() - - def enter_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];enter_reward_available;") - self.box.cueLED2.on() - self.box.event_list.clear() - self.trial_running = True - - def exit_reward_available(self): - logging.info(";" + str(time.time()) + ";[transition];exit_reward_available;") - self.box.cueLED2.off() - self.box.event_list.clear() - - def enter_timeout(self): - logging.info(";" + str(time.time()) + ";[transition];enter_timeout;") - self.trial_running = False - self.box.sound2.on() - self.box.event_list.clear() - - def exit_timeout(self): - logging.info(";" + str(time.time()) + ";[transition];exit_timeout;") - self.box.sound2.off() - self.box.event_list.clear() - - def enter_cath_fill(self): - # self.error_repeat = False - logging.info(";" + str(time.time()) + ";[transition];exit_standby;") - self.box.event_list.clear() - self.fill_cath() - - #duy_visualization code commented out below# - # # import packages for starting a new process and plotting trial progress in real time - # # RPi4 does not have a graphical interface, we use pygame with backends for plotting - # import matplotlib - # matplotlib.use("Agg") - # import matplotlib.backends.backend_agg as agg - # import matplotlib.pyplot as plt - # import pygame - # from pygame.locals import * - # import numpy as np - # from multiprocessing import Process, Value - # - # # all modules above this line will have logging disabled - # logging.config.dictConfig({ - # 'version': 1, - # 'disable_existing_loggers': True, - # }) - # - # if debug_enable: - # # enabling debugger - # from IPython import get_ipython - # ipython = get_ipython() - # ipython.magic("pdb on") - # ipython.magic("xmode Verbose") - # - # # import the go_nogo_task task class here - # from go_nogo_task_phase2_final import go_nogo_phase2 - # - # # define the plotting function here - # def plot_trial_progress(current_trial, trial_list, combine_trial_outcome, hit_count, miss_count, - # cr_count, fa_count, lick_times, vstimON_time, plot_dprime, dprimebinp): - # ######################################################################## - # # initialize the figure - # ######################################################################## - # fig = plt.figure(figsize=(14, 9)) - # ax1 = fig.add_subplot(231) # outcome - # ax2 = fig.add_subplot(212) # eventplot - # ax3 = fig.add_subplot(232) - # ax4 = fig.add_subplot(233) - # - # ######################################################################## - # # create an outcome plot - # ######################################################################## - # if current_trial < 14: - # textstr = '\n'.join(( - # f"trial {trial_list[0]} : {combine_trial_outcome[0]}", - # f"trial {trial_list[1]} : {combine_trial_outcome[1]}", - # f"trial {trial_list[2]} : {combine_trial_outcome[2]}", - # f"trial {trial_list[3]} : {combine_trial_outcome[3]}", - # f"trial {trial_list[4]} : {combine_trial_outcome[4]}", - # f"trial {trial_list[5]} : {combine_trial_outcome[5]}", - # f"trial {trial_list[6]} : {combine_trial_outcome[6]}", - # f"trial {trial_list[7]} : {combine_trial_outcome[7]}", - # f"trial {trial_list[8]} : {combine_trial_outcome[8]}", - # f"trial {trial_list[9]} : {combine_trial_outcome[9]}", - # f"trial {trial_list[10]} : {combine_trial_outcome[10]}", - # f"trial {trial_list[11]} : {combine_trial_outcome[11]}", - # f"trial {trial_list[12]} : {combine_trial_outcome[12]}", - # f"trial {trial_list[13]} : {combine_trial_outcome[13]}", - # f" ", - # f"percent hit : {round(((hit_count[current_trial] / (hit_count[current_trial] + miss_count[current_trial])) * 100), 1)}%", - # f" ")) - # - # elif current_trial >= 14: - # textstr = '\n'.join(( - # f"trial {trial_list[0 + (current_trial - 13)]} : {combine_trial_outcome[0 + (current_trial - 13)]}", - # f"trial {trial_list[1 + (current_trial - 13)]} : {combine_trial_outcome[1 + (current_trial - 13)]}", - # f"trial {trial_list[2 + (current_trial - 13)]} : {combine_trial_outcome[2 + (current_trial - 13)]}", - # f"trial {trial_list[3 + (current_trial - 13)]} : {combine_trial_outcome[3 + (current_trial - 13)]}", - # f"trial {trial_list[4 + (current_trial - 13)]} : {combine_trial_outcome[4 + (current_trial - 13)]}", - # f"trial {trial_list[5 + (current_trial - 13)]} : {combine_trial_outcome[5 + (current_trial - 13)]}", - # f"trial {trial_list[6 + (current_trial - 13)]} : {combine_trial_outcome[6 + (current_trial - 13)]}", - # f"trial {trial_list[7 + (current_trial - 13)]} : {combine_trial_outcome[7 + (current_trial - 13)]}", - # f"trial {trial_list[8 + (current_trial - 13)]} : {combine_trial_outcome[8 + (current_trial - 13)]}", - # f"trial {trial_list[9 + (current_trial - 13)]} : {combine_trial_outcome[9 + (current_trial - 13)]}", - # f"trial {trial_list[10 + (current_trial - 13)]} : {combine_trial_outcome[10 + (current_trial - 13)]}", - # f"trial {trial_list[11 + (current_trial - 13)]} : {combine_trial_outcome[11 + (current_trial - 13)]}", - # f"trial {trial_list[12 + (current_trial - 13)]} : {combine_trial_outcome[12 + (current_trial - 13)]}", - # f"trial {trial_list[13 + (current_trial - 13)]} : {combine_trial_outcome[13 + (current_trial - 13)]}", - # f" ", - # f"percent hit : {round(((hit_count[current_trial] / (hit_count[current_trial] + miss_count[current_trial])) * 100), 1)}%", - # f" ")) - # - # ax1.set_title('Trial Outcome', fontsize=11) - # ax1.text(0.05, 0.95, textstr, fontsize=11, verticalalignment='top') - # ax1.set_xticklabels([]) - # ax1.set_xticks([]) - # ax1.set_yticks([]) - # ax1.set_yticklabels([]) - # - # ######################################################################## - # # create eventplot (vertical) - # ######################################################################## - # # create a 2D array for eventplot - # events_to_plot = [lick_times, [reward_time]] - # if combine_trial_outcome[current_trial] == "FA !!!": - # plot_period = 7 # in seconds, how long to plot since the start of trial - # plot_bin_number = 800 - # else: - # plot_period = 7 - # plot_bin_number = 800 - # - # # create vstim time data - # vstim_duration = 3 # in seconds, pre-generated - # vstim_bins = plot_bin_number # number of bins - # time_vstim_on = vstimON_time - # time_vstim_index_on = int(round(time_vstim_on * vstim_bins / plot_period)) - # time_vstim_index_off = int(time_vstim_index_on + round(vstim_duration * (vstim_bins / plot_period))) - # vstim_plot_data_x = np.linspace(0, plot_period, num=vstim_bins) - # vstim_plot_data_y = np.zeros(vstim_bins) - 1 - # range_of_vstim_on = int(time_vstim_index_off - time_vstim_index_on) - # vstim_plot_data_y[time_vstim_index_on:time_vstim_index_off] = np.zeros(range_of_vstim_on) - 0.2 - # - # # set different colors for each set of positions - # colors1 = ['C{}'.format(c) for c in range(2)] - # # set different line properties for each set of positions - # lineoffsets1 = np.array([3, 2]) - # linelengths1 = [0.8, 0.8] - # ax2.eventplot(events_to_plot, colors=colors1, lineoffsets=lineoffsets1, linelengths=linelengths1) - # ax2.plot(vstim_plot_data_x, vstim_plot_data_y) - # ax2.set_xlim([-0.5, 7]) # 8s total to show (trial duration) - # ax2.set_xlabel('Time since trial start (s)', fontsize=9) - # ax2.set_yticks((-1, 2, 3)) - # ax2.set_yticklabels(('vstim', 'reward', 'lick')) - # - # ######################################################################## - # # create cumulative outcome plot - # ######################################################################## - # # Get data to plot for current trial - # outcome_xvalue = np.linspace(0, current_trial, num=current_trial + 1) - # outcome_hit_count_yvalue = hit_count[0:current_trial + 1] - # outcome_miss_count_yvalue = miss_count[0:current_trial + 1] - # outcome_cr_count_yvalue = cr_count[0:current_trial + 1] - # outcome_fa_count_yvalue = fa_count[0:current_trial + 1] - # - # # Plot - # ax3.plot(outcome_xvalue, outcome_hit_count_yvalue, 'r-') - # ax3.lines[-1].set_label('Hit') - # ax3.plot(outcome_xvalue, outcome_miss_count_yvalue, 'b-') - # ax3.lines[-1].set_label('Miss') - # ax3.plot(outcome_xvalue, outcome_cr_count_yvalue, 'c-') - # ax3.lines[-1].set_label('CR') - # ax3.plot(outcome_xvalue, outcome_fa_count_yvalue, 'm-') - # ax3.lines[-1].set_label('FA') - # - # ax3.set_title('Cummulative outcome', fontsize=11) - # ax3.set_xlim([0, current_trial + 1]) - # ax3.set_xlabel('Current trial', fontsize=9) - # ax3.set_ylabel('Number of trials', fontsize=9) - # ax3.legend() - # - # ######################################################################## - # # create the d' figure - # ######################################################################## - # - # if plot_dprime == True: - # ax4_x_values = np.linspace(0, current_trial, num=current_trial + 1) - # ax4_y_values = dprimebinp[0:current_trial + 1] - # ax4.plot(ax4_x_values, ax4_y_values, 'r-') - # ax4.set_title('D-prime', fontsize=11) - # ax4.set_xlim([0, current_trial + 1]) - # ax4.set_xlabel('Current trial', fontsize=9) - # - # ######################################################################## - # # draw on canvas to display via pygame - # ######################################################################## - # canvas = agg.FigureCanvasAgg(fig) - # canvas.draw() - # renderer = canvas.get_renderer() - # raw_data = renderer.tostring_rgb() - # pygame.init() - # window = pygame.display.set_mode((1400, 900), DOUBLEBUF) - # screen = pygame.display.get_surface() - # size = canvas.get_width_height() - # surf = pygame.image.fromstring(raw_data, size, "RGB") - # screen.blit(surf, (0, 0)) - # pygame.display.flip() - # plt.close(fig) - # time.sleep(3) # sleep for 3 seconds for pygame to remain displayed - # pygame.quit() - - def update_plot(self): - fig, axes = plt.subplots(1, 1, ) - axes.plot([1, 2], [1, 2], color='green', label='test') - self.box.check_plot(fig) - - def update_plot_error(self): - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - fig, ax = plt.subplots(1, 1, ) - ax.bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax = plt.gca() - ax.set_xticks(ticks, labels) - ax.set_xticklabels(labels=labels, rotation=70) - self.box.check_plot(fig) - - - def update_plot_choice(self, save_fig=False): - trajectory_active = self.left_poke_count_list - time_active = self.timeline_left_poke - trajectory_inactive = self.right_poke_count_list - time_inactive = self.timeline_right_poke - fig, ax = plt.subplots(1, 1, ) - print(type(fig)) - ax.plot(time_active, trajectory_active, color='b', marker="o", label='active_trajectory') - ax.plot(time_inactive, trajectory_inactive, color='r', marker="o", label='inactive_trajectory') - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_lever_choice_plot" + '.png') - self.box.check_plot(fig) - ## not sure if the above is right with the licks? - - - def integrate_plot(self, save_fig=False): - fig, ax = plt.subplots(2, 1) - trajectory_left = self.active_press - time_active_press = self.timeline_active_press - trajectory_right = self.right_poke_count_list - time_inactive_press = self.timeline_inactive_press - print(type(fig)) - ax[0].plot(time_active_press, trajectory_left, color='b', marker="o", label='left_lick_trajectory') - ax[0].plot(time_inactive_press, trajectory_right, color='r', marker="o", label='right_lick_trajectory') - error_event = self.error_list - labels, counts = np.unique(error_event, return_counts=True) - ticks = range(len(counts)) - ax[1].bar(ticks, counts, align='center', tick_label=labels) - # plt.xticks(ticks, labels) - # plt.title(session_name) - ax[1] = plt.gca() - ax[1].set_xticks(ticks, labels) - ax[1].set_xticklabels(labels=labels, rotation=70) - ######################################################################## - # methods to start and end the behavioral session - ######################################################################## - - def start_session(self): - ic("TODO: start video") - self.box.video_start() - - def end_session(self): - ic("TODO: stop video") - self.update_plot_choice(save_fig=True) - self.box.video_stop() - self.box.cueLED2.off() - ##also unsure if the things above are correct with the licks? - if save_fig: - plt.savefig(self.session_info['basedir'] + "/" + self.session_info['basename'] + "/" + self.session_info[ - 'basename'] + "_summery" + '.png') - self.box.check_plot(fig) From 38d5a2d980b20e663768b596df3bc9e375e3972b Mon Sep 17 00:00:00 2001 From: juliabenville Date: Mon, 11 Nov 2024 14:04:58 -0500 Subject: [PATCH 134/135] Delete run_julia_IVSA.py --- run_julia_IVSA.py | 135 ---------------------------------------------- 1 file changed, 135 deletions(-) delete mode 100644 run_julia_IVSA.py diff --git a/run_julia_IVSA.py b/run_julia_IVSA.py deleted file mode 100644 index a86681f..0000000 --- a/run_julia_IVSA.py +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -#run_julia_task_self_admin.py - -#!/usr/bin/env -S ipython3 -i -# run_julia_task_self_admin.py -""" -author: Julia Benville -date: 2024-09-26 -name: run_julia_task_self_admin.py -""" - -import random -from transitions import Machine -from transitions import State -from icecream import ic -import logging -from datetime import datetime -import os -import logging.config -import pysistence, collections -import socket -import importlib -import colorama -import warnings -import scipy.io, pickle -import pygame -from colorama import Fore, Style -import time -from time import sleep - -debug_enable = False - -# All modules above this line will have logging disabled -logging.config.dictConfig({ - 'version': 1, - 'disable_existing_loggers': True, -}) - -if debug_enable: - # Enabling debugger - from IPython import get_ipython - ipython = get_ipython() - ipython.magic("pdb on") - ipython.magic("xmode Verbose") - -# Import your task class here -from julia_DCL_self_admin import CocaineSelfAdminLeverTask - -try: - # Load in session_info file, check that dates are correct, put in automatic - # time and date stamps for when the experiment was run - - datestr = datetime.now().strftime("%Y-%m-%d") - timestr = datetime.now().strftime('%H%M%S') - full_module_name = 'session_info_' + datestr - import sys - - # Update file paths to match your setup - session_info_path = '/home/pi/experiment_info/julia_DCL_self_admin/session_info/' - sys.path.insert(0, session_info_path) - tempmod = importlib.import_module(full_module_name) - session_info = tempmod.session_info - mouse_info = tempmod.mouse_info - - session_info['date'] = datestr - session_info['time'] = timestr - session_info['datetime'] = session_info['date'] + '_' + session_info['time'] - session_info['basename'] = session_info['mouse_name'] + '_' + session_info['datetime'] - session_info['dir_name'] = session_info['basedir'] + "/" + session_info['basename'] - - if session_info['manual_date'] != session_info['date']: # Check if file is updated - print('wrong date!!') - raise RuntimeError('manual_date field in session_info file is not updated') - - # Make data directory and initialize logfile - os.makedirs(session_info['dir_name']) - os.chdir(session_info['dir_name']) - session_info['file_basename'] = session_info['dir_name'] + '/' + session_info['basename'] - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s.%(msecs)03d,[%(levelname)s],%(message)s", - datefmt=('%H:%M:%S'), - handlers=[ - logging.FileHandler(session_info['file_basename'] + '.log'), - logging.StreamHandler() # Sends copy of log output to screen - ] - ) - - # Initialize task - task = CocaineSelfAdminLeverTask(name="julia_DCL_self_admin", session_info=session_info) - - # Start session - task.start_session() - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - sleep(10) - - # Loop over trials - # Set a timer for the experiment duration - t_minute = int(input("Enter the time in minutes: ")) - t_end = time.time() + 60 * t_minute - - i = True - task.start_trial_logic() - while i: - if t_end < time.time(): - i = False - task.end_task() - print("Times up, finishing up") - while task.trial_running and t_end < time.time(): # Trial running in both standby and reward_available - task.run() # This breaks out of the loop during transitions between blocks - # and permits checking the t_end clock in this loop - raise SystemExit - -# Graceful exit -except (KeyboardInterrupt, SystemExit): - print(Fore.RED + Style.BRIGHT + 'Exiting now...' + Style.RESET_ALL) - ic('about to call end_session()') - task.end_session() - ic('just called end_session()') - # Save session information to disk - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - pygame.quit() - -# Exit due to error -except RuntimeError as ex: - print(Fore.RED + Style.BRIGHT + 'ERROR: Exiting now' + Style.RESET_ALL) - # Save session information to disk in case of an error - scipy.io.savemat(session_info['file_basename'] + '_session_info.mat', {'session_info': session_info}) - pickle.dump(session_info, open(session_info['file_basename'] + '_session_info.pkl', "wb")) - task.end_session() From b98cbb331c4d3d2e65a8daaff229587d57c35f0c Mon Sep 17 00:00:00 2001 From: Soyoun Kim Date: Tue, 24 Mar 2026 13:52:26 -0400 Subject: [PATCH 135/135] add sound files in the sound folder --- essential/sound/001-beep.wav | Bin 0 -> 126212 bytes essential/sound/002-buzz.wav | Bin 0 -> 1311208 bytes essential/sound/003-buzz.wav | Bin 0 -> 1311208 bytes .../sound/004-white-noise-44-1-16bit.wav | Bin 0 -> 5292044 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 essential/sound/001-beep.wav create mode 100644 essential/sound/002-buzz.wav create mode 100644 essential/sound/003-buzz.wav create mode 100644 essential/sound/004-white-noise-44-1-16bit.wav diff --git a/essential/sound/001-beep.wav b/essential/sound/001-beep.wav new file mode 100644 index 0000000000000000000000000000000000000000..495996427a7c6d4e747734836fab796c017ca28e GIT binary patch literal 126212 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 p-5&)OY{VV;{&zz$%t%< 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 z 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�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

  • oe?*0h7 zC)>i6@D=<4pF=aS-lFED4n7lpfzxwO5Bx29@I5!KW$x>v%)7b}ZUTEgRzf;E9n2%~ z?65wk7X1^P#tz^SfW#8$TAnp(7tg>5@JxIV6dLk#@^g&8UV*c6&dO1PwH7rGz6Sr^ zG4R)|;1|#<=xdn|C&9U}m!8xeU{A6$aP$}Gr+5>3fj$FcV}Jf4{UUl&KLxKJpWXAo zAC1A)%e{WqfclZOVB=bL9QFXUFK!>~Qt+Al zaLL2L4jS(RHH;ZxAE$n5^NNQ-&B6NXNz72Wi)je$v)gBX$$qho%+0dC?_A-Qv6eCO zH0PSU0Bhi7XabkR=J@7dF7jk%C3gVlSbByz=lGfEGttA5!+~GGnCsr~y@5BjB~zZ~ z)4zBo{aV&T)S1){|6%W!wO4h$6J<`6ajt~-k>}JsVBVsx@+zo{T@S6`uhPGQ8O2@k z2I}>?g1vicclx({9rO;I$6g-e3Ts$uN`sn)lO_`WIXW^}za@p5>3hcy&7H zU9$FOeAEKW$^B97X+9XcOaZ@7Ut8<%d%*L~@B2Qmer+!beC0CYsW{=H`&9qFnOdn4k zPd)_p`8oq-QsJb+@sNRk;q1iOi3?#{;kLkE>G`xgxjfhx_+s+KVDHIj<_c6zR}J=; zzrbFm%JkdqfIpx+ecIOMjxfhXuZyp<2bnb_4=Z0^>kvLmPD-DYe*M4MybaieUZto? zQEPl-Q|WEiRM@r^b8FIYwS@o)4=*-REJ@!}1Y$<`_$LfyY2?)V|kF zXb?T%O=u8m5Zc3Br`Gh~9?v}<#7*Diev=ysMM4!|QSPGLrEn+Q41TT}&|+q9tb}kV z95SZbN|#&T+`df1&d;5gGcji=Sm#s2?+5n6jsefE8DK8y`Q(RrwzUhjTAwiq<`7=M z{So_iw`cn2w*&U-DqtC^ki%)_;*OR}bg{uY-MC<`{hW!8`)B7qyMG&;YD!UP-@xO~?mpUdEH=uoLOE zGGD67JRfx->zaP=#x|ZQo?%(=4y=Xd@ELpSnz8%W&pR6)f_88hoCI6(dg`MxXS<1c zD-GCvZ7qCj;nuH#kk>C(EFyAa0zg{2Q_l@mFw77uis=kSkqJ&ssQ?TjE7zZXJ~po8v8ee5E!5M zd&Uw^fSR5fhu5{wJGP=|=Zn)!*j-t2fX5w^wnm;(A5(ir&w>AMDoa zobH^~pHwzgHnlFfF1Zt|*PR0YLJou2*1<%08H&GAB-`v#Un$D)o!KQrsXGkOvG zD*I9|=^XAH9u9Nh5SVuy$vqNi(Du=L2KZ~NzoFL560-@p9s7Da!zwrlmcUi8KYM>r zyT6M$bk^z2nT(y(q<@EX&<4s=rF#*U!KGjfbsl&wd5(0a_w`hE0PO~!bGN|>%xLCz z&x3_2pTF&(3RCMmmy%EdP2msFM|mLUK=ALFqDxNUnRd9yb5|;hX5^<+W+&_j%U>JI~8ESv|{t@NH52dTB)44=RO z@Xvis)vhncXYvGdn`hCB+$+*6vWJvQTyz6PJbZ*WSPQ|RbDIhZ5n!@%=RuYh@#EQTk+&$|jd^KOR0U?0~OmzvIUg;4wAec3PxctHFWLT*fysf%&56x)_1>0f1NXoPcp1Jf{JJm==ELf% z-@*#;yqd&p-pTBGLORauWUuAC%)HF`Md#C<*SF{$oM;`HO<-P5Yg!O{s-3EZK7r@h zdqqD}4LlNF8$PqujYk6|+CXPf(|;b!Va_UZR+*dWz56=zb!H7UT60vj0H4q14;7h} z=l!`IyjP8>THtlGAAcjvf)%hGjQPjHAuzUj5{#RE1akvprR6XV{s!YE<1U}`YFu(0 zI)K;N8g_+vR;6JM9EK6_4;VxJ1^)aGYIyfjbM(ypkQof$fI3sPoN7El?hd>O=99)h zGePgclQ0R4Z=MIe&fJP@-#oB0?46lHhL-RxpltG4c_KGqCAqaV?D&e?k&nrc=pL0`U^cZn)52T`Eew@omxBMtE74b?6Jir$uYol;cPl*$%fY#o`YGKhG(9>!sy5XP zJa?XCukZPw=l*oKm>oXGr+VIuPpxkprzYa-V?D&&;#n}Cu#WB5c{Av5XjR&Z&Y-J; z_+2gfZqTQw=jc^9AO2>xkNyn(ly8E0$9G^4&h6lJel1w<`JLX|B5*EKRpa3tRmEb#^6j#&%H;X3ycHLYhP#Y^ACW>eW3SP*HPn} zOn>?>>^~k;G^R*j%<1qZeO*^DUBFqERp7_M9}CCA+=96UkHQzQ7WP2-!t#Yf!LzAu zqHf|N*aSBxZ%$@W06Pl`;hM}f!Th};%pfiR`*`$`H7#ix^yDDH2fm6As9ER>RU0*D z?Fq&!UW?nH349a%CTdNjJs4EYrUT?$Sj9Y21Hr@0+cD?52#nW9p(&WddB4BL+}qE< zXN~o`AHcltPUr~Vfco+sa5{KitCtyH7*BoZLe%J%kK>f`)nZ;H6#DP31^=C2>9;pOwqB-w z@*}%V)KTqI*-8JsTEr>z;~M9vVf+At!2DzcJWC&NHJAbm;AFU@=#rv`=uq05-kUa_ ze!cMZLWe>>0(wzerCOy1v47d;qF(sNnaQ2W$>gYu7ln#K71)im94?Js8f^xT!+Eju zVi&>o=yp!0>Crq;$N2%TWhXchIuYszn{zh@yD>f?Kh*cXguc^vvfeRm&9d%hU$xJx zi@|5UaiRIB-|q}~7WA2_@!Sq=!CJs3yo&=t{bm$wqnF`gI0qU*OVDGgU&;HcGaSeq z$e4$Cb~OWQ;CchLz<$^Z%i$Z)o22%kmZwf`pX*nkrf1IgAXsO!SJdybL%2iuw$N?C zjD=BnBd&x!^jK|T*MuL#=`^Se=3;6Tqbp5BBH z!1w+RXaVMf)8TipUS|#0d|e&JdWf%={Wr#I#)`&;UYkCrjJfWFZlHJZQ0XDmfPYG_ zVpdGk|N0D&Z%+(nhH*1Ix|Q(gEln*=otr#2d93hQ;co@M75u=y?;cPewjbMm?0wh? z4;_E#_+HopWeds{ybgMox)gRPJOuU!AB1O;&jfuc$bRV+>}Z||uQ9jNJg+x?Gkq@u ziw72a4&Mn=!0#&zY7_QcsIM8%HOE(?hGs0K-eO*|7lxAKPJ|~w4cKS52fH;Fe@~Bq zzxM^ciZkI3(5rYo`##IDV`?t+%=FBh#s2o{^cEX4UWAAFGf*%16Rc4sK%bR=|0sAi z8E-rX&Mh(iuy@|t^K9_fY8C^S%&X37exM$tr=TequbFH4Yd=p9sa|A#-Dfk)+Zu=U zjYiY}yspgCJoo&wsbFuN=bo>H_t`t_=rOT59~LqD+t}E%&p5vosCi!kS+M%V>cG2V z3~s%1CVgXGt9o2~y^Z5NtGrHrqIXOGi@tIDz9xV^@m|m$yibjlDupWr`(^gyW+PhX?=q)Vtvs51PJ`$KL?P6=v2 zyPTR}ZL}`vpHVB(bMtPQcZ0cZ*Ra#gS*3akJ>O%X7TSlMRMyIk`K-VF3qFY6D1Ia8 zrQ40q{Ta9)iuf>|$_8U3y~YVx3D)CgfL^5<;LOq9;2C5N@iSDS|5@MtC1CtC9P~)( zvuO;JV2i`>GyT2lPo9hZeiyhG{5N-kxry=BF!0a(JkLG7=ne3dd8VF9uaj|}=fDAG zpxB$dE43?S4eTz^k9bY;n&i>c(bUE1i-Vpi=d&c?OXjA04+oe@v9M%e@cOi-cjZa& z8FxR-gI*_k1)eCZ&q0h@zD)T*GwsWs;DcojmhpY~8m#&F<1SE(TF9K|W%T6f-!h(T zoN1itknWHkL9KFCVpXCCG=$#@e=FPv`o-!o>H8YcFQERm1GXf$B)7qa)CR}w24~TT z^oXEu?p<8^M?hb~8O3J=eL=;1d{Od6Neg;Oz3w9?B0>DGu3^vCOt5BRt_=z;TiMUznWJv1rq={6 z24k-p%m%kMU6fT6Q&KrgRn^KH-_PKUF>^XXG) zji*^%pg#EXy-aejW~!Hp&^6GTtTTNNY9+73eJ~OH{gp5umckCu-*Oumd+lL{#EQ}t zrRI0WMmIrou!d*dPM^>y{P8X6x7HV#6VAaI-ZZQ(_!2WD55n7Y=RC`1h(~iDrK0y` z?rWjfLY2dn!>_}1cn`KiJ~V+Fp%xfZpN7w}BHRzJF?Zl8XbV&5Tlp9s0=2ynpr^w8 z_%!hSSp<3TR++Z~|JbE?#q96$8a2*62h@*@v5a|*Y1Ll*(Ky!{(;zU*T%cYib?A*w(oCEoRLb*N%X#P@6t%pB={6uhQqQhs@VLOrP3I zU|mViqkeyNkzd#u>`vKM;8KlOnRhscy)~D^N9`HXRi+Yde&on##>if`5)#E z2jG5q9qNMl*a-0FPl3-yV*&koUQ@>Y6Y*r~O;KAK0+pD}L3>W%88fC(!)pmkUrnW#B9Q5J(?9|6L2=0I`%x^G`Fn>1BvM#7@=X3W}@LoED z`KIQM*4eBtcwcRYuFMFuPCpvT6ZE_EBv+p*bWiNZH!FQ9Iu?sYqS4hP|7 z@SN0>pjW}~)BE*Pm;qi_YVOz#bFPLbz}Mvf`{(s0STA^ve(q<%vvnP)!5CXw$1evJ zKs|3V+{|pfXd}6m#Yt*;E%F@lzkQch95zb=IXrF zc?+OC{2BW*_7504jf(z1izADJ{acOMzEd4OXU6Wq+=GFB*d(_}ZXf(j8<-hrOlzI< zeY{PSB!hdMtY|1$19*eJPp2| zx6(tP2mE2s1N9@QEtub)&92%y)B@+T+jd}jVEW3;mBIYAsYO$ZMlg5Ye772Y+%@1C z>N%+gxHCJmK7!?7++pmxAAEj)M(wvNz6^a?JBxM(Gtke=oR_iZ?a$Posl~~~$pNVW zsmGI#Cr^iFsb;CU$+^j4|8X#RFd0t$KeJM^QXj(vcJa<+%fj77cL%de@?Y*)-V6I`#aVh;3gR=(*K5KIwJxoR5{ahWc1-0Ts;8{|a**@oh zb@|nBI=bgG;Q2ofnueMNd!MZDb$~OOZ|k28X1?~eylr{q`Dj(HRk^#$-c@#G{>uEz zpkZFaJZtOj{&t7=W$bZR$JofOsdjLE`1){vX1?A9H-etN8{txT6&B|#4zzFUpzFc& zMiET!N^AI;S=z=~#(Vu?7JLlWT8*)ipjYdetY-q9-aPL%s0Cg>zrzIPJhz2`@ErJl zs-Jj<8y^`PbpfAEg<#(2YwLS&E!=wVkpHMjO=(G)B|Mc51-%AECyIjSo6o)_^e6JfJi0lyId*USUN$-P(efDo6IdUa|7G5ndCok-L{1ZUDhHXnZrYBJVe zobC7cf4=;a@Z(T#ayv$GD2B37{9;avEDx#fR=*KZfF{^E7)GvFuCgJS*dJuqi8 z4yX>+8-IjT;WB1Cq)XBzw-nz}Z10Y>-i4`!DQj%QVNPOB;zn3jxU8@RRDuRz;p^ta z&B1Qty@|bva>;UR8hbw3J=Hxm9`?h+^ul1)&5F#5%y9PJs4qPSYJ)w2%PHsqQoB&E zSI6}_eh2!N=^OYb%v-!qjqm)LUjw}oYT1{;L9kY3Ez6j}TuUv%x?3B3-k+dpPvG^LkqYIt^wwWkO%q2eu z|9{UX&pUktUU1ez+ru*ONAK?>7}uL4diH$@?ZNxj+IbQ+;WBi6ukmZZXRzndNbvd7 zAJjm7uYE1lTdm)C9~<-E!;Z~P_{zGlCv;zAU*u@nqh)(m?pgT-m;^6Zdb!f`a2@Qg zu)o6Na8db-f*l6S%Puc_F>KA>nr{MTUtJ}zKeqyW9QioXKioh3Z|L99a@di(BezAU zMQ94WkLR+3VKVb_yvB}|ITrMgtB;@cA73*U#{0yc)F_xknXjs;cz&2iS@Z7+=C^9Y zYNz@iJHor{w0Rz`Wv5#s$OH3)Gr*Wio!RGhYZw6&VHy~RCBXQ>*y&l&U$B>Xkj7W5 z!Sl_Z`}^kDO~5nBnBMEr_|E5qdhHN6fF7-e>+hSJc$OI>slOUyy#p68yUAzGS?nS3 zEc5*JtgFt8@~j=JL#JP%m?ig4(nBzW=^4YXOumEnoUIb3?6_7?aIQ%?oByew6$usb`>GvR<-X zqFtgRWS|jDgm^NJBYYAaDBF{t!HcOEnI88?YH)gRdL(m-ABOkfo&RRXQ9dmiPmkgQ z)O7ymLsL`rn$;)n*E5G1_hX?Vb14UaXVV5yBU7Mk0(XKs!4`<;#)Ejp+^jL|rFO5s z@d5DK^T$J=e)J01KXoU(3pJn}`1|w0I4r?D|LyE6sm-pFp0S=WcXqI{v+S0gA~IisT{yAj@tyhkOeLZoK6X828}nyi2qp*lQGmFQT`u^{gT7y;>^Hd_{P_wn7PaP8 z$UZuA{@=+_eAACW3-*23*K{tt32%U}z5c<&>_Ao@*-*M6ct+of56>8B2Gj>*AD{hu zLH(mXcz@Q0;b7lm9q0(&uTd}`vA@MSP7J@X=aRXM-f-)adbJ*B?@gU>o$xJ@Tj+fI zHBu#3CAJ?r$2-R#hB@GF-kI^4fd{;1ye8XOs>BnqMC_FKDRDgp8mgV~)C)h*P0%$A zp{}9*?9K66;%l!)Hi`a@o9Hn%LA5?^&R&OpWzQ1pAb!p3=oziTY*p_^HL(Qz0RDaN zeKjV(*G}*!eoE__Gr;(0EqH$Eh4~b|0DqhXYQ*{yJeT``I-IqZGr`y14|_`N|2OY4 zkMxZ2{`WQa_b5RIv8c6I-@kdFwq@*UzVrvcex5+%sXGaFA;B|i*FO=eBBzRw$B5f~e82J`qEU=*lhpAVnH8Q^_%D0(RRQtYLmCgJ?Pb6^vFLyN+Tf<5g^ zLQ6vGgSSF&n1g?2Fsy^W;0(Bl-mD#B%X~!5L9E*njzL!M8!LkF~jeiGB%t=gPw(q~Cg7J2o-iX!ou^Ky>M?MYek9sGJoy__C(LNacM`}r)llmysEYAdcP0B&) zMC!yy`Zc{zE&=Os<~imTdRRQ?jG_FP2vymm@+ltDMtGXO4}Bl16sZ*K_Gm3{GAndRy3YkS7BX+ zedYI+f4$u6#BcX0(jm&gm?QUr~wbcdibvRyI@9@_ts)) zMIWs`q-rJA*n-a4n!Eaan;V}- zZ?m!QUT91e(>z}9xbLlT%{gVx3H0s1@XOU>PW1xz%De*V32Nq#u$yW&m;*Hh{j1iv zLtwtAp6M(CpHb&Ci+nou!)nQD$!5oz9ou(g-;t#-7N)~JNAEd066V0nV>6GnJl^v7 z4Fxw8oK|?6Yn$1U**fqtB@@X+zhpnQBTNr`TMg3<)8D~HW`4f~ZJ1H-domB+EqOQS z-!aGW`Ee?K)E?B6r-NU=_l+7dM`YIhIB`FOHu$%P!woPMCV_cX6ST~MV2$|(_#DQ9 zF_ZC+d78g>J~MV!!)Q1e?9Vkv{*rlZ{+V&T@%?eIR(A?i1?xoCb&Rvj>6$Q)Yy)0g zy_VmB9(Cg}XQJ$aiqJIDG}0iyLH_k+uP@snze9eHydHTQ;v3=vV*`2mR|)3DZ3=G+ zH>U@FRCrXlZK!R?uhH}HJg{cuzhe&C3kGHn40Z$C=X)WH1@$O>l-4ZEgJ*@cw$Y#- zt)A$gz0BMJYi~7}NAcHxb9g_eAIs;b&(j~kv%*-vC+HVYBk?Tk4tkXJ601jez4%^L z1E1?FsT--w&H`S};5ltvZ$M@Y@B(xJ-{(b8mwr5JQ3se6sBY{te-=HG)-^A{H@}ho zxuxNy;c@KyzCL<=bQhc)KRM{-RVVKs?;pPsj=_!K4vC)ep7CC>Ua_k|O{8(Oar8js z08=rS_^1dp@XMH|e{tyIVBU?-r7`6A=KN=Z`Mh(x|%ua%?%;(l? zuoLts6@W3C{>ZmsIv$~>;QTWC4;5p}OX5ZVX^!=!1t7r8F{bp)Z#--{7=YsFa zci`EnM`I^DF7y-iVE5i>Q@X z18nzY^p^PdYT`LD9=B$25Y#}e-T6HHg?h5rrSGxzOrL#fn(8VGqYI;?IPvDO=CK9Q z1<^ui0eaG|fac-m;pw62p=3@n=W9F!AJLEJ8GQr$Qsc~6f191hr>0I#-IKg0`BLJg z1nEGb`&wQqd@0!5)UB{vFgv_YVV}Y)Um@J3VEp)_K^<35ku_Zdcs&tS zv#SOkX*K36>F?c4KSwcKO`WPXj0ANleRr?JsqiGsgu7ra*w13TrJk+kw1`;+#y!@; z#t9{)bGm+i&H6R?+WdOjLJRQu{2BZM#(vAe zbEq>|$4gN!JDWLqevcvQvc5i7r>|z~^ylfZ^f>l|VeA(w1oM!)=&v#$_qz0&RLjxl zX77W#T@k3Ah#HaiVk6j3-P0J!y7CnIE!B!Y1~u>*@D-?utpn@Cel1?B#`|hY<{;K- z)KPu*8t>X4p%1(hTn!EA*);AmhFS>b5mUgg%X83N(LCO>&zg;K{i*Z`4G9kkUl6?@ z+BMcSc2WEyI(a9@Kgs(f?+xa!vywh>o*Ti0r zz8>uk7s1x>)^Mk2r|9Cci_50UrOMq`_P(;K@>k`*n)hm6CYFgg!}?e9$jRZ!;R&G$ zK@BB{r@5XMWG~2m0-xM(Wqu3lN)It}&v`}a#y5gFoSJn@(2wdlV*L9N=uv$D)QvoI zj)Ae(GoWAb^Z#}xO)H*OtdGfl!X4}si2paQps={Gco4qUW?-M!21vmO=mW3)hZ@$E zP!pVYFdU4_P65x_i%KslT|#f(napccmsbPb#f}N%ueRt@-h=Ax=Ail?X}<_|Q4agh zpKGpZ?r5y!`{gsr8mzIExuVyFe(4Xv^G(zayk^$JQMiJhW%EI`i0rKFEbF}H0K-5X z(`%3vyNvqhbWn?MhC+FEc}&kt5B98|n>si3HaiT=<31?(pkVgV*+(ZIoP2O3v_I7T z&{Al6r0J1`aFmZ7$95d+fj@H}JH(xtGAc1D@mTV)Wb;(>R5%@GQt9&aJ(+uWx(v;% zD_U3deew6jJ?W#G%k)Lhd7s(lab@`M4EFq0k8Q-P-Fsjab34sVUWDH88l=JVV;0N< ztzixrD@7oYn+R%so=r7EHA2&w!>cC#AsF8v zzlY41t^d6aJzzGdxBGYO@iR|Uuc`v(l*T~jiuwcYrq{%CaW^<)e{KHSd`)zBLY;V> zc>h@cSnFu(=--jQBQL?3kR8qr8>fwd@i-hF1Y^l^P=~#E)}`Kt+rcy1JZufK1Uf(dmh!}rH`>YM5d>eRl!Q$Zirx&Q4DH#f8Iq8mH_ z)8S4~H&?^pNYm6`c96QIbP-zW`C=tT01poY7FX*7e_CSHqL9D_hanGSdU1L$feZ4?Xmb1 zubtPG58MUp*Lx@ZPP#HoOHNB3O&m>BPgYOr_jYf}*u>bt*EF3y12n?rS$wDiA7O9kb#&I*bFv-O(LBRWg16yoxC%BxcPIxR!4gn^Q^&duthps&9+*Sb zVAsjR>^?BwnF#7K*5vkq{viLJG0t)tat+%ygj-|CXJ(9iQeen0+ z0%Jk-BWq%J!)2hp=KHB8ZhwohqFRw&HZ`5vV4UrH{~*0zYS;Sm)G%tXdvsZHS+ZZM zU+OhDoIaeM!d{`{aBlIr#U0>DxSLnpSnFiwg{4c3V`WcLmteMr1)Q=Rw z_tEd8&Ew7E#y>xSv*OOnKaWZ3bMk9Iue@G)v*WYlA454Xmvb-OqY(HGBAX-6!!&lM zEMrd9&9F9iZEg`%g_rS#oetJCH-dVX{YrZ6eO4O>8K)b!duFNul#7;&`t_-Y{mZ;m z^ZbI`g4`TFhGq}VPM1js_iICZnEEO-Ja~TT6KD_mj`S#*uWc{hUW_HZIZq8jz!k@{9ACB+$M1IWXTbXEaZ|u;jv$ zW9+k73Vx_lJ;8n|{os4xI_9PL-h2M3U-{fIo-@8PezGoM+@}8Z3bVGVQ@{9yezyM+ zDUAfZP*a(o_9nazda8_@)a^%udB1Vwc<`D~!&lD=;ttL-|J+!_YsQPvd{H6iO*+?( zuwSo;V%hKM-_!L{^^`VKy%W6?4GSBxap04}sRdIDTEaQtK3@A$>Z_gJ7Jb|Myccj#1aS7Rtc_Fc$d;)Qlbh^{c(q_jW=*xDV7x^%-0Y#$-2xH9TXb ztKda2m-Ec)pVL3^H*RBJfoI_qFo!f}vk zf=9$yw_dnjcvyTG(|E_ln}I#_kHGZE^vE6IJHj7_J`VhZGjeC-TCY69F5=(ur2Yge z!E<{%Jb>S9tHHd(T1N$TIn8Hhqxq>Zh&~r*FFemYhbqk8RwEh%mqah& zwD~D|RqU$RUC;@vy*Yok8d!gGUx9JeQ%u;c2`j@Z!)3v`=<9G6SeNy^o}4o|M~|G( z;w#~NeD?a1)eF9$u6;UMo$*l{u;<>_KyA!Ei+-TiV{WF_{UVr?&1UYT_qly3-!k*C zesTR^Hm)(0XU7UKH+bj2y0q8&U9gJ1oEzwss8d*{@U`Qw9j{wZx8Tt6L&v8UPW9Ff z=9-L4j!WJIWz%KTl{1wy#p&Yo?#yn-5oMYbH3@oNLI|U;z&Pj&=aig7x8sjNPpUtz zf$zZjqA{)YB|QO8ls*ycihBy}qz&{2b2#IzmruMLJa2a6ff_}<+}dpp=qE2OEiSFh zPAKE6YrtpH3(%-cqo8)@xvVCjwrQ=y>r3C-251Jx@7CS@9Pep0=4W6F7$<#5FW^03 z+*JoX+oqGMPo8!GV{{&(*LCXN&TAmHJCBr9B>Z=V^gnD(xj4F@Idhc z#fO;j?AiSw^Dc5=DzhmcgyZSsY}o!gO}Jdt6y9g9iVv z2U!4BlU0*@U>7`+dL*?H2E#ID$32&MF4#@2PPiP5rAHT!4t%uV6n_)+9NNpPZs<8> zd|-}YADGYH-7pJ}j_JL!#(kP z;;(_TF3sde?vdz{zUb*TJTI# zXMCMLf(JnV*Lr4ss@>iX*TDk%UiDR|`Fc-#e?CdQ-}us8R$a!NRGmm~_e;!`+(OOa zSnjdhfuVt+`e04t3ufH>MgM}=g7K~%FzKIcSjo!bm27Eg6U0aF&`;M3 z=D>S!EAwosz)^bbeQv0^Ukk=weqY|3|Lf)J%RZLnpzl16MsoCmYObN@1YV#d^JlE(e^3g~GZ3Z3BxF#c4JGtNJaxl`j( z<5Kp*jZTbCcrLwB@J7LR$Gq|RZ7fW0U0GwpUQd-x2H zt^2E4k7j1Z7w`*o0(Eoi{~mPe+iKqaz8a6uUw`ipW|s^DbA#_;2>hY{j z?6ZjehcS39u#S8?s0lp+Tk!_!CG^*Cm%JV9F&{?%h1ce%u$A4^v)~i>7<`sB0I#ny z`0cE<=s)y+nFNn8kC*Va%%53*W*ufu%s-)jLe}ADa62;17C!`2pxvM!0*@h*!srBP#f;RGxH|iFzeXr0zSt*kMzQN zHtBz`pTqk`|AujfwXmaTWuxFO@IFnltHJN%B0NyWP{uKDfS$ntFcmHXV;VK2kHDIr zzxHgl4%8mZ!!{OeEV{4wzM%hhDNd5l;B%(y)(6d06$>gB`~gd$Q(>oI-Ylz-l66vb zQYXPH=~t9{(wAl~4d(8TVb+1q9%Ht%iq9hQm`Qf>UGe$U<<0es|2$vz;@zykJkEh& z&F)L^MkjpZF56wI9~g%b-V7St-NRd^}PFPL9oZBC!KJ0k4wJqJ3bI;MIcnz$He*yZH^?s?Vy#d}+)|YlLcgGlJ0;mJ&kFUrK zNcHlX&<^Ygwy(`I!gE7S$ZONS|3Be+=miEDx5CHJ44#5na15-?89Tke41xQ=ny7k~ zc~g}A2=!qA{?JXJ&qyzXahG#c%*)iL_u>uuUp!|%XHS6V%=OH3Q*+XHeIa<(_?+DZ z#!TKrW1&AdQ^1}HXf-3BORvD!U=5`Y`tsrO;q8&_kyE0lMBN$g>`MIs8dd%Q zeFOR}?OE9cYh!C;UqKfzX8JVxX;53cof!q^gwF||3MWHf<`oWtJm|x$xX#QVw02_L zq$k7oN6kt7&;0UR`c%BfE&w&(x?mmBGfH2(x{8{<9!Wjn#tnX7>)|p`zfqt07>qfL zCDeQ7f@d44S+RafV>llSr?BS*>tOB?=I~mt{Tcd!dhn;PmYzfFT-NQaW%{h}9Qm5v zl*VwzCDs;(Q;U0q*-h8LCU_qHfL3^@%%!hpHoGyZXX!o&m4t#k-5e+zdcgqj^CyFG zPeuCk%=^@Ot$ln8-JmR}1)B@L2R)z;828xU*A8BS&q2Mh1Wn1@P>s^-@h(ua)az+| z&p5Ioc)bPtb?B9AlWvnXKC&m*nF5pGV>lnmfpgQ_7Pc*{0w))oT;Q&O{ct~2N>oDq z9-DB$<0C*jQ?g5{OX{ZdO+jqbnAru(!5sM(_PlR^#>{M}%RZ+e;P>y>zXq%a+4E=3 z$TRmo_!Z1YTfr4zj(Zk6Nxc`ULG?^^CT9Mexf)+cLuRyxN<+B$y9RO9G-iRABY8e} zE>>gzn>G3>Fc)URXK5yQ-y7`jT?19wHPjINd-cF` z@l5y*-;J@&p{zrJUTgko-gz-I4nDv)X{_jZ_%}Whb@W%@7Vs=v57X$&tqX5all6>i zgXhT_zI`X&zs6TD!q&*v$VqSpyU#yihgCMzqc7Navp>Cl`Y}CAd`|f9dIr{^U#}jX z=vVLoc@0|2Gv4si|9Y_StwnKH2N2p-v4=4P6qsB=B51 z8=^+6MyvojK>2w2_=m9%W2e9fcsKek6@KgLD zX!lI_%&qV^dpV=U(O^D`XO-WVx#=_X0DA7VhCN_>@iVBQs59vk_xZL2{sm*9E5TUE zbG<(J^Z8&Lew5ik$Djf8{a*lUJ{3XTcpTWDXuPr-yx_dvtwp3tQ>EFU@2gHxouZ-X zp=o_&*Cnq@4onP8IJ4vl4c~`S`yp7FP^jTYIs6j(C0kPM^_Qy!=lwpQ1^$36;W&qu)io3+m6~n`cM?DC}y~f4!;7`zi;<=$-b%;LQufcky=X^ErdQk_rMn4X`Cj33)=<~r} zd!Nn#^(mimrJz3C7>}OumDi)%=yousZwA(Y>21H68Kdfn3zG|z+Y;Ln_BM5c z2htCux2CqHI?)sG6GSu7%($X)!SkvKJzt;Uaraz)FZ5n$1M|D@kKP~ElXph^jQB>l zIq&AYzWIIgZ-m-V51PV+ya{>##{Z2s$ZL={JU%==CpITIXU}8KTuXLD?TqZC`}g-q zS5S9q3v)wrLz~!9sORG+_7_H=CwM(r$GshD!?)}V+W>cg9%r9-JJ|>6MOGD_r6z9; z!MxAhXDZAGYo&L9{)xk&7sFU_BzPtd1@pt@@G%%GWKo+^^EK!7^{5WtGKav|_C@AG zUm5v-^jkd_dMY?=at{9v3mxL-K|gRN3nkVJ@X0l zsTkiI+b_k3py$BrZZ|x}oW>DgysBoaE~A#J=T6 z>e`g&jq^@s;?uYVG6k7}#)XXwuZAq}_nc8U1L`E|BTeb%MJ=kD&Vp{hoX#e*$`%^_S>#x|3OyLqQ$JoT@J5fO^um zFb0g#Z>7(yEFQo|nF;rO=KIV)>}EWv_#`6fba8!py*`ER)U)@28oFnD3XkI;=GNW| zUqi>7j)C|5JUrTUpj%Ei+^NZ&F6=m1^xw`X&%~R+^U->qG5H^$M^itOG1;eJuh2!{ z=S3(&dG_gV_YD0S{sMgmo_pPyOWqak0ewE6Q=hI<;gI zxRHz!R8txS8#PqH{p>4U_azCce@?NM6J}(}D*XR-N0cs8%z;j*A?j|tDFyHWe zIZB_6HE^Gy4?zhZ4^rW332&pdna9{OqJI1os70yAS=ZZEvaRG?u&?B7urB!qbcGLK zGuU@$yuZCO=85X!ufqW_XY}XgO3MXjp68wMsAu4>csz~k27_PU zA~5za=hUnAGW|7vT^F*qQ=fn_SiN+;w7$hXFeo`Fd4KBu)KKD+cqX3t1g6s~ashq@ z^+Mx8zc>95_5_%lJpnzyGsowZuiZ&tuJb&c0iKV(uEtEp-D<(+EH&Xe=nDETj1Ro{ zHZcpx`(OgQ(R@Bz7t*()7j$y*{VnrgH z3NLnhryg~KxP0P!dGT`!LFiRMYW4-6UiP6W*w_d9#Ylmxx-^hC-Z%Y1@U}pW~yvc#b<+k{3@h-3?wkGyc^rdKf zxB}06O?aQli@QR*LI=U;%``X@=CD8Rve0F?Dr5R$D z4c=iN)GzE{^8VWm##ugVUxAOPEpZ8CpPh4dj?cXS3(Z{owaxZ?CbF z=g0xDuUDOGC$j-Ok33tRf!pv|J&EVWpPQqqC+Vj&r@9nh&~fzfonQ?}Jy9Lk*U~;* z^J43@kAZsQ+0Yn9f!ENrFai8~>cEBQjq01CCQt|bcTNSLvHA;qUcLcp2 z&$lP_El`&*zt(rz2YfDj4_S*dNB3Iw``72F-$jjQ6m?CX3;I2lLI-BbZUN7m!Qk0* zTlBW*JkZm_6~1^ZMYr4c3^RpZnO1-gy@uG)^? zWOXhiz|uy{L0Ce6usYbo^d1{m=QBK}ceHnOa%3`2tonhs#9YH1;|%cm*Z|CJKPFDM zrtC9LjniCxEZhag%WB$f*uC^2-tK3>_{g}*|IZISDA&Vnpx*rxyTZ)*{QMulJb4Ao zhG#)vrCO`ks5N!{VCHwm?9NoxSJjL;n}28i&WufuO;2L4fctj!OX^j+4(7owP*bW5 ziwYJMbcWqvjO5I4HSepESFw3~bn;szR@!cb|{n6G0mn9ct<^P=@Znq$3`^HNR)Ft1V* z@(h^{OW`fh$e;&%89P%JfgYy*_>ES9*XeU;KegZvYBjz;USD_NIqA&|R5bu~L^Tuj zy)pEedEa%Xp5Kn1T>JlhFSkR7><-!IKn5P9e%B0);nu;`)cK5oPG{F$9?YSSh6>`O{cSeg#B<6d+)Mg8g<2GuoezNC3>0Pqc8XyFs}2HoSXL;Sl_d@^*7u?x1D*& zE<6wFYn#CMadny1K|XITcP9O~el!8=elOs^FkjSX(hK|^*W#oP3!k07HiyCIv)Z|O#9Vx$w})>JKNWo{Iw&$I@^$#@u+N2E^ch|hx+s(t$%>4H zR?Jx(9~&R55w8(H3XSp_fqUjeo72H;`7mmN>9MqiD7fY-Y{>`}LF@G|_uytRDx zH5tFFBQ*kJo0*`Vq|T$JlqyaI`sN7cmsEs1;50Y`MuHdp9GC@a&iW_x2DAbFGS=$! zUhW4qsa&+^GT{Gd9CZbFMs)^#80RxT&N`aD4CAOj*^y@c?AKL=a1Y#V>Dz)` zBo&G(;5vG`NPof(&QlZiYJrck@QLY(X-(?JN1eg=$e9C!K|jFrFa#`ub%Yz>V<^k+r`B*u`jT|5 zOf9y=HOP#DvzWDQ9ke?0w$<^HP???K`t6M?^(=Tj+|HgnpZnQa*@4HX7CVf*?|Osh z(4Exet&bUpgmc2dtfXG_zRrU0;1bXm>G{x35mc=$jH$~r#yc-!59u&R>rqfe67XF07+``-tAD6Myw=&!V^O?lkg1$QS z;m4V+;s58?Y5mTaNzJ%Nc8@@#@Vxo~)!KaeCD;LKOf{IVTar~0XoALpec^J*z%lS_ zHrFtAy6Hd4qaTI9xX2uQ2AGFClc9We`Rv8aBUfjfLJi#f%k!rjb=SsVJnhe|>6uS? z?z|7iPd!0l^(fo|#yr;T-ljJ95%_ca6~t$W*Q~WQ^Whu79DE`S12vW*a1bA{eOj&H zF=jQY5!>HlZqux^89zIv^sC~pf;zUkiuZ@Qmi0+<+vaTiz9xK4xNEelp?P#MJPYo< z{674BSnbgB_ye%8w4R=mq0E$+42!|tHl9hwxSzsNxG;2K=uLJCcBWr@I(3cC@D?1; zJ|5I!J=g2d?}Pjj3HCwwckPMxd_0-GF4pm%gqmP}=<~BV7{6Xj zKcaEd$J7D!$^Hz!FWX=Z+(b?3A~4oEpLq%9rh13km1!63ob1CS;kE4O{EEJwFQIC* zYIJ#cd6*C_G!ACv&dQy}{8VSeT?y8Y^x>JS8^b4Up91h;&=0EzRjXSJ)&4EEVgMv7!FuO4Of}9JOZkxxp-25Elms@gf3Hs}dsrJEN zXxgorH~B4irac7KZMQ&U_L4I)IrtnuZ!y#d|8HME{Vpxpl~IGewr6F|3g%GVM2~^~ zl%F8UJVKv8=BU4e{*AX`9Vl{oPSt{mU_Y<%q5e+uI&}}98=rwX5tgwapVgb-GsSqx zT+jSN{anrc-v9g)=7OH-YH)XfF_Y(&`I51d|F8AD9r!G|XLZk7MZdWBopJVi?6~~j zwbTi3lktQxQvrC6eF18z{@QwtdEK3G0a%yo4xU@PK+W_x^9J5w9+~&bTg;!$D$Odj zR_Ak6EyeTAoY8Z7M{Gx|cKO=n(=fEc&6S5y5Hzzk| zFf&xux;^(j=ig*!v9XiixA~hNY8!eR%*o8fZUZ%%U_TGmkvf`%sO= z`B3$l%ViICd+_~NC-l7YjGhe*=+$@)Exa~N1>b*t3VTy~Q%jRelh37|OT7WNWp2yN zhh9a!iaN9VygWT=XV6!0-iZ`ggko?X9#HJEdf=LDMfY3b9_9bqZFmU)edC>t}UGb3U!dhFsP8X=X7B`XN#^?J>dod<*72{RzeH{6WqPXYdpKP7aM=sNor^2-R^)AqZ;SVX zd~k1vT1O4|fn7oyLK{Nsp(FTw_L=-7_-`9q-48y`eSXj5R5TZ>1k1CQXRQIf0eiCc z1ZV9(c%wY0^f-CWc>e8!D(p1y8Db62nAf;MJ+UkJV|ijJpdZ?6%4f+d z;8|?U;GbJ(uRco_}+v z-`V^2CcEL9K?&Sgd?Q;>wiMgH-wBNGB4CWCE@tjytTPQpm5vJHL3L$gqf0?AkMX4O z%bWC$c@Nvu@)W4A+3ztOJ_q9;Jw5|qBR#pE(blDXO*?`;&^y_krDkB>^8$Fj>r?W+ zHP12zHHr4?R0H=+5?}uXVE#1)^f=hFmj|n10_ZKWZg?{@D9pF#LN2v8YY_S))r8Ey zt-Y27bu#O3##s8d)U&PzpDQit|NJKWO?ZA}exz-*ZS)rA{5>0fHarg6gxZAq<@U=h z#>0F8sKa{is%6hn|0crZ9eqa|2>xD?8PwHISJbx8dt^NQvb)y>q+%udZteUbbk zSsSiRT$|WjxVdm4oD9i=WP!R;Lpt~)P1Tkhh`ExI6Ob>chD26hN!RQh4c$S zjq=>gxtUQ#ql#W-w_;m#gx^5_nmMiUt@)Mlu&>D`u->8mrZ%kRX5Vseme}4&&g0Hz}nKA!K%rY!e$r=vbvei^VZ56hd(c>zOW zLt@t59tFLX{qy?gRnM=Uetm!N>1 zi}T@jc32umT@H0YT}IZz0T=|NXT@q&#z?=zDyUsjJE&uu`%MRHfSKYb(qq8-fn^!eg7@BuS>okcev-@LlyCNSRAC*U<~JY^iZ3yjU{(5I#UWeF#jeP7pk{?Gq;UR}ZU<~QgL75j?r5;q^&7P03~v1|3qhTGEmY2_9L!*=&5X$k@EUZ7L7?_J z2GqVUrr)y)lmoVp;N#vS740pDrZ9>*xq0}8uYxC`4J_lFMstFjI5S}t=W-w`FY$@-}Pz?kUdc7>#FC&zd={evtj}I7I0WwBFsBIxQuqU_Df48U-8a z9kAGE9O}LHCYT?qQ@Bs6IX#K5P(Pi%mD!vJr*`4qn}LVOMW^A>DM`Um{ksI{)jt91 z73vz+gZzGL>t3@f!E4!lT>Z&9ud7tQOeh1>tD>)aR1mt{&X^Vl4{U|LI?+n_OX0tP{k;vT`efs`2Z?!Sx%ZEp1#OogLhZCbrs z?c6v@oymA-Hs`50>tqJ#4>12SwmTaJ!FF&~^-c7n`C45C&T()JQDgRfV>NX_H9vc6 zESCt#P6qcAW2u_pI^+Fl%xBzWt;9I}4)Ff8w?vPU+QbPkr?Uq) zAF6}B8Gem*UiUO(g@ciUky)`>K|j$xW?%iURuSdQ=Lefp)%?UGQ2*)}oy4t)(=>zxDY zbK`SW5%hHVSj|a(0CN}h;bs5j;*u8!ULHMhv68Xitfap=L(IJCPWlk0zs$6R4k#K>baCq9)H_fvT`qlI28zxr znvt0ioGES3<)>h+#(2{;WD@wCt%O*Ffybdo1f4((2>&UNx`JmUe8oII6YUa|K#~BCu_Zdf-1DShR3%U;6 zcdhNI)iEuTAglkP+|f`TxO9T^#V?Ir z8nZ`*OCa`5^cyBTRf~=cj|?A+9E;Q|Rj<^d(u+!eR_e1-E#Skv5Az<$eI&P4tW~T^ zv`X|E&c+!Y8XmfaneckejJbXNwnHnaDP9tIjDBK% z$Uv|!))?nT&K%zgt}7qo<+k=_J?;{C23mj~?D|j+>~rn|UEwWg2OGgP$(o+I=PH;8 zKf_ws0p>kFQc38{xd-oovDHX0N7bi(0_-<6pWMQ1OyhIosd1cbumQ{!%Y(1W2vA$` zHE~}tf3-e|eXF|3)HT;oTR>VVo^+cJl0G*MhDEi;gZjI_=1` zBa5K}?1HMtsw!b0t8%=`@f%Lu;GcJ*`^oM^R2xq|TJUJWn8Go^jFbyK5h{5h-70q_ zm!y`Y%wZdKT@;y@|OO)u0mG3qNQ7oZTmepGvxCdInOwij`jybxUW1C|=^Lys+&fA?g z6`VU-DOM@wrhk9r{>Vj8of-WzLNh|2ppCh&e-CFtAL`wDeAP{?i~{B2P?t;lfR%JXLqQ*`aG!%n?nu27j7P9PKk7in<4*nJ$m+CYleWjyn0m> z)cIUDZ-M&Y+CP>VChFDdU}{NzZV*_{SO|Lg`@t}v^TrZ-!ql*5F?ZMJ)tpYP;C)aZ)${uoUKew_*Eu`V zIatn>(5r84R&VkRSvO>`uGH~nt7kVdqC(DED%%AZ;)B zxmH{U`VGE<6c{g!0JZZsz|Wf-`h46D{opHbol4D{7An&65i}HKHcd#2;fivW+$6b=VdYjhA*2j)Uk46VW7Z}Gp&z`ZaV^p56-wNWkD*Vy>UHB5c9Jm?qj{bGD_mSR5PD1Nrt&i?2RN6y zvRbp((+A9&JOygn#!l+ZTj3M>Mf5ePI~gZkMxSjfxDuuV5=_qBa7*Zx!2hl8^d+bz z-3_(icY5urhN=cylR5B7P=8vTvl_Sf>_DS3FJ1?m;7PavmVm#{YkoTngCXEGyadnv zL-a)$zqMr!OGDTRbHTcuah|ziZ*U#+akXaVF5yIeoxD1EEpl7r&X3KHZHR7&)`X^! zrjf4Uu7PjS$D$545vJr!3118NP{)V+Vz;amsI@zmw?Z5?Okk=}r>GGAp% zrAwuMiT@HuMlYCKIJfYD_yckG`m2*yCl%W3r0S%y)7j}hpsB4FG|M#0R4b|$%uzZA zAEoP)TCI7;&!F$qILRJdb1eNC{vF+kt<;&iQD+E&`jdOb|6VU+DRXYmu9y#c*`u7- z(6$dUO=y2 zSMp3R!shS==YWrgaiCc8Z~EW#HT1KD;QRFVfmgu)7eh1?&6I+nVBDl0e#L+JyXfyC z_muwN_3PhYjH>U>-)TPL8mzwST5I0o-nIvP9G`*r^FjCy)`7Z`7mMqF_xu!mD{8Cy zv0Xd9h6A9EeKmXt`k$PSV(c;*)R6RZsx^EAu7R`QVrDSD3hGC$k7{-L82tG&pg&ZD z+Hei%gK}Rs7xU*drgtuZhy6LY7W{oaj`46Ad_$crDA4lXVbB%yEIkM%dD9EO5}%W^ zoXT=uQ)w`+^4c+%x0hGH!I^jsjH}hSdolY~Kdtx5<>|}QU6Wnuy1q0y5?ZBNr5;N^ zmhPPC9Go3dgL=_w@IJVRGaml~=4tu@)UvEO9{}TjW2tIj{-cJVx5ayQAK2fp5Bfp} zP)A+C?7ttNE&fIIs|lwk1oKy_FyGG}#WA5Vp_?N&N1UDeR_v|VoZLCNdAwP#Q(rom zcQ9`|l*uoX-vq|yjpbygQF)D_a&F~Z^W`_8I_N=I99bO91AjU4a&Z1x!*Ii($4}qo zQ_vZ{%l?k2`mXG9@K4r1LI021l7D+y=2e@Y=)LFzK9{cF`fl_?l*}%feS)*1Ix-vK zaQJXI8A^suFgxykaNj8bCz)%|30{GICHe(1g&K^{nRNrT!EaA}%T<3_aOULze5sS+ zV$Py8uj>isbTh!u855lcY3gz&Uk&kw-vix1eZ2|14nv_H=x3@5&Mt5-&@b-BuGaJr zEW+=6KP18ayMIvZ)uLEJi*G!2BV9D>f_2WgOVrcVUR)E6h5rO|Ona2v!^{JXrH!ks zr?`(92dOu@4!RFk1@}eo=QUu>OAmpyVz2XE^!l1-=Yo5t>#JJy+Vt8qA$M|aVs4@j ztc$OUe_r@`;aPAaI4872L5G49u&i)dA@-KSyW)4np9SZkSnE3oyP$rue)2Abg^E3IGwV*%Ey2f?rrN)nipk|f< z*VOCj3o$=xg7&1A?RsLo&>_1+Fe_j)vuCeC*SrgiZLEO}g0Gl!@+W)-+0@!@k}@y?tn(n2Zn+=Rud@BE)HhTsY%@k>Q{cf z@2gMs1oMGkm?8HkJPj?fTLitp>gGF{k+K_HW8cTSwGYf8KL<6nTyPzJ3O0u}hs z&3iY`Tz`g5Xs!=T=HF6V!$o&7;CjQdn2a33S&31S5A z#krss@D&`SuUehu6|g?%wblXt#)G&VmVz2oGceZo|N3Q&ovsJ#Odo-3+y(FiJU|c2 z%Xnrd(?j%n==G3)<8)>RPmWEFEz4aN^rBF9$t{~#Hkc!zpYn64m{&2cLT-hi_L<9@ zanbbX^yo}5&P+$rk(OW%_ecVC_qjK(_qjU=ZgBJUOeJG}|J?)3pRFhT2znx2JJgWwh3mlmcnw&$ zKf*kxC19PeWu|4O2~=j*VxPi3!QAU9g;NT>_$nnU1!o=XO6>~f{}?;`0v~2R%nW75 zw>>QWu3=zImCIZ>H7fm7BcU=qj`mxad#Np{=enO*7xBI_czXapk-a18+iFAp`+0Cp zwvM8%nhnYz_MH z?LRlps7igv{ngyD92(|fW((ZJNm&EZ1JW<2UQYF)mUcHRNGza3=1L}f|3BN~+vA_Z z1&Iq1t-yKS>%qOZJ6ww2wQm= z&%l#V6U-IVukVKpxL)Yh%!f^|5!9Vakr}y0`~l{N&QkJsSZ8~XnM>+aeryYrN8?s& za*Z)YGl#R*=g)MlG>&@!x`DBg^AKDY)H#NO{?Q&_oTabb^X1GX)VtNb4NBW`CX~-z z6?)?8gW6#^X5-yWJWQHO#j;G`U$d_90{C}c&ipyom>SF&NHBwVD7|9+ftIzbttGYw zTBUoJ^^dAqRkPm2Q()~u&x&&z`=|S-4wxx1lAdt(ZqmgIUl7tjGKK zUBB%IaQ~kio*eWgUlO?_(vhCRZJ}+UeL4GbPH={^TEMT&lBfr2^RAO>%*LU&QkU+8 zzuw>b2B^iW3ppDk58h!Ofj%*7ft#QVeZlHaZBDfb@?_(o+c=k7jZuu3^dYI6&jP)% z?jQO)hJu>9YnoqEAB>%v;xAQ4KL%T&CrpK(!F<KjuMZJ}!sG;2!AOJ%gI`aQfVOaL$RnC0Bs`z0QVnUgde)7;}63p;CkhG9Zfke2 z&`zV=1*P>vU^!*5v#EYDqW23V0kof*(1b$vA3D_7+t2RB-me1bhg8!*Nh^x{Z3_ zG^Vepm3;$kp+5enx3k|4JfZ%~HejCUnrBXF&C)#5d&+u&dH=KUGq`uTU!6q_B$6G; zHs9HwyFYhlY-fx#JBT$B3~n_a84ha2zh(cHZJejxe~fXo&Q84%W9 zT7&ngwF*55u0h67D?rbHBI27+7Y;CoOKo5$jDhW-M(fABF-P^);#Z6H^30*X|3~KJ zRmPXrH{3TkA9H+kd{j@2vm{;y&lgp5a$b}E{IM_yjJJaM!qMZ=VNe_?j@$!3hkp*= z1;)j`zP@IsNkH`FJ5Qo4{LYNxJHfTzdXTyBAo{HrrN;q%<;@oxFLN*TEEWG!lO(onpwCH8YUVhX2I{t-;>^lkES0@H_tTB z{0-fTx-k)XYmq%d=6~iR<3R0OubMHh{gHap9-|My^+j#_F0ei_of%K-;T2|lnTv@! zwtAEz-BSAF)Dvpc6Xi8m7rYkD*H(ckx-;-!>sMA;eM={yy}5sC2k=_=V65K`!OBWByeK!tfrb zCmVwszZ91&E;%530FLepg8TD)=B65-)PRBDJOTGVW1btqn%X~LEayU93j7|mqBFtI zd(XOOO@&x?Ebw`mOI-%)KQX=^1qP zwb(Z|1ipxT5!oN!A8sCL9hPFZP0O zKIhhuo`CtFMxyV%kU80|L%l&?=?HiR)K|QRjujsZ{1ml{Yw_N(pa)A2lIybT%U@L4 z?%&1(E3%USf`k?kZy)~k$I7u!#9V$U*_b@31YdI%;2gNt`r^{8q4XXPlT4{EDgM8p0WFH z_P>D_#9B#E2cfS(t=lzRpY!jq8gGwlv!b%~$k7m|x8`{;@0?CwhuX(UdXz_iy0mMF zy&c9gt}*J;YDnL5j_$eOIRyTHBzyq&sp#SGrWnrIPm|#(_zb3j-={XUo3o;tf-_On zqx_oRp$z@6`#3Ml`=tUsD5E$#Y76-FKY+7OW)#if6qTETbLZO7FVnNAXW-quk=fwA zGQBdjIPbt-SNk_w##_e!16OiZt@rxRFg-OrRX1HXeINV|KXY!v4tT!k`5?|pqr0zW z&ZFMP*Wm%M*RRCs5`hM;_g3$ZwGsU#`s#lLbD^uiJnuXF1b>2Bo_nS-RuZn@4572Z z+^Ht#uO#Trc^W_VR(jkPCl@C@xBdJ0_whz>u<&5etI`Um_uFt7UVy7P?Wqs+1LMZ2 z;94{&IVh-qK9G7K^(XuYTbR>5B{L=SAiP1J*w3&5`WE*swpQ$8bM3Z%WWC4hSuM^U zn-9Q!%6p*;v+84cvAn&xdviUz)p>@CqKl%xa`vG*uX)J2(7Mo2_!it7KY#?{;d~eZ z_Pd!UnHSv!=2ZF$^ctugSv!6Q{F+MeJf7~V)ZRK!OI90lJ!lBmK?5-UHy*Vv>V0qS zv=*KKHNRw5GSCKHA6T-p&Sn<5wKQvRUsJ_@2JEkMozUB4zO4r9+IcSh@7}jXC5nQ1 zRm1R5bcAQXdawEV8(`0y9x(G?>tOEb#zqyO3aBUTLC^USjJb`=y+-`J*GUYIlJ}uH zuUbL@GalUc_fbn$Gx{1H1a+sH;Po<;x{v+2<{m4cEHi`j(_9XZfcNT?aFX+7)jJ4r zi&s&TEr-{+a;9?T7iR6&PS#E?O)O2^pT0kx&lv{hNv)~7u4QIi6KV+OF(vbn@FU^Q zoX@%g27&XwJu_uzWM{;gaTUNkG!zX*Z=w(7bog|5A{^n|lw;61+&DZOZ}-{Y9(`PwP3r#Yx4vEtK|M~r&06_dW?ieJ7#FDL>$U$6y@2MY_Mqu=RMXe{ zZJuV1W-rU;9J)6;YYST7p{9Y9}&@rysF zC8)dH4(7r;!I)KVNbhj(@M<_Oa$dw-WEE#h8-KdLeSpvAPtG+{!}^0W$s5s3K~H@xE`K{cVTkj#MyW=@`AuJ>zDO-hFHGN%xgqE+ zs>}JK8QzXT9L5%nE%N%ezuSEGPHG2F!Eq=C*WA7IqV~jxxUs~>z{6$kW4^Nh)b)*< zTu1H)uQzr7&df+!4z1xYP@jGj^i8WHcptydc@{%B&)g?xX=Z7rLs17#`G*bmVK}k^atoQFlJG|Q?tGT%=4zh-C&-ezUuX(W^)0k2|WS7FxTWv z`T^U3o-K247rDCN_wLHtl@+Cz#W(93>!A^-C#h#o1J}Ya@FlpG9id0p=c_Az1M_L;p&dAgg*$&2ozVKJ0uSR!Ac1NbdqVOV4 zTKIo%4c{8B271`;1H${DPN8NO&x!}NgYTHRejoVwr-1u;ZRWh33(j;=Px=D_J%+m6 zc5od+&aymRY`p(;@zYB3fi`5kb(jj)>ThBOw{L7~sln;N={WSr z^vL*la*J~VzruU;$*BALe93Xx zhxJs{DXLTS1+(iaq$;G2C5{DimYOA+B|5}A#H+$(VBY3Abe>(%BHki6qriUP)$ncN z+eF!9*`ywT8p#^T51=yVSyRqU-w6KfFFD7r38yx!hO3!TVGo!!PWu3s!r$OM(}Q^& z{{8xNtYy#4ni=%fpF^#;DU1NMvn62NZ6fE&?FjD(_s{R2zYjjh`yekD_T}yi=4sgT zxs&tDwnVl>PD4?+D0~~73w=XccW0b?X%svm41a*@ z&698o80WME>$mQCF09r+%zgFLd5;@UF9!9@&hS0BhNvs)6}%U!fw@ataGfDNI;~!! zXT`NyPt6W+|C<8(*}N~GfU%(NFqeJ}Yv$?{?k~H*UIO*i-Jl2gdwjflq7>`BUz&hk z8+BptizCdVHTE0BOsT#(eW?=s7_3Wm!gaz|fqHc_=85ay@_8JL@8Wj)ejf#O?ODt> zt3rRawTfvl8_tKeu#x`hZs2T=5ji9HuG@3k;n(nW>q-xGcPM0_y)_eKTi0=Wwv5%C zZ|2%*&B@&J4f_5*2DLYHJ!jr}%^o{-ELgLQJ13*tYzAvHYA`=Q6=(rxfj%MEG_QGM zPW{`)n8rh{Gp;EI!RNLfe8o;lhJ&8g zKH%$UZ=AZk@!cfO&iNwzMRKj30e z|8`w*FH*tfC<9!ouz8j&6m#7|2yOEQPx?4q-aZU$=)dh+#|^*Pli zxCWdN-XAbgtnG&6&|UahP$ zb4y8=yifIFP6oB5+4Qhjd-a-9KePYkHmC+ZH(_v3a=rTk)Z&e?^1$oWn8`O| z{7SHpo~n=FHkb`t!2Rx8P%rYe(F13!?zP$ueq)wm)zei2U-;L|ZR!b&(UsaUSHfQU zvq8U&vDanH?5>(uHBUeHvixQF4NEmF)ueQj($7K*;Ar^L2TC0%bsuca-ws{Vew)_$2m8tTpV7?v1{~e1R^oj`=~|L)}B$bGG9Q7#H~TKh6F$@Z6q9O~X2a zc}*Ue!&%S2gnk_BP!~XVXbBnmkkz_<96y6=k!yf;H?;`&RP(UyMcV^SNUd};eYfgO z#vW=G=Ckg>>P;6y&rHuu0@Og&Lmz-Qz}k?SPSv8S!5oy!I1|A5y$xIkPrybn-ZFM_ z&6&$N?2};-RD)|^5*Wi77gcB8S~kpMp7;}>N3$_=PV{ZM_UR3H2fWwDz;3ii>@@+|X;u7($2H?#utIs1f-sa85v%WS8V$Fqc_K-$7@5 zycLTo1~W{p33yGI-&xQ62CTy$2DPb4U@we+XH8otuXVLE^Coi+bB_#O%EovaT#v5jT#Myk{$qX4_(=An3t!1xrF%f% zl=ZfEVF_4^e-9ergRBmvAQ#_^p1T*pTAdz0i+Zz4%_>zHs)GFv!=PJkw_rx%(&*CY zIq+iS#mIs1f$)9cp8OTu0CPE4Cj|TPLB7M>IK984KporM%UX(lCG)uv;QIrifH{@( zI5Wz4OHJx)aIZ2qB{WCDo*T?pn!!w6*OC=r9makBAfAs~APSxF##3Gj`gr#<7sWkJ zom<`8JAchPPt9kl&by~7Q>zQZ9q7cvz|VUR+w<$*eH3m5{fNd4zv4k&1J=T)GV9Fs+t=;{ z-s!pFx#3-rU6C)NUq;)++QeQ5XChb2tClw*cS3Fxmrv!k=4{o(e=?U6e`U295cO5m%phG86A z4&3wa0=QheW+fj)y9ILFTCVLJ0Z&(EBn zNvG1OHpw>0PKi#5&GF6g^WeL}@0haNC^!rA{KE4K-zs>kz;iJNLlgKBhQ)`)Hv%J! zqP2{#n5pI(;5}fDrVd^wt4=UOpcB0fJHUFR z?>`AAIV;8I;AwE*e-?~=mNEZKADin|1MoU92i9Mre?TvR35(amgU|uIH?7aPPJN0u zSbaPM<}kUH`WP)om^b3)u-t#Pb{mEg^% zC*1YQ9I-5zH>x|U4R+$Z(N)a8x;1iZutvECbt}`Y%!cwC%Krr2p!XTQ&p1@>P`TFd zT-oQ!9w>dFbhT2|N~Q8s`Imuf*|V`{WAi!j$-3g(k+&nafos>Zp=XuMLs=M97iBLB z{9;}^8>wIRfESrN>~-gBVD8~s>;A4!;0UNcc7fT3h?w!T50(xLzC6t>lalz}VdD=2^{{WrfC|6cs+saH=KJ8g!8;C+#REuhw7UNi*ET`ppdnrriq@GsQjyrd~G z0v(|eyp;V?&`;Z)Gu{07li-|5G+CwCv*22VhJI1BU^ z+qd;Qd;xdo-krN8wuPx>!-GDpI?+1O90vSYAJU&Sl5=!g!s9uQGl}Dc;A~&>_%bjP z&x7lzHNT6&-0TdPj?c-w-pB5q@*5a4tp;;_V;{>OE>+ z(*l}-y2yi28w{d4GdrjkGqUdluelv?1~sUEm^-BBP@j*QNmtHoaSi@9``hfQ^i>bT zx4nTmx&<&HIw5*R?26cv&>PgeN5O|s5hh0`2VMiuQ*k!RgUsHY7oHd11-EnV+((ei zNe1;+(FfTJNIHyys!Mw?QY9{;+zHbfRUKDFc zli_o4&Y1V$4d8XH-^sYee8{?%&*7tRGniBT39b#U6RtDvS!bL&gUMSBPR#`Un(ElD z<*x6oLC=xD(;A_E`p=j*qqkdq%XQPQKLPIZ{w`zOTCkBhDDEA`UN@e;G04Bw8jZ6Q zUR`It0(-aZ`PExwF7NeHg*xw1`s{s;b}?Va>#siif$wNJGX)s^9^56ZXJ6(7LcS?(mNaKZFX2 z3JETQ<-4c1381xx~1{= zVNi=xGid@tnVGX4&Zqxdui6waZu0qZ-LpUGL3kVnzgE_*kcdg+Ea=nLODwt21&zR>J54oN>55)V^*Vr7Zr7k{nd~2%K z?skNBgyP|N*gm*Pu}QIAa7*qjxl@1^@Z5oU1M?O_EwDc4nFI%72dLOx6+093Sl-CF z1nw98%JeHU66TkhuRW?1V_EY$=61~O5bF^8Bl1UNTX_dRS3r8#$?_{ zdJ^o<)1R{(o}upcD7a_b0zabmYy^A<3G|3wjgAF>m**%vqVK;05+49HoY!4xkUB zIrH%Jy1UQc&%Ehh!TiMaqy`Lty7=hNI#uEO7p>TOd@*^e#8fr z1zo{)>nHGcUkukUZ^O8%da3HAuF1b9e@xz(;B0IAK`w_A^r)AG%fgq17ljsu9)-K` zy+4gBur#PSS%-3s)fadOM#FpH`g07Qs2*AOGW8^NB;%&%!S&?B(;o(Xw`xb$OVkYB z1M@C*g<0VL^%zQYC9#g+qzu3X(!RV35k;u^K(CD_vwnzx_pnSMIC#IYq{xS4p=%1W_ z=-&P+&>GFzjhD^`{bjDx8T8DRptfn9+I-hKrN20gB}_6 zj=A)`*G<+<_J>NG%`p#tfdouVPYtg9zd6%!DV`K(B_gY5%-05hy7tB3+T=R(1?SJH zRgVF4Lg#P%2YhaQ?pA>B8(;c5xHhUcnGd^msL%U68;4E6sh{dcIR~r_=*hKiau(<}c>t{O-^AIf z-pgtRu039#STTd1;Cfm0vOb~TN8jtj=)|aV-Hm(igkPh-Mu$d*MvRrWhPH;xFGezN zr8mCoiTJjzW?p)`bi1_v?PZB&iIwq{@&2%+a7p0=urFmt!H$Bmg=GszfPFfT#UG2m zSNL9Gt9YyUjKqw@c<6#YZw|Q|ilAGnTk6mBpXrV8Xy(z3`L(qS_aEb=C7^DqURQ;l zQuEdenOA1QWgO|g{Wa(zNP-&5f51AFdP^ba`Fj7VF}(oR_t!z7$>FOs9$E+ALqB*E z)X2@(`hfL3W2aW|6m)>H9MGWz-tf7q)^iikgn=i<*Gy`7qPMuB#o&?uCW2<|>JybnS z{mq>5HTa(fYdrEjbL_^K7+*qt-+2s)P$D!qGC1;d^y%ot*u>cK+~v7Hz&_}i*E4Se z41pJ*kn=G+!C!DFb|{#GvJ!vDchT>nkHPB5>PRE_C;U%%4d>jv2G#I3_2%rrC-95g zgZCBZ8Z^mklJ`XJ6S)_}E{HiJ(|u!iXm@CA&e$C5wp*D2HUzSvTZwK=d#w2XbFIja zt!o<}s!dzdI!;~bSNI3If_a)6w{zT1reRv6?#nIwT%sey3DuZwQY`7YJ;jA%rti|B_ z`kA_eag+C+Ynu1}-(b%82mO2c3-yW^8@kS23!}itYW{c?=oi@me}W5;o&YsRuhsGJ zIE(|YKl4KCzg{<9UytEux*60Xd_V9e5YOKV?iu;aH1L|USISz-n#`KaP3fD`kER|? z&5O^AmjcgFae+PvlTJ)J@yyX@j@JCA=09Cw@V|rq-2kb2Bd&Yc>a8BOK=(~Pg1+JyV4ny9q~^IRW?eG>nG z`mOPwfAd~YkN6#2GtA3ehwSUOCRR45Y|eGesC4~!jQ+gMa6OpMHqCBICrI63POdSI zan~YHkGhxHZe_r=`qrFVgSg2$pL?x8^E+nws8_9pvEa|NPu-tq4)-}TN{plQ9H?!* z3cX+$xX!7iPsfvBPG{efMYWcAkyEfHx+eNi-a~oAa)$-88efUM68j_iM|6K=e{lBs z#o>#?wU});ioTc2!5X0JW;f;+7*kbY2El&j6r2sl#j`;j%2>*ns0lqv#@27a5;zZh zU%kO=O#Q>W#kV&>?a3OOTE$8*mN!P4PM^kG5W=Ta5!9c|GoNQZTpKWFa9_7>bvIap zy9v}~uBCrMZRTUBK!1hziT9fKs{6j{q&+uZ=X@RX&V3g7EE0)EnC8+XN^4=PKdgW` z;5>r2V{gZ{Mz=;Ei9Hg;Pp(C^p>?D+&hgGcFYleft&|&%*CA( zXFhIR>Yi{ZSZA@m;9NaphLPZYV9v4#(%|*!rExTkCdV=2GZz08l_3!i~8_%V0`j33uS>+@sy6^d`>-*I?uBTc|^Ig!4+CS26^o zo>|u2Z>Img6I=uL(Qme+jRKN!=vZx&GZ{}z_O$IRP&7+Qcjmg|qdTaS^xs1aZvyB^DXpiId!CD&xF$$A@h z!fRm9$_zXLgTOe-*X%xU9bOJCpe)$G`8RN@2Kk5och4~&(VsbtysZXYNnhrtRC4+- z*Jf2>RpPqTb*V$iL&=|0Kc}urU&X8WNBZN;#~J&qeg}IVz5%re*BYNh_fKP*TbSG3 z6U+^a|Md~rzp0*N9`HGHKqi11lxy5@ut(S2!Tn_f*zaJ>^a(RJ?t@Rz=*?B_9WcZ($x>3w>jKZC#43V1~-i zk)K`8B9p?C!u4TlXlf`7A2TmPU&q}rjsBwx!9Afn_Zb$@Tm> zP%C+gd2?-|ZKBsey-2;t_R#jAPp=|p?o7*>ma{&4eYW?`o#4;9D(D2dDwt*R1?STl zYp6%N2iyY_@Q}X?Yv4}M>(d3S^SP$?0qcL}c=pt}p5F|9-uUJ=aLsbAW~M@Ibhp8UMHzo97!NO@^1ict|g9UFN{6 z16Zqay&4X8zyQ$8Hy2#1eC?m02imxQ6d0H5`_+SCeQOU~&N&yZMPAG5Obwtn?BqN* zJred}w9mB9)M1W#I2BHPl=uksx_xlc?^Ox}l>nm2#Y&78BQztSFSYjkSX#ze+D#xc7=y~ushdfPMLwX_pf z!$)v)=;n~`zXq*CtwWXIo1AZ`>Wv8InW#HixAWfvzAhV|gr9iSGWe<}q-=->1Eb_Nr7cLtt=#&{dd5$AyaR|}aBdZP7X zwg+P)*RKB1lzF?(mVG1ljodF{UwB)^)UF0b21fL>zY%&P^cLr6Z>PrS-#-Sfg6Ei{ zX-=u{()H4u|86|D{lT1VB&-MHYdtM{ncwW(0d)uWE&Vgrb*eM}!#KkA%l@e^!Pm=s zAQx@}uYc?5#uVz^e(jv%IYAxj6YAggR5WL1k2Q%-*`2cMh3bW#=iHQc@JsfH_J|&a zr(;jYM#B%_ytwUS*K$K@+$Xb7 z2G4`BQZ*=5vQ){Rm}%xdvL*bZ)oWdU%_EGJypPp#j63um4F`RU z3&5JZ`p#;w-uN|`C%J}n1=kAK4r`L@nayxNxEDW}c`~y$xi;CWuvcNnf{q0%U@xpL zTwQ2g{F>x7OcrVy%&3m1;=wuB?{KE)FVMfJe{de%7W#T!n_h=(yp@j^KOX4wrO}o) z(FbRZ&(}!3=qqqfe+gV;d{dWf4EjUdbgao)TQSbL2-Gusf_@WgDRFS!QA_f=Sqz;y z)3O8jTzY-Eug(Fr7Exze0rmj7pWA<`hFk}Z(@*w3=mYXPH-04?$-1n>WhLq}AIjL< z*)3;h&dywux+ZlcJ;?T4o)5d?yW*Y?@o4-}x>P#EmodvSCzF$Tfx66Y=nGfl4^`W+ zC)?M|dc|@$3huw9;VaHtHm5cAPl7SBF{km-RrpPKw!8)2g>$%XJTG=BxkL2hFHfJyoYXV#0f}9I- zK4N~7Yls^A```>b|NjF#1K!{2Q`f>nunhd(R$!iHze6*yhsFC%Ux2<)dsh4#jHS|9 z=^*cNjZlMfzitJ_W)Fe+sq4@GaM3XMM|=<8#3Jq;aCc`!%qOxuo{Wo5NLy zl5i&YzW%1A^l=w~*H%e53TjNxK^HKFKL+L})@y2|YNh^;{~iA;@mJynSejg#d^PoI z>JYTfwC2>*4>HHW>*NTSo4MYYC$s{+d}<99L2r0H&T=v*G)H)lb6MPT)l^rK9~yfZ z4|~tMN1Gq1RW-h^~ika66+Fk21?Vsrg@9NI@_)Jx8~2uo0B&K+UB>- zUy!#Th^vgRJXm80sGBzhwWf1nc4T%i-xCQbJTo*iICH=~OHar7&<)hM9xVA_;CJ=j zF=qV)>@gTk_3~EO2R^6jZN~7%gyz5>gLTszz~^&t$-yN@G0SBn{2Bf;yg#%*q<16& z#_j6x_A(fs)c|V&|LZ;KNN=ob$-|(|GZNH%%%RPd)r4LJ^BLD9>v67)#!s&M;>UAN z<(x9tyqtNPZ9p%P_o4nKUoY>^Qq0a(M=~Y~aun`WV_x;%*FatHOh{0F+Y0Va=60{b zZ1Bz3(O6I~%G*$h9s<`s{hc4f`(Pi%3FySk6E(<@um!vx2ZHzeoA6lHV@v_Mk&e<| zf@@sQsJf|j&B^J>>Gx9arQT1zALIe$66F##<2B>XV`>m@5MNrjv~V8W4cEX`@vGu( z;8UoFJN;>Blx&o|3`(a;2j_Vl!4F<8Q!cZd^XBy7>rLng>UHW3+hHtN16iF~ovOlF z!3~-7^fgpZSJwiX9+(-Jv5u;@-Ck1b18QvjsBv4X8bDv5_pwSa4xrAPK*7`Ov zAM-!VPEl{yr>RzMKd*JgZtwsU!)S0_`;&fS-|q~i;T+J9;96&{_$(}dWzZMY(9Kgz zQTwRCc~|P}?nnADo5BOok=X>fc($Cq`v&L-Y94JKZ5U}7*%#gyUKm;!%qqGn=c-_4 zu+NLnnYpfgFmGkO#ZK5csGm<@hMKX&RBAfL+s07pf#%uj>(=1R2aK7FDR#kL&?8_i zS}nwUWEcDdjlh`&f%k@d@H6_XyWqhvCcO`zeXmHbh@O}jZyL|c-PS>cyb5{h;cDT} zLv3gW>T>oH&*fa}C*g9)hO6ki8yy-Q`WhY<&XteT_&FY|VQi*iaS%`aK)3?b`Hck{ zL0K?nHjp4ZG%qzL^RcV9od>sr_q(y;Lg)+b(=l+ZP*Z)j=vhlbLI11q zllMV)cpJWhnVdaP3Yx=*(66Xp&^w{#ePiav%;4nUq%*I*_vXWk@fYJ|=~dM~*df({ zNhZ@%)za0{O_=@w~gpXOfXL36-+eR!FHOkANI($v-@-SSKbx|;HL9Or*KBivGNBD`JVe>a@nBI3)!MNVI zw>cD3$5T^Li*(Ps8k{j;T;C4u(ih75+Haf-GM*Y>EFDXai;oMu|DPv5Pn5xztDe{u zra~{y|LB+LmpKd<(le%Km zyl~ztkOt2W-vZyk0oVif-8nmMDC~*tiM<4j1&-!Gh8$0C#vO15j0=wo-_030n{ze? zXAPR$S-UlNeiZDjG;US*bI(2(^m!cs{jTOQ*1^qdT0&c}R&LzXo*ruN?fRTcatk<{ zLM_d_z_@2LJ!_jFpL1e&PfOL z4mFE!s51MS`x-i1YB5;5R;&4u-dFX$`%d3?S}m|VGuzCshrzq}CXJ6~fpMw(hCMIV z*whd84o-y6Kpo7u$+gND$bJ{&+ne!y>sK@8RRee5aeY>6nhvfV`c$mN8Z-R~=3>^> z)VYoIXM#Pb>feObIOk53aE-F2^)IuGy(ikh2k<1l>lZLTZxv^MZc1;W!>wcbF?wz{ zB{n5Kh0!QTJqmjS=Ms39z_;*R;d4xn>&D46a|;L z!u0Oc?$nj(E7QF*y@T`rUMPB@=qRY;9Rl-5y&3vj^~|*3yhb&(@4+?sK^T`cjyp3G z_$QqwG98b!9tZ#bDEOT1V73(&hfJrUPJxzt5O1yZ&B^pSU5}4T&DeNi5d9;@Qr5-P zKkLC!XwP}l6F`mhTv!An;RYxhDjRA6>PBV2zJ``?HM{`ER`-PN3B3!Gb0!BGmGv{{ z&DqD|I@}9BgxBG5xE<8M)TPdXDKjY`!_{>Ap4_=DA6fq82 z6k8N)oZC2ePION6BF^X>9UdK?%-NDJaaUi%Ts!NW{w?|;{GGMHpVgh&)qS8kc>jLK z93J&}^EGu;a}#5$3-K^|pDmz2h*p?T9G;3i75JF$jolloms>CQb!eW~Jg+(ww-}>br_#*WyJpkroRpBRm1WlO1U|wbq(>nT6>T>?BYua$;%-L`HD1J%T zHT9As%x7?>L#0!dg8ARIPSpzP_~w!NO8&$*I0FtaOZLn7m%&WzSR$6#8{ZpOyE->@ zZmLY-GFu@0w~bsu<5z6r)1<^Yd_x@uYGACJZNdK>-dT~BvC{V*QZwnc4= zlIdi60kZ}+BsV0T2j{${N1!ZR3LnQmj(-aW;Rf)1eVW$eIwU(J=R?a>%b*rlI$b)w z58Bc%r^mv0OubHgO^qjK!cZ_*wLeEs%mmIc{51AyYz+JZA<*kSCo(7UGx_HyMQ|+pSm00c8XW*vzzFySZUeQb@;T*m^lci0 zU7CGqQ1h>tQ!(dNJODR>d4Rrgbp*8nJvhdL=2jixa<~iZ;hhEgq0Et7E7X^)1Nu2* zLe~zpZfkm1fVp#EfzVO_2qb5r_34NzBG53j%)@OADE#$?{-AA!2#<={T_5&Q?- z*Y%6M0@iEC!w;aB;1@iu>YuLRY8{`0Z~ByWfiaWUqx;}Ppx)pfavr!38x!n-_3%8H zGj(R_;`GIw;CxBCF0LK- zZU6SRbhNqN$MJtQ$Cn|H4zxxBY?-wtN+x|Y@fwR2}W>BV>$ z-llJ^DU^Wy%;2pEHJG3BH|ONo^Q|w$HOt&zjdB8K7@h?c!RNCR%t7bVS7;xG^(FUD zpO>C649BSvxTIwKlf{ z%zxhn*9kqC>ba{qhgH9ovDGyAg>zz#tm}77Wypwn*ac}(Ixbp_Sho<0}PQKZ%;@sU;P>z!`CxC0%bkINWFRWr7UF}qD zx>G((RY_MNin=oWdggUpQ)@EinLm09b?W+{r_~trN6zj|L8OS{KaWo}vz zxCrb)DPOXDuttoh@53C<{7N6T>y9FvvAVT&a})Qj*YGN|0b{w|ocW-#6NPoTVi6ln44O|`+iunm|;nserWaglmidCqBR3hpo7N8&nX&FLU#?hOUk z%-Uf7_y(NGY`QVbmNWh|*7O=J&-sO8;SShMyrd`LceHeKyt&}DTSPzpQ2Jb~iyBkx zq1J1?V<5P0d0$@_y)HQ8Kp)XJoXxa~UR*-2&?V&Q-apnLzT#YD^#tp~?xPK;59>$q z9`>Fv|FHkay;JYmgP{jQd|6~8=mke&h%u-q$ivTp9((&|AhVtbfyD22ZHk{yoWyrYZ>~>+)EB;9S&ybH=q~#ZDwTI zw`g48x^9l5rtkZ%^@He9T@Ks9n96+2Ye-#sJy?r>iSyl-f^m+X0CgjE9(|Sep7?)c ziD0H~4QA|EQ*%wSpHPq2zhF$|z2O>VoaFagbFeQlUKB4HNKc7c-8kq4#ytLB{b8NJ zUJL#BWx)T(X}VWG_it4rGyXE>Q*TMrQ`02bB>8Im)gTA@E%94oSZbK^a!P;WfXsl* zX?T>`<$J)GP3_#?z-{3A<9e*W$F=)D&R_e~Io@C{?E5q6D;o`7cf&b1s6JE!?@?oV z^J(|xcHp&c3}w!w#$fDOles7tWiHAzNjFKW8MIEePTrrmKRA2tK;eNx|MoKyXC!vU zcg7uRr}lJS;=IH+umK)QK9ro8nwTO@P9IGjO&y0Xm>KspbA2BK{ZX^vJZ9NgYqm$u zy>Jt93K$McToT?e1S-C&QDv6knN4Tuhi z?uqOPG~XWK9^sbocT0<)*?E*iMbz{u66(4}<+E`oy0G^@xdZ0*rsuqFZuq z)M3^p*NGqD?UHW?{dwxq`lP%k^EqhO_3Ss!Cs5CO9;_c4KdF~(&e|NDdp-yc)4T8^ zczh)`#r!UygqR+{_BF0$|_b@LVIVt=CxUT)oStp%2qw*a5@%9}WkIu}QnKLOg ziRpfQLoLEB!k5BvW?t3`*9y;ur(iJDgRg=KHD3ki-`K~yj`NiDGx-|pdtD0V!^6OR zt0tI_e$D)2`=X39p9R-w*B8^&a=@y4=#%;(wH<2f(}ToYLnxgmN(bOZg-OTtUS_rk-h)Cp!$_lD_s+@FWu zoO^#0yqfiDmbLI!%sw;T^6~eEX5j1pDSQhqROV_1qsG+kUB-{t)&sA!wKvzQKfry? z=hAu6-rwp|YUo~X>X^5J`;$Lk|JAI_tjs6rPtr&5AN7V7i53axf2(oZ4_6nugXe}% z0_QX7Z5>}YzA!JI7k>yEBpNUsZf)Yu7TXNY#C5-$2iKxs zH-yH}1I$&u?yP}50bYxBVI{QVECF?#2z4}TbhUH-AGN2&_$iIW%!iD-T}zk1TF{Hq z2h`iCZ7jGG%r(?)%@f7%pNlU-{mj2zKZSooKll@jsgC0r zc?x2fpVWAJfWDM7(9d1#)Z*OR_JTU)t6)842R%=ITrJr9vN9e9H3Z|>Vz6eV{-7UI zJ+u|92K}&2nPq59VNPHScZ$Z|{m=j&3_lp|8|fSId^r6{HS%iYG5#X&;rxg57r;uW zS*m8KE8*V!d-JQq`S5t&<9X}BzTU@jAIp6|_I{AJHI6loeH;Cj%474WdezC$Nt|mp z2j|3B2vrEF=iNn*l6%YTV2)!w@N#nR+MGY+9_Tvme&~JlB$$7gyZi!QIj07;Gmla~ z<3i>IZUAGRZg4#q2R#X1<7Tuiqf&bk6BVpb>SL!}Ox7Pni#S{}_LWHN2|KQ}J;PVm97$^#4D~*;Gf9 zN0Z;dCy7rI`{VoL?}2mU9E$0AJ=Z&{umV)KN% zVt2)gB1Mtj&<++cNBTw>5gHM?m0p##P=%SUO;EYl;_EcVx*Xisn^D_$t@%Hm&OE@z z^8NqDoNdmGohZptNoljReuPMr7E7cJQCdh!X(2+0qJ5$4OG?p7vX`Q0lT_9cZL-hV zXZXEd&sV>B{V_9UG3T7;x$o-QVAU7oiojfLd@XGr84`^ph{ACZ}HH^WPBs z+AW|iJ)iSoR>CgOKVz%^I0-+w3Od#ZgbWnNNC>O^YJ?q9|~Pv95P zmup`9Fj)IF@9@5x0`BQWoJC;VV;t@^^F7#y;y(Nc_}W-wScHGsczrXN7i3Gbr6yTb z!Ry>Oz{S{m=5^3(ssB(v@*=S2VZYW-um@ho`|R~S4bFupz&_%WnZM~CV=ZE2WMpJ* zbZyjmWuBMfyg2=pw-wxm;xx!`tKf~;8!`J%V$9Gp{W57 z^)YK+9pQK8DyR_|4}A&V`^H3G^R5XkKn;8p_&j+(s5SZAyb2AOduOdc51{LaagZ|` ztoNS}#--+sv%%l#`e<&q1wI2`lb&E)b|V-|>5(-*vEDR|nw_t|`Cg5qHI6=uU+U8` zpO)Di*&G=c8yDLg-5k9L_J{X}Yes5D&czF>7jOg|2fkUW_8wJ-YX-*S`QREq7Sxk2 zhAY9`SbfvyaXjcFH$R#HZ-Tm=@yJ%_$~<^ACp8>32Cs2rN7wQl*&W#p^i2Pf{v|y& zH8$lMG@bLC(#7fG4p0tiK@C^}tH7^KNlZzYT#SKl;lJFjMY=`0Ql=8FrhS=#oc;O{ zoSQp0m=keI$tgkY!Fdnn&w9UR(c}9EJjzUJeXQz>&f}KTs>x(bcGvWc5Zgge&uR#5*`-gLu2{BLC=}7t(u>jkNyy2 z9Ahchtsdaxbd5r83H)Xk;04k5J_4*~yG}2GK48pqC8!07_he`IiZd&nZ#WayYvOn2J@1E;nS*jA=ahB^Ys9W; zURT!3-vfJxeZL950CjP!f5Cn09`F72DcBdUZsK!duH*fq?&O}Mr{m$s!;w1W>y+P6 zX+x!Hm8Vs{90pVxP-!DstnvGKp#E=8XRKgt-F4XYRDZBu zBx9q7r456bl?mpNybM=?F;E|HmcWGEgxu#a9+ty8dftj)5ExUa+o)?yrT<|VIP-NH zi~!>(>vsOz7^urk>gwR{_y;D#70@629(_~BWBM}Gt~TQnoC)W^I8fWN-^IPcTB7yB zY)Q7{J!YNg&$KRQUaF?!<5VM4|1w_lvAZ7?Gt1nZ-CWZiOJ~e&0dqL_Gxx(=IHOHn zOHV`_&hvbhF0`AOciRB|gc~w9;Fz49IgMVmg}H^fo#1ovdFkh+=DG%i))ox@%m?kM zU6)&zo0grHot2rDIh8X8hNOn1_9XWNekNxxtpR=DuXA?FamnM74?-`P3Hrq!1<&j4 zm+qI|3X?LEGJBzQwsrO}+>*N`cNy~xT>pH$#-3^q>Y(l`|A4x;o-WrOby{oO$f`lD zS3TN%t~Z#oP2^0^!=UFw{nXl;ekE(~i$Gt1e#i4+6;umVl!rF!R z%pAA_{9HfFcd!8Td581<4|9Iws4DOYeY>tDYKQ$m|A;;jwI$b^V$MY|9#GT%7hRbB&r@59G%Z8ko1 zEi+yk2j1((N%piDkE%->$N2mjZ{2u|$!OtA!F56ZrF)@!xABu6nP2g#sBHqi}M!; zded+DzXfvuY92d-*EQ`fI1%)-IkUi?lXJkIzZmYN*VlTSeuMvfm$%{ zcufsRKfvptwzLpW`ZZwQY;E5C*ZaIdu0gIwrUsqn*JTz!w`{j;4f=w1fj$&{EqdKQ z0_)2!9GefLZmO3=U1SQZ0OKn4ZeyZNa0brIvQQI@hpfXHZ}$WJY<~UEGJlqdGv`VF zr7^QVYpkFKxg6dH*SXya(-vxSC$b?>Hy@n(#H@m64SZb*SyJ?Xe~WO$rXe{P=uM82l~Xtgsoo zM1#VE@q_VJFavr*2WVTNZH2Lw$5x(MX=bJF6}wkVl~0x5P;NuH%0-ono-KT~@V)qZ zac4L^5PcxJGqN*sJv>hB)a&9_FvmL|tRJXrkyjkHWRE30fR(akx=&qhiA8#J=Kv#lLW3rn7f1fu~YWrCKvf z{2geNX%uKqO|nh0m*pYPbwP#GRmTRBgq3c_1J$=BewNx2WA( z6W<8-q^bSB3g%qqVV}ca(3pAMU11>fqc_C*T0eT`4&Z0n2LEGjr8S9RupBNAUmmUs z_JB5rjiHUfY&iXvu4mTrt<_yhAII19le-tYz7<15uy%hSdLTNoXk<|Z=v3ILa6x=Q z+@6qzusOCl_GR?T=ogVMB3FX@$)3=jptofNox~r4eZz_;=A`Br`o$juAM@YvGpI>f zdo@opR2M;na=AVLp3T}_z z&h*P`;?oMI75o_ck*Q7(#p-~u)MJsy0^i$#$bm@ZaOH3l{2jYFPofPh2mPXp@)iYt zd~2O*9`AZyPA;o75!mJ7y{Mt3)Ka4VZGXFPI|`* zL5*n%=rK^=QsYyzpAY8At`UCkNt_E~ev}V-(&jN2pd~bhO<;cRd$r!bm=$0QZH%P; za}&G*_Ntr*)~Ui6WZkdE!PC$j{QSBy*9CfjbrSbG>%3}B`$GFdp7CBAyjR|YZzA7B zD#8!pAHplZ@3Cj&9GC@ax%Qo^D;ryxFY5EDQ&Oj-2lGn)P5+y|H+667s^nG4&56xS zYO0?2v-r>A1o(bjVqD@pP|lF zr`RUlCOsoFBQqGz&Yqn;C3i~hWw@79fF?p;e6sp>ok7xx+0E7zc0m@bf0)l%3o*~@ z41Gb*lJU}B_z+Hk*3bp+ghtRCT<6qVj9UxA*FrCWIl)5s7UG;UGWF=xV3w+L!qkoW z!tcz|C}0MVo`J?-TwDNpi=P5>6zfZ_NmcP(Eu~NTMP?;z<=nuX%*A!Fwgz`;;iZK) zgR@Xt!V{p+@^PpS-QwNioxpR(zk?A{vD8qvYw!Qq!;FU4k;n_cdF z_`C4$LjRas!Jd}h(caP5Bdfs|dp6LMUMf#i00CP%f$@Rg#z}nMvcoK|p)X&X9 z=ffT_Uhy@uM?=r6eUavZ_Oqz}TmX|npNKQO>{0PLwNCvPv87&1y_ePkKH^+3*ZFI~ zcuD=qoYA;x0jz~;oE6;@T+e)7Uk9(T`yrAS$$PHMbAhkL=k;OcfVyV5Kg>_fPkDYy z)8eMZJrDFeFlq0kz0bi^XtS@)zW&gBfAjtA4zxRP<-sctPB}E?(7A`tJ^XC(v&Hu$ z?n!h^c1)g`Ix{$Tu3NfWpn+$2`<}U$uQAJ^RY|KL7JY#EGw!{{mag}~J;^!ZNI7M` z0qfi5ar)ZTow`$VX$K=g9ozM$Hhr}J`u)_FT7&+hm7u1r{xA>J zySvc8fSec1JL$tr>TG^CzdL7m+y}-+z34+X{?aep5d2=Xs6U`6R2166d;-_AH$iRb zB+xhG?>1h06!vq5Tx8{1*wB~37m{q9NmeeodY5}wbjcR#j9XKbW? z;I(HTy83*3(AR6tL63|v`pMvICYIyiV;*`ihs;<=ZDj)9K(Fzx@DjWXkAb!EIA^x1 z!K{b>(U0Nxs5M!;RzEi;w6^d-=z-8#k+ULmmBpnA7@7_?7Tqp}#_N;9M|gGp6>nzZUFGaX;4&@7k<} z@(yeOYZU7DPs4BcMw;Vg*DFvA_W7R$>O@a-_Q~}?`J?1a`evU_J)LS%+@g3r*l)WB z?AvORYLXh09uv&_shg=A%!#`qdj-nxX+dv@wUT;x3)tpL4p9-hwB*u~UF7t>{mG2W zI-CQg9`5t$dSZTNPTT|3!aoIHBV*RpFa^JppIa;42>$)*(dOAj)Z)~RCUOSVx9|q2 z>8LMQ%kK^9DQZ!E-M!~#Fm|rNEPx0YBRvS)KrPDrz8Kv1tQqU0u}*A0JcgdkKVT`o zu?k}mv zS$(53qce{(dv9ZEBPaDXOBn~LCrwUGPECS0p%LgE7?2u(T0SJzJl#A!5u8=fiy6B= z!ZKzIoWsmMeF?@#w}X5At<0|REK=_cV_EAu=JeL5lg!&y^Sukc2KV|~z{g=N2}ahZ7t52 zX#-fd)9a*X$o^sDtlBV({*w=33;28N|50yJ=eAa@)?^H)_N9+p-vgz~JbPIxLr=T| z>tH0@4QoLU)C1reJPqtGeFQdxx)m)2LEpBose90La4k2+yo+=E7Nr-ZkB64<59evU zk$oe3BRs_n(HfjP+LOA&I&l9~!!pk@*0Pp-8fR?i9b9>=kJC7QH~a*nVIuhc3-Due z0^@q`Y2$fwLj8woVXlSd3l|*Y3VP7=AskQt!gtKMuZ(Y6udJ`bg7AWH+i2V9Veo9r z8K9Trvck&>uZBxN4{dum6h9On0L~h4MwPw1&Pp-vX$!leyKok+i8h3LBlkw0hP~mv zVc${+sb@fUW%%U;Qwui0-90zJoJ0d$Go=@H{)-O17uwSHKWKwui z`0dc!q4zmw$0GS9WiKhaf!^vv)EJB%GeN+?A ztx8)3^*8qmUw8M1e&GLauZ*4q{Y=Jt`W>2pajff^F+vi|#j(-{a|zU!(xCoi+~{Lf zM>l5jwf1_{$F}0giXgtgo*S%T?vd^R>7(gDXR=nKZ_c=V2>ZM|5nL;a~97=!sWYw9P0 z_0^A|C)@{q+y=&i`ib|18jHSFXJdPxj0V5%Ui>|0`!o+V4_zF-IGl(iBF03Az#d9x z5VVW8W76)`@&2$2oNK8buIK-FSRGp(`z88I;7c=(`a1G;q%xcWqp1HKVrFZy}tC9{(+xK&$n@v^-O!rTyH<&Tn4p;TA&uCXW|adQ@;)@=^TQ^a2NO@ zdr!R&`bNy#)VRONev|!-eyvW4P6^K+@?7f~;Jl93sn)55>4oXena-KZU?;TYOtf7v zCpRY-DhZXW&aKXITb7t(SPxwa&%;+xhx5f<`-b5U9}hdB8}m!@!I;VCxGMfpYZv;~ z|J!S3a6Xaw_gdz$`~Bu!pF;}Nnr5RhsQ;D)<4pg(5B+Ub@$Q((>68U(=_icJLK5QLPD_PpyEGT&6tC zOwCN~0k5Bm%&f6?=Dv3mQ;79Z_?)+eGjeC-7G@V_YvpR?-psz4T?5DGj?WE-E1@;G z_RWH-B~^o%>1Jm3c&%R#uGb?$PmJsJUe5i{Lp%$N6YZn;5zIwT#*=5iqTU_-i{69Q z$ZCOc%StPeXE&AD(m0cG2 zn2evE1$_#xFRqDxY>=#W?Rsz}_}sb%xhARKT@U`=INVFG&0X{Xs9&f%sZBMf|HQm? zF8CV04*IsO0ZfJ~P_leYcY^!+P|$186t8-Uv*~s~Z+d%w!^7>~)X>OnRe9+{qbmE$F=-ml~J)3Y;+!XYkq^&@^}uAHm9`y$O#OA7%!j-~L zMxKmxh;@j~E0|YMDPAf5CUhw5P&gK*!er^WM7XI4E=t!^gu zcXiZXU=A3&nmbshR`YQkcfGF%t~u&K=6!d-09XU>!79+(WXyFgzSWv=Co~3it{=d) zOE1%D;P+UA8V0UoCoylNCiwr>!k6icDQk6li|(c;#>Z*hwFZ97*TBBz99pzm(F^b# zd`h}$n zORvVQU6d`#u1T*6W-ZN4&P{fJ;fdi16K?149z1;T@QuYc7H@`8&?wO;aW;Gn=O@n( z&J-V*8ko8b`lS1CGQsHdMi`nI$|UOVf-^rh;N@JJUYeekn3kvl{+w~zi1dhbTl^-y zvc0k|g_%cm-O4U;j1#*I;h%!_3cVl176Q3;#RVg#h+7u(yKHD ztozl3@2G!U`+1%7Hq8&0gF%=6^bf$_XD;crS~AW=4nH~;$cQG%r~0v`rVGclZN2aviz^w$V4S8uUO91wD7(8_i%UsDpU#TPORGxk<~y%feCK?ugwHv*)oK z=wnL5&9EBue|y%Vex}Ewk40~e-5fl=^O%QsE<7H2JTe}7hkJ*OYcGKW#hDMm7}Yw6 zv35_W2-o20Fpm73xuIX-<@G+Z)?)4QY|!iTI|{asUyql1w>q%7l6jdil56%0pax>D zwHD@qxz;536I@ruGaIow=z}z8dl1aKz6A3+eW%xgIoXe#SJw=d(%B!SWPmEpntZ%ZLHbRxzR*eb8^-LUB9e>e#|VpO4L-X;ThN7 z1l~*fo_rlD;A2ulat-(eTwA=yegOS%?I8_Q!Fro9r8PYLD=&eyxa&Dnz&RM7(68n9 zT00Kqg@Rcpw|V|CRD?S4JhTBdr8DWlQj2+l`9|&o)@-a<>LoMAtO?eDrlh6>y(VuZ z-(p3Yn>-O#B~~Q{!41#_UIXX8cy8}5cqa8s$}v5eLCr{g#dt-X`)2TdH6AhkxfS+-x_8krYT`|@)}}|rHA!9R zZg4FqfRW5PF)vcHegT|?v=wdw;dL;#;!5X1#9`s8O|`houVK z4c>!Qp#fYAB}YpFO=;NCVL`k3Cb%{mAG;^?0sF&m2JabTTJ_ndKy4&Tebai8`@VDG^tb5G=>X<-YA?+oSDND_ zy%z$1#uO^vM5t(tHeho}48t#(4{15*Y7B;WqrZ4e9MR9yYd8H&=VK zUTfai2;KmF2|K~-trNJOt%ttgIu}Q$djcjyIq>{-pZs#P7V7R(pUeGOzb+$mVDBU2prtxuCADPSpX7MNYtBUKjS`KX(mW3eI*q zL_et-l%Kx`pTg5%40RQJ2Ty^uh!SvJ{)cG<-@(sd?DP(}E{%gJ@De-)>LX2{GPqWm z^IZfpp%99|-W0W6J(ku*ehL2)K2&fh@L8+jToAh;wv<`_!y>~XdZ@n*eH$81Prh1l zYd}6I+n;mX-S;j4^@WDuHFX+Tr_p;a=g+_CTG?9JQILR*xsAEr%=nFfF`F8>>z(M$v>xkvrw7vd zeqB&YY6hR+|8^~Le=85hQLSJJs3Y7A_Evof4d|EF)AJtZ9a%$G>$JwBo~TA;&iocw z(^ALq`mzuGBWOln-rJyN^$_zZtnKb$M(Xw1>$8i~i_>qX-cJ1w?Bi_-cfrqzpM%*0 zCnrzF<#biDDLf3ngY$WJKx_P#?xp(G)@IgbR^mq+nj4zC7F+|pCiQf{e@OPNY{SEJeYl^v=I#L!+!4tKRvk=UI)-n&^doWk50hfaHI@i1w z;CuJt3a}jB2VqdIJ ztXI~9Q^9@4*!o&f3kidJyxNlf%T>%$8VlA^Zh$-BAo%abNNP{|=**4n{hbe6;Yqj! zjDL+0^kjAhV+K7_Z_$5lt?g&146oy(^cpXOD>7GP4kr#L{(^q zf;9!ZW4nXi77a<8Vw*UDsdemn=o;-Bc$NNTPSc9eieTRRV@zSbmR?G0unWPM-ZyJ3 zy+I$E{iJWflQ0_kz%;z8#slU#eSu{G#cWH^$8!fYoC^5cdjYaX;Gg^gkA(5lMfT2u z>)9ImS7w0wu(642xUq@ep{1}L8sq=EnlqfN)t7`z!c(JDqd!J|}%W#uCYx)FM+X=v5~o!(5ZvkbVl)rB9a zy_iRiDKjSMr83^P{_Nv_mA;z$@j1TAnd|!brZAi7-t@icw^DDV9Hu)AT#Gs+Is~4| zI*B@ohoO41deF~epNhS|&PI3+tToI@&q>$I)XUU{6>whmyr6fk4f8W2rIA2$P_MJc z=y)(*G%ob|x2~*C=rwURsG0o&IrxNg-WJ2}U|)YPa9=M3HRETP<6*sXL~cZGVs>Ko z#N3Iw=c&Eki#E_6-;O%oqwomxVjh6y(2;(B<80%VYRp+OuKEW`@=Jo*DSgQm%QM5t zwW}gr0eZtff;wP+pkA&g+}u%}=_MF_tdFl5xuN+(JI?9cRCZI)!=lf?@Av=F7pe~L z_o%)2`x=64sqvHdt-6z5P75W!G4nD9YDMOgL*TW%*8&fMd7aOZUQYKX<1oDkBf#s| z=kRoR6nf%aSj!xgu3%kv1uO>FE}wgKPkjxKa&DBqL}!ht@yv_N<1~Sr1N~|@zG~|V z#ykC?IvA_n$N3S~Rvy4>=X3tik&l9!o!Z7&`q9;U3dpzbU|!tioVosI^v~#^*r3=W zu=W`0W%jC!0zCqrFLx7Ycq@t(#lDDs5$y?Q!|cfH$Q$7|!fl~ARQ&&E8XNm=1M_HK z-)pEnyq)*9QhA=agSxGnuAUzMM*Gb603mST^SXwalJDYY`U{=|d+4q@hWV;B_MG=^*i)|H&A+Y26m=724rq(Ad_9sxf$PHG7M zGGk7UK>O16LHubyu6bLS9+4M7Ezh1k#~J$rRI^KQlWsyPW>xw}8vPx?;#z9-|Vmq1^x``$%h9{fG} zuUdrrt+l%S&=IeX-kZz7JzxK_d%gFQb)@TG-)<)u13o76tGdhpFNA&IW7`hC9%(S1x93RB zzcKY@AJc5`ah=8)XXajmnWNSjPK2|d6||)XP@PhLWQ%x<_@1IYMcbe$ykGc!;Umy1 z-Yfob!N&#P#=Z@DJr_n7Mt_R@6qx~6z-7<`+-r=(o`nIS0Uoy z4D=RQ^H+CLk5aQTKH9}B0`*ka4cCxM;7!gg*bn1jB$UlBn?Hyd{N8`>fNSV#>Y*{*E2h>2!GmMMv?ecvS(4Va)@;Z2rZHF^JFPztjbs+aA zYrUd3+!~qJjeWxI{UU?|i_M+fkAIz{AUS@c3cFJ`6q|{@-fN#N?)VZ9YV%^>P z;$QflBS#}gcT%4>?r979^9I4wVD9C3uWS^7px3{tmQpm3BSS^+@GV<i0b! zjNjKYqtKd%b4iS~)f=n9B`^d}(hg=b85`)qdKL)RkNWo-EBTrm4~+pz(x@({9@XPi zo>{#5HJ9OaGHyBw#?xLW)-b)-?SoQp>JQ_=``)_Vo3I4Ffi<9y(T_LdS5ccAL~r5s zAO#9W*DDXK|NmdEw4}6jQ zBKbh-fmAFVOK*bdoHbKDTb+pmt+RDbfIme-3OEOnQDU`_E3NWe#BKPuY^j6qyKa%eZ7K?8c;^s02p?-F>jjYWpR-_(VT zi(D68qPDP-na*`N<6}d1L*NN@pR=~E{_z?fs2ID9s1Hl@GG1Dp- z4&~u4uzqkV7zbEy@;>u9`T(ATrC@A%0~qtW_Giju%Dj^IO5o|#cUw}XgzD7i!J4No zR|Mt))@8hwT+{ULsArlN#%M}&4SNvo0kvV*Hhn%bAk5pk*t*#15aZ0;s&uan3J(g8 z4~-}4EFbdmrZ|`LN3hN~2h5|UalTD=wCbNDKS!Fyn#I($6|*ldyxj6a;qLhEc<;jA zg{$MM13%OH`1<%ga5?lU=vB}GjHR6GG!Zs4XUP5OP8fxsX?qV{qN@*Fbn$<@aNT^ z?BiWXE#272SgU|$8*@ivC}*{qE2_;*geQ+Y8EEt|`gQdo_;aT-3-2Vbe%gpLCr<^Kb`)aihQAeQPcp z2G?`<|AwiCsf)qcy8YmK*qYdySPspT&6EDEr@>#zzmkJfgH!d>_0tQWJbL=aaAx+* zY$Lc2igHD{MerHtw)nbPN6TwdnIzNAp@XpK+#~nm`lK zcWvHef5@q!Q-iY&JI6Z5_^*l{2m7Qdf#a?HFEb#_deGbV<-17wE@>2_pp&r4qTgElid57 zfWA!o8q|figY_Z%A>70LTutR6dhtKQS8gA$*S;FYaPS@~0qf(=3Hl7wkgezFVX@x% zYv|X|-OTSE7#$eY>eA6P)wcQ3%Rz1Mi@Y!LUS_U?dYzy9Gez_X{RFRb#>)_x9-6MS z6`X-HjNa{LptflKttMHWb0@ko=W^&V+*_=DRHc8<2V*_^WKiQ%pEb{4N}ok->e~7< z&Zi$kZC5=|-;Q;Fg~xE;e;Leg^evhjn*Xe&2ilzIh9fr|IgI&O&yexu3NY5vQ>6B6 zO;l|~f5H~#p^V0#t-r~9!?nbC$~DM%3#;)W zy$tr3+yKTwYU9=q&V#Gredq^1S@sN1fVt2TJ_YvyH9hM%er_yx3%Ev^OPp!v3tdrN zOS+a+$yLeek=V+NCC_+zC;3itBe)h_3tPbRoz8;QP%c?6SrPtC{F`vi(u2_jj!Pex zj^p1u#F^rcW*!aZH2swQDcdjCkBM3nf;Co8{$X&9GAEu4#?9soFM=AtVldb9Z#Q0X zUD9i*hT{G1x@62@-uf)`$?p^7V8$crI>s;NYUXWsf!g5)aNqQMXToYY3}fI_@OsyO zq&8jzYpCyc12txAv(^{8g6r(#C6AZ5=NR)g$N#e&%!$1JjmgZ@+>5QP8T;ge*S__B zeR%phjlo8PUW(1&-|X7=IOu6`-7^OCz52Vp@!RR8F_$a{u9Xu(eXKdOf%~BcxP~Xe z80&ewB%7cw^Y8RYsk58^FM*k0Eag3C4bZ)-v`lH4Q>m%=+*`9Up0%c13(UQSf}Yru znFrj76=37~lHbPtBVe%mq?sy9e|ve*r8}!QW}#YhLmO7!&b3L5d^57cy&*~4OuQz zF7t8v<8%rKP4tbXja__99*^HSGif2KQg<*mci#wY9ob{Rc(yXlu!7n_lrkz1Ty zob8B5<>Bt@2Pr59bgwOj9U0J&@I1P{tRZDUkEGVGkp3tg6o3&NIp$k z>i^H+uj~tJ%B%@`o!!6n;;dj+(|%skhBz-~F>>|`htU**^7K$2iQ%KTNRX|^gy0+Sjd$h5Y_py4Env3!L zSTM(#0^TobFXKQjfx4KQzpu@c;U~kdMqZ7m71_(X8#=~2#-D;YU@wa2^ICYU8?PJh zQ_!cNT)bT1WBMreQEX;(W^_+vPvkf-Ued#%XN&S<$@JXx+*vS`Uj5$i9kubdsVjO< zTPxdLy1R54`bY~fC;Eo-Nc3B|M|!WTp%|N-4eH}9;RzTFt^<03)PdT88j%{d`;__L z=k)CV4n4r{J)c=`u5o%&t$q3XjAx8Z)!avbe}{jUKWD6^-t#fICi#2)n-+k1lE2q_ zf-%&&+c z@bP^Z{V@7^?Dg2T=(cD&lIDbn(}J^}z5dNJeBP~Rr1R5(p3;IkwRwQ|wB9@S#E;8- z99+xB`Nmtf0qIiU)3h$5uVoZ{K~Yd6?ZAwu^GePushX>r`!@4!<`?Gdsx=MeEZzdR zEOA+44yY~N4VNY^b=+yAZA?Q*{5ajD}{b3yMw7tSnr1kT8uk-0y6f3`8RvTDQ4 zaCgbwCAWe#4X<1G2fg^+LA_}>HRJ~Pu`U2>-^SDX%Iqt13p2CBFbn=i?}_)R_wirg z{cbR#E`1T`D=^mAk25}hd{8SpkvRkdVJkk%6Yw1w&#MJZhG(Ems7&Bdn#pX-C&1^~ zIO}0h_qhY~6Zr4%;YsQMOF=I{eP{`;LHY)+WCre6%ud?K%+ht)b=gQRl3Sl$pVea@ zqE7DK>piS4XbsDpz%}|&>SbOJ`e?U;af~`lJ!Ywx!x-y)3_ecRvjy~}s^_|{S+7)g zY6w%nI+<&{AM3N73S&WSr5hN38o$lOV=@oSWqgjSf_bHD-kGqQIR-V*OszxwSI<KnYS{~FYS@A7GX_WABOkI(`b$MC@(y+FsQSu$yj%Hy)ce>9Mr7`!bz}zd2hSH zyj49l48~PULCwVXTfzRp8t@EU3eGaHHZTgT6`Tuyfx44%#AN2|P5|qHKQh<(1RPRZ zP^o?cy$NdNkHhU?EY}6}SKbIuz%QUr({=BDXa&xmQ1>?Xv>#<6xbL`L8e{3JbPZGU zcl|OJc2CM2$s93ua`qeH(vfPM7pmBy#%+9DgZ>nImAJKnobPL9*6I_p2BwzZBG)2U zIbAtD3HCtaY~yUrT+Q4s*4WqK>AK8)csToTa8|*$S;&2x>qwv7nVffHTxwoy zd}++=`~)9^{v7iFX9S%^ZLS(D0=3`~@D!*ie+VbTiQxM1515act99e7poicL_yFdC zZ{~JC!uz53gI<&~IXAN!TnOW!Iy?=2d^RlP9L;~=e$Ihf5LysABYZ|UKa?M88g3eP zM$p)DW6LcoT2}OB;g^LMLJ!b)T2dosZUwg8wP%S1zd8B4fM3X2G)_>b1Fh57>Jj)kQ#l0UJv~b-@*v^7tAB4 zf!h6EdJ#VXy(8VqbPN1(&G62t0n8^avu!r{i)Ki`Wb02HY#!c=+6G6Sz8ho0%t#x?!{nqpztIG`z4G!JG87u05 zV`5`sgl7d$#Gi=QEUa00I&6t=iMK9nUHDJ@pFjh@Iev4z0!%2FfD7~cz*kU*`Ek8q zYjkV$@5tXw;%ypvkn_CU-(TkJ3jN^Dm1xF%{p0BcbzfeeS)VySdp;eY3xoNq=Q6K; zE?iV{QOV)l;atO#hT4k)%{sp{zjQvcBaf%{e-P{+96<$tEU2~J3@gFs)A&+-Ngu+A z;MZLbjB)gKy9O*hveZ=Q$Sr8@_M!EGN}zw$zt45SI@n(jJsLe~%;q}c*ZyHnwLfFr zq%LoMrJiI>(KSGg&>CYuNP@5RlidFNT>-z zm`i;*7z5}lRA(8?Of$79V^!CwTe7!gTV`5jZcpEywg;|TvRm@X#FdGS;8`j)!MVIu z;W^+K3%;XUaxdHq#!kc2!vp{6(#+D#OYnI1aVo^y$nuJ_TXI`+rz1t>=rBLigZn?uMluHK3ul9Ch_R5` zv@wr*j5?@VlJ%j>!CIL5_9)m1`Z=$HyWuUk9bRNkhgzU9me19nV0^U(vhWAI0kgp# z;gi7H+csw4>*4GK_P7|k81GDnn?U{1^Qv5XFN2@x3{eZ7k)4r!E%REYZ?7)U~`FbJNwcjKi(dS{nb85$Sh127&kjBg6w%$WgtqkNsO z##>njZ^fs~T~c#Bz`Sp@?j-oy{|e?Au7PU8?@&|M$LaoV>{g7w^DFS{?iJowYEWu9 zv%q@9t>DMzfuh!=H)Jtb8#i9kOXxak%ws!8<#@xny)+;|{R(rE_v$VZ(_U$GQ zBo92X?}>etAOg?qe`fzx2d+9${b2QjOJF7x9xgn5O7ST^9mSr}YwV=g=~{XXqnT)M zR*LJJn)lzizjISLAEE~{uhiw#%X|#hW7WQ{DRWKG-*o|f4@2NX=mQ%;kE^u-y%>Ga ztL^J>Em#4rE9O>hp$)i}v<$a2)yu1wXYAy@f1=o;6px@b;yF4DfmKK9?#SKda)QNuKb zmODst;C+R13Uk4WbRA8)F+|dMoF^8}T>doeMh`o(m>b)j>n8 z^P5~>Uh?dM*z{Nns1Ek0w2!urz7TmKG7$DMo9R6`0Xl^`p-k2fIbYy2JS9!xQuq@s zWDWVV`DssR1@D0O>S34+YCF@YtC^GaqkeNz>ZFuCr0tUJ0uA=J)Nk66Q@xm{-#gPg zvkFFMM+avvo}4>5R}nhHUZ_-3sbmfe1A9=mfL=e>u+zac#=6`R=ID-MR_-a_=VPH9 zsJ*x^{R%#>cY^!*F!~+s>9Th%4A$ftf;yGD;7?#by!o_xq5FvOnCn^t&gk~F-+-sP zh&e>-z_rIcN4-uR(ltdN#U}dSd|p~m8{Pq*!VlDTy{?RH-T>E{0q_z02Ks!}2;7U0 zqxVz)&xK$=`JV8euruFp1AEb@F*mtKtVgVFv~JWrLvM{5v^sqiW+t@Hwa+;h;Dq!E z>C01>r>+8ZaO-fdCSK*_@Ue+oleZ@S;N0FRFey1HIS<|g{ojk=qx47VewlumYk_ni z(+J-{PZ*mU8+e)YJuC!uadTtiee0-R*FLY_Pu6OiGbhA&-~iO6R;iE4y?s8ozjXn9 zj(SM{2l|^1!f$Xb=wEVeQ*Tv^>H&2^bwWQeuSuQAnCMkzid(C5&C_3L3|1Fb!gXMM z*}9!SuXasH7WA&%d#tzj5Pfm>uIM9}ik{=&;Qv>UUl8;_`0-vamU;>FK{W=~+dE-6 zn9tn}EzzrHmYo@#9qSscZghb2eOtjedfryz@36OWb9Qqu?`INc)YQ(_&UVOk2z(`M z-#MRKwG3-E<`3oo>UW2Z96I7&px6FWW=k9Mxc(Rmxn7y`>F+f5@_HBxjlp%x81^L2 zd@_!(N5h{}XWB|X%fArA=VZ;sd)l9|uHnZw9;@f%j^+ZrNln@N$DG4lUhUQT_QlMM z9z&hg9K2JsQ`9<}^Gp;wgV>0q^?djR?ge8a>tJRN&F)|Q!etHP_o)=#R# zOZfWLH0?E4(|r%mt9q!jXU)xwN9;3kE!l++K<|>?h=%YfH7Rv+Yjws<*74qj@8Di| z6rO`ZXax)50aymsub%}!4j%k?=aS1n)C* z=t+rv|R*2!G^9)M1u25M~Hmb2kng1%6{u6Ij)T@Ah;d=0+#&x5n(ji1a%jfu?< zC&5&(r@-swZ)Sg~Io%9bLIqHRu=c(Zeg!oKW2es08@^+vh<}3`+E9Aj%3#P_m0Fd$ z5Y)GwA!`1nS72B1uHspTXC40e(9ef@?C-Jvtbfn?*QT_m;QjsY??3I}X$Pmn^M{{5 z{C4r%#or{pNw}`v!a3y4nS1#cn3&Fm{<;1^9^ZyJ8F~kN9rbi92ECT*BCgrnz}Rpj znAa_bXxV7c3-Kzm%p>`cV7}73%u8!buS9FO5Zc28P@mciy{YH@%lW)rn6tYS#=;Q}B?i@|(OuMOqjU{2Jt_!wG3PjG!w zA8!v^p);OL`${V_7ey`2`0RFO?w?V3M&T&tnJh0@Uhqonm7oV~NOVZ_NoE(_7ru{3 z@P%+)Fs3qhb$uRjjA7)tJwOl6v&Uu@7$;u^?osA_dYP=dsYm__dX(HRJ;T5?Lk;6{ zc!B!3epB-X_Ymt)zD|1i9srBlYOH#Z_4ujncZHuzehzBG&FQD`zG(~tp$QCv^Whvg z06oC_aXjyY3_14TnW$O zg`No6(yS>$Q18AIf49%aD!35Tv8_8+h3+NYOP9n?G?NN9AZZk+C$>6`fjtQBpAA&{TTr!!+%?hUZ-_ep36*Mc$EYw$6smHXaY zQXNlidj+!%%pt8as%QDP*P|!dSnEr8AJp|$f|}q#uqJ2jt&dc%z$4(ba4M)}SB0~| zTua@_8k%)n^+){%YB1ibtw0US+P|7rZM*=+W7dpM#bamvS1r`|>NR*D)UJ%LdO;*F zlJ_@fA?n-H(^T3#u54T~6YL+ghO(<WLOPXB zwN1B87lG$yc29Rtf0FtnRViI5{SPdG(eN*vlRYQ!fj^RcB+%a*8aM2e^&Y|y3aeNldzUv>lv^;yFFVk zS1*|Dm(68!t{at^JLz8D48M)*ll$xrNPzl-_o{oXuTgEd8r)xdg8Hl)n7yv9apoUW z;W2m$yl*}L`}CILQEx?kY$tu)pG7{4+!?zw_8~Yk&Uxu4K<%R1MUx6A72X}cJH7|h zn3}^0Ft%W9FdzKS*q^bp;BM$j53d?*btoSxAE^RM!%M^ZIqrc0V66KfJ~I6qzTW1( z_IH`bnSXfi80*ys`(sCe`Row1GGB*jk!g`7(Ivq=gO4H~MO^#734Ie%YcyVO0UM}U zoB&>@o#5@GZ&SUG9c|9ED|>NTqUo-ozxOpLi-EVeq&PVHDOMUQoyi%N##1}tJ}_P~ zj@k^a|6NMDlym^^8)KmsFamyn4><$jTUZC}p&R@SXVK$l{VogsU&c|!Q^s|#LT7L- z8w%Db%)Ncx?T=}Jm%-OfT}%Igd7(Zp*Cf3U=g{|kFPP6i4&%W3U1v~-SCh1tK>bN= zO6}4$%UX>0FgA^#pSLZV=++}!j~Exen0qmIYxdTxHU5sNj;U42Rmpb}?*wPgeN_BW z@fi3L^jP+TX`tS1fA99h_C$qbh2+!lJ-9Y?NOuT4R)aXlZZzBiJJLJo#``vXP3oGI z-h(Qj@4zz*9>zaaJySh1o%85Ur1!QH_&T^h>FFrsTp{bv^Ef*t1@@QD0CP0;m1UrB zK)<0HLOc}b1g1*^-_vs30>(yqpvuA=cm<5(t&I%} zDRr!;pcb4BYDmUZ{_bRc61VIR`F?J!r8m>ua2C{IPU3OQBfk&yH0^>~VC~)WGsaMi<(AZXgVl*$BM~GUs7d;u~Igf)m`jxROW2>X9 zqkAKJBXwa~cv>(wSnbTXj&g3$$6_Ahp7bghi@J_^-Fyb>6~+n1P_8Y;GRE-6?OnhE zlJWjXP-`{Dy${q$)P${rPY3Uz+MFFS4R4|Qy7$q^;G7A+$Nch9&OkITo)nrCS{_~= z*5|z&&W)YxEgW-xoM)lvar!FuRctOS1!uPWN&oMsaFjyfqi_R+gcr*y=cbXm-8T1nhMqp?^$(k_fFSrbFBif z$12G=bI-tYU=QFAuo{Y?LP-TqhC8vuuUp^y9kxQ}lFlW0xx8E<%+AivzLI$*Q!ZUD z?KjnfYQ@z!iD*l)Jr}>hpwysLlXR2xV$PLnpKYK0EAv-ymS;Mf&bG_7gTA$J*qkm)>SgTW$!oAH2D9;7gnD?)mj2>@eCwo);-bt_!R=~&b z0}RL;khg)^yKvEDNN^9b?qTk34sXn54)5%RJ@lq}y-fkHxiz5fvk~0yf*zD3c}K3LZ{*J0 zow?Pi)u{!^1xdBuWpGpaCMFBEN%zn6=akz-rWZ3uFUVcM>CX!}*?Apq#_75DIhX5e zP}?{J_M;k8En{ApHKG&1b!`Ci6j$RLG#*yFb?y5O%rh){)uyM=oON1sTJ+)A!?BkO zUM{#Oeo_2K@Vq&N=!M|v%_ z(#(m({)XsiTR%WP@}=;aRsO) zScj=k|5QiVi_YoSDR%_D1oj%}J=bFrFNv4D$t>^R(!T}s2AplOII%dv$oRys#lIG( zUjWhL_8Ozm5*9zjelhP-p%R@4g%IFa8+OvoS0K3P# z$0rv|E_ev+m$FxC4(A-4L}b;Sy5eonE5BF1`Ky1E|DW;MX7r!4!5W@1)k|PZ|2e&1 zIZ)G3_q8r<&HGodj->Wd2ReZFjJb)qhPslkw`-a8t^)i%<~_b%*M+VNZQx8RU3xdD%e_f|1e*! zLTQE433w?l1vQQ&s4q2#uX11EPHd68Gka(D&E%WOmBlNI+b7y5MuB~+^HTFtbJKIv z6EhP7?P_FpWcF%!8Sc*Aol8TNk}AQu=st#8pyzQ2xE>iFTfg)5t%C30b!afShNz{u z=9sG)GtB1v0{0SU7N}po4%SZ8QuL_g%H)F1gGQWR*dJDd{jcYM8mP6aj?fLv6K;nA zp!Tu@E&})c{dimS9a!J>`BHm0lV05Vnfk$;%d=8vr3NJjC8s8)Ch8~aC)M({!5zsv zlH;Kl6s8J;nUi=@LFs6XUa0|Ew=^b7TJ>f3!elkA!iCKll?bh*j!FNy>57hR&?NquB z++8=fBS9t9PR^Sq%YwmuxG?U6Yi&K6Xsltz}U*4sQ`2EX+OfbPiKH{ zcfe=#n5b)6Lo|k~$!r2+DDzLkc>cPdnEKZs(3aG?TyOe=3*O!E-(#weuhKe&nzk{c zk8@X#u)o`y$<^trm66g*@v?1! z#q>T6%njtE!PkO(<_6}!rkL+z4DV~;weSJ+JMN9%8y(7d-(#4wc_GY<&y0@+W2R5Q z^HaWrVeogs-@!UXi*mtnaC_|b*s|!dz*njEb0wG~J`egy+QByFH0@_rjsBAqJ&J0J zYv_qIzf~)A9sZO$xVeXZUvmNTJG~Q6KnpNVs>M8i{YPKJWt?5?dTd_12V9fyhL<>l z&pg+}Uto1l!F=wi{cB&(_r>Eba zGhTZgo(AK<PumYEsU-}Jm0 z51I3|17m#mzMna}XFg|hE-zUg%=m1@I zE^!=@QN_e2;HhI`T%Y8#P&-vS)im8S=%sr(^K#~L=m3kdi|EQ&pZzuWYcS*UdHU#_ zQKzp`pN!gtdYWDt;~q80ljvoB1xz}5%Tf0A3#5ZyP zhBL`m51iME@wDF5HsC$)?=s$a5!|CchG}pK{cSzrJ9rmX0IhU^Py5Tzm!S&b3gQ3s zDE*cb!CKsQcpXNBMg-?V`8)J*TE{cyQWJd$&I+9s_^$ljcfn1d_G%2(fL>i|ipEUq z;R7%iREzT8eGaVWwFULGWz1W75zI^b!#Hs7X$?<64H&_kxW}M9?4&cGHXh3)-FAAQ zT<5HDehd3Sec&lDR~$;MSD!+kSf5zMf{Fzf#V(37V-R=xmU2J3MTL20BkvM#(XJO;YM zF3#z)uDX|A%l_~vGx}u)0zAEyUfY$%duXk&f+!V8odF$Z%?5b zGY9rUmAoo>dc%wxywBXTr-OB=d0;)r{M9&PDEtcU!)w9);R#S9d4riWx8afU8tTYA z67{)_*^SvGwVUJNLa3RlnQEMD%*3XSoN&U~D9qb!kZcfq?B~wL+YN0}ZGzd~{nPz} z^G~KQ7qe5gQ_wTEpR?r_qDfp(@_)FOxHj9v;PtA9Uj0?y!zO07Skv~}=@#o2`#1h? zaIV-b@mu2h?-s=t#V&)z(Z$hM=>z={9)mlJ$m z4#%5x09^OXi`1N~r+o!iG4tEk#+*!D$y%MSnV)wjw|kP>oBjXBU0w3JO~Id`Y#f~B>%W&dTIQ%ezb2q|*c2XOCdy=b zy}afh&pe*--tZc7F2y2PkXn%13!h~^%W&(IyvJFCYW|<+f1ZC$_?ob5;vD*@op7ScTDndj8+_4@oc zuRqS{>5S+3eD3?Y-q-uO?w}XD6h^}H!{>*shg<;H!DP;>cn9>C=xz0NJ`ap#-51q0 z)$Q~yTR+f;XuVGFme|YTbLHP(6|B*lr+$R5+SQrwr!4UdAoFg{nt5*xr6pH#ZE8oK-COt4?m&y6`&fbqZm ze%2P^*?4vzo}(?PEp)=gQ+g`xoAbQO>V?${zdQQf(Zz*}gPPq(g&zg_l3tA=&^6gL z>AYRnDbJs2kZzF9=kSXu@EzQfy$7XeXBPQ|3GUAnyEnKd>*@Czeu6$jV@UG|^%3g> z)*bad90F_Z=1=BU-si5l#uiiIb5PGQKlq-R|E?`Rg7Jm__84FdA0FSnwKm!@Ghg z=>a&LcR25JIGuCNeZ0AATc`!bU&G)}@c&H!V=nVZwf7p#@O2HX--Yv9eun-O~i`-S?2j6GMDSy{&T%{qpj zjUCkG^;D_H4~D*A9#Ftp3gTR@+U{UWX##U;go-(B6`_{Mzq2C%oN3K(yxP4|FP zpaYD8IH=Q^!z_Y6V6NK&jK%yp#x1=-J=R+1=g^He@a(6NhMQ!2+dZ>M!{s3oBn9~ge zH4Sr5?-@NjZ9pyUFR-qqMy7Ur7H1C3FEc;rm%Er5+h4%A__+AWf|Uhl!M6Nu`8A;x zc($$A_qT99w28I}?wux)CXv^|uZ6FK)uGjNr_2o<1@p3w;JSg`EiVoIp#_WrH41g^ z{qPXyuc)P)UmBOafOqe4y!a_lx6>EqI`$R(0wIJoYzY^C2xz4BTh%nas7Jjz*Ct-$M|E}RdA#|nc!Z`W<(La&$Zuo3Tx&(#803VJh* z%U96H;Cth?Wz6sLI#g3PCeYLH2!7n9*`?W=GB;&rq-Ugi;?bU%oS3W)1B(V0Md6OZ zI|>)VmoN!F07}`x%mKC}Egwcgj#+}?Y`yw19;_lLf#+rfO(y?Z~H_e_SHL56G^5&D5%r}1FjP0#j^oSl>e*KGAGy_o8u%c*TH$}P&7hevbKTpIs~wQ+NB z<8ma#;5=&^7l5&yYm#e~@3%0!tsP!Xb$Zt)=jECw`n&!N>Nn7Hp0bBKOa?;rCP zwN_&as&O79Ei zubVR*L}Qx|e^HOKrhVwxp<~v*{Tsd4T~FQtJx$it)o!xXgpKd@Af5$k+r~x44#xil z(6_j6@&4TYz(-*W;^!ZNG0&6Cqm6)G8*|)iVM}gH?oqgdvz_jOws1F0&P~oufhKsA ze9W(aj8>vnWqs4!cQzPXEdh0O_xlv*bE-w{5$2b>u9{cct9L1wkDm>$kM1?j-7+`*2HoH9pyQ&ww+*+k$61ttwg-=-*S5Q)x65O?IbV(FdsFSH@{aWaNTbJ#!#*?CxY>Sd*5OD z6K2CR;JQ*wt=v8SI_8VjgNe+Ab04;^(RIcel(B%ZliI>T@H#T?HSS(QFQnJ5xx}sT zB3PqZ4Bi_pp(B_NS-bv{GuEtGxCcK-4f6fG_wz>Lt3H?WF?UI9S8QW^V|*QqPK-`e z0ee*T#r6efgx8JMjat`Lb2Il^OD)LfE)Vb5S+E0)OU-o;fw8JNt6HD_3fFDd@Yi7? z_&S->J;>~=sbH} zdmid1>nCqX-IBTw)HSb6Uzz>`CNkUO;_Su247sVy&@6@7@D%Wxe2+PN#vjI`YK3|~ zpJU%L-hY%cK&+473*O7uF^AYbl-ZC+4@eA*J*@X50($^f&(Tk)S?iY+!8eb7p>Tj8K``E2sU7dXo3^ zT5w%E5!40#i&w4NnOj2n#X_QG&AoVb4lYnpHFk@sZ1VN0UsqkO3bP_tKzN`cAc;mey#LtCEA`UJ`EO# z+e78@mCK(|?u>Fh%JwL`y-@x!shv4PQn(Z`rG(J|aHd^>%U z=I6d{#@@!9u2Buayv|(MISjMF*(b(^dL@hrHS4*bUJiN;t@}O%{5Pim$Bx}ma!1LQ z;w?d6$j^A--Gh%(qgxF6lOBT$z`C6M7Z1}*xDS@W9C#M=EzJYtDIcewNzV}>XAn;{ z;4IPe!0)>Y68OPf!>s%HwX)1ud8_!X;;Zq@TCaAGuzrZ`CCI6b>F$Tx^naZMPjGgx z@zaIOjB@?c193HU2Xk&?DqpuEC}nFzAnv5nw7YITWjz-_3u+#^>0)k)w5ww!BWs8 z?KPaBH%+bPO=yY^9fxLc7u16@K}~r-tbvo6eOmzv;o9)E;gQTKIRw){-MTM+mrG$V zq(B{G5v*qkf{Sbl<9lKZ>0H?J$>RO@MK zyUu*IchlZ~eT80s>I2@3UXQLfOY!-7KU$yoo|(1Ylm35Wr}N=-@LJx9pVB^fHKo%* zkL7%53u?9I@V>bo8>862ALh;ZZqAAO464Pe#b?7xAcTv5pZGqp5Gc*WBZ){tUxDX^ z2i{B03cACi)N!)>*jaB;LPA)-we|L z{0r3LjGwMxkI5XksQ9Adk6-|}Zd^jIvYNK_diC(P;3Tl$%p4#BJ{Ma-ooxe{-|7+Y z{#0-JiO9*XyB-+JR0eZHwd-~;2<)#TJPGtAdlvma>QAnP#$&g_CE$MNeLNV^*-6DnX1hb8e5^9{4xB7k&u+5VC+gFK-^F$DSPYz3X>22l84spLhjs z2lr2FEXIC%jh@dwpRJs!ocSpAQK}Z`2XJ;J(pKSCSPGu$Gy%F6buHQsi=Z?T)nz{9$eA-MNCk zP@jWJU~kS1U_G`17#|X9m2#gS4tjIc4b+fpz;aM$`2qBPyKbpdyH;82YKdp*f1t;% z0cVBZ53}HOs137WB=mp<=&kmrJO?+y9C+hJqi@ z1LL_X!SCaGYHjRc=m*w9mt~d(-mgQMLz(LI4X%NOu(fz=@dxzqTQ_+N{s!Z$U-16j zOdq8E5qE-d*I9UQtiQTesgWCFT8C8Qvc_#5?CWieV66EwxaNIIz0EaWAHrwooHM|f z$XUlnnZct^#hyjikmaD?z*wjnXJG6&zT@~;pk}ELuOnDbRU=j#)<@~@{ROzV>_4_Y zm=k17={?qs^XTkVIE^#itw;6`_YYsk>=VzBGf#^pVnj?IB{b!ChK6tg^aQ<^A47kz zr`Nd1nQ`%Q@pA7~e6QjI6&|Rtyxj6~4a+txdqKek1+n~CzV(qFu^ut=!{L$Pk*49M z!CZ-rXyeo9D{2VyIM3SWsW(0ElkkDh0OxzCA^wl^C0!#{(SvIoqFxd`77g?Wb)J9V zW+($4zzVP((Qw2Sty8@umOI&-JX_1MZRLaBILg+xnW< zpne7O3h&!J%s2cU)G5?7%&XNe)Gn;&c%8k#+~Mk}>Z#WXUn^{SwCT}CM;aZu2BNUy z@QTAn;LRg%9(fDSJ$mlZZ{c0o0Fw(R7dory3D8?G4hQ(O^t5y=6XSHu6M}Q*Dr75U z8|511j=_n=Cl+5tkD=@StH)jq&Yda5yHo_TVHD>FH=u_7D$K&WtPi>|eQJMEn=`M~ z2cTxX3pRuMp?xIABrRbvSg+a6*+6GgxAv_Hs0}q{hOY6CwFv8RJDFqIB;17479S0F zgG$f_u$qP*2mMfQh29GF1Zx+ua4hiTR%H&^bFhOsb5lUyNO@?*T&3S(O>9l<)`D9L zHbNc9CbEgM;Qsji@rtlIx;pwnJ zDs#9W@!@8`^(7zLgBrK{qc7s6cf@OG(I$5DN!lW1j>O!phxGA z&VLY^Lv3gZ_R|%{3*&FVRp8v?f9P`=3TMD#W{ej=NvMR$1HfFIr@%f*Yt_z}Fn1lv z`NaRj>t)_z4*px_w~TvjcitH{4J>1INJl7ic9j_ZTB6T(61HDdO z{A$$;!M$<&0RcY1Cqgp0$$-tiOX z-?;Xx?fIG=fj5{trT4NIb@374J?H&rd}NKT81{p`x|=|KNlnH$SMovufe+92Vjk`2lzF6x^ks*!QZSuTfO6T z&XVev>6aPA{GO}8=Mf1cdvosQ+%)E9n4`Owd*8QZ-n{#pI<~p7*O_^Y`;pgAbx?0_ zQo2d$Y3T7j#<<*m7Oy#LbgoaWoyD%c#^&=HvVMVi(5+@}t%D*W8Qi#Lb za1V@xngulr3iAu|J3s<{O#FyLgVZ`624ADnPz}`G)CTJ^JItE6>-ke)%wfKK z{Mhk8qgEIHnm&K^|1~fbjD=4F$_&N&i1cymrSLJ6nf*Ej^eU}~{%``b9G`=W;2$tI zUI&lSk7Ddo0B3@p0X1#&IqMS6VCo3g+041skm^BAcpH3tKX6U-@h2TWDVR52omqp% zSYJX=D`%|?9}ge*HT(viWnPm$L-pxvp*f5IYcUO}Vd<519UBci4MDBlx{SV;-=Goa zUU)6)70iNq_b1?c_t_4hS45m2)ECs$SKv-PwfNLx*N(-R#hDkKv$Z;6}I;>Kv+b=mQvXc*x;;N9r9J4Ydnv2mVX-aQjx)!}sa$(|ViQW!q)zcC9&u5c4v2m3<%LX+T1SO~4)9QYny1NEk_;Z67)UV*2e2iUK&0-Sa4 z<4c3N;s~f4svFGZt%V<|1w03OEx&{!wDmP$ozQ&In5lby_xvBA3+zbj2x{T#CmOmV z(Ma?p&MNYL&4e<+JYPLlTi|#4Le#tU73j+`)@%*N&*o{y#_ofYVFBy}eFBxiuiIbe zy=AYQ`{#pjBisd_z$Nt8yGQEd;T8(w9euxdfiaQ$wb!pRnA8dVx|+w&_>+Az9`L?! z&Vcn{a|G`vV-WKTbyn*#&PcBpsuw~M4*wAOA@V3aCLhE;h;`?r0q5>I=l)!12cBi> z>^OT@^b5H5d>Z@IGDtADxG+)}xdR%5vGU%~UKGT>LEo8r);9V?e}N<9|9bN~(DU;X z{tIJG*JZE&4)7kcl+0n&-dtx~OZ7GHz^i3^WBzI`r+#eyHIm|#fH?+WWNy;9?U~1L( z;l(zVGAHxncj3P{Rb9}yNnOz2+4!n8y^<@zyh1b!UBujD$bCSaVj z6#tPqz44a0ekJg2Ehrjw2Xh>2$?t)Cp7-i0rBC6cos&!F!5`?LCGZ*N`snkqA5l+b zb+G>T1ieE2AP>xsT7i3%*QVN84`wYar9Nf8q*mkaW!$}jS*_)Y%N38vj>z7SxgoO_ z`ok8^1aF&Zn>my|6x7}H39N+Hnbw)Vf%GMNG;=ibG-uB}1nTLr;utF8MS=H1k3yT0 zHbGybUNhHW^MDG>K~d{>opp`1UTa=bix|*)qWk&x^yTh@XW?}EG0y=#-qtSvf-3aq z8lS8|_cqRX9rP}}0Oo%K;WwBGkAU}tU$=L~Jj(UN|F;pwLL4fFDh6jjUBtN_`(Q2J z?0mdY*7DSv%mwtQiM7Aa@tYrn6r2y2!oAQNnt*wOkMZB`fKlMrworHVb^QVsgZcTz zU=BV7T%YH`aPYNOM{?cS3|@O)XX-(fj#WC=FV`>kTl%*^>l>6FlpdWK9eB&W&3>Dm zkN4f&+WOIF)U4HS-DiIVsUAB}@Yp)07T>r40&%+0M| zm>bN4@$e_O$9k>#IDY}x#oeWMmwqqry&!-4m^00~#Jj{_f{POuC%WZ#(<+od4hF*} zxB>Lf&P>eY^zikGj`hi`x%LqCRU z{ySH}n#l0H;dxQ0Lf`lgXp_z9VH`uhtn0g4-9Auf(_=6!IxJc%UMt=`);-oU+B5n` z_>XWq2=R6u=TI2;np3;Kmjh$U&CGc8Il2iF;F>lPT&t}i*w0%AdcohE2Oh%{rO!gW z=ry|e8P@HKO-tnb|fuL7m>Vzs3XaIpAbP>WNueI48{%o+8A8=rZP%>lJ|>lFGA zjFpVDhJtIBo&jT8b4d3XYf(Re`KOOnH(UcdAqlQ|#=lYvT7h|_{t06z`=TC!6`(hu z0Mw`cp~u(tOt0`Pa1GkW8OO%&&I!?0XnsZ8U?$1EZFR+Gp8^qvMP*-XW#!EMXJ>a);c7c!8^h9676 z`9zWoNBp$1qt*H@z_&ug>> zJ^0_1d>6zO<`UL4^z$8L?oWuOlQAV@g8J19_{FaUV-6pG4RbFSmMjc<_0>i69v!D( zxQU*UdeM4JiQ5|;7aJG!sWeVBPHcr5`8DzvCl&{@2Tn_zmgp7l#U!WkK~1lHynTFK zY+dY8xEd-#_h|RvT%p^k8Fis%+9uQ{&?bFt`_P{}i1X&`d%7Q5fHeYh4E?jEVFnl% zU=4Ho_FsmV+i|1~E1@Io&gSfGHWASUuqI?;KgMDk}ZO?=I zjB%@ZbZ7X2-ga}hKR_L;HF1>lI@J)(!_3Llsnnd*AI-(A>0X15ZTx)*thZRZF$dEt zb{0M{*Anx6*BWDTHE!bvW2|RD{YAg>H-J4mh==sAOoc<>^*9}$%q}Ryn|aZ8@OnKF z)LI(mHOzAXa;;aJ?n>{@?A+{JZ)Swe$jr$6nf^2VRO+d~53sg)ZLvDMe~ato8uI6> zU^+AOCP4y5=0&x2nmO zX9n6P{61dSJEET z+-rcZ>B&$L+z-^L)Thj~d&6M(68;B%-^ui`_TUx0~m=Ds)YEO;3bInMRpy&>-7@uDnaLpGlYM4s%wllLcn5A+a=Lr7@kKns^4^qeb8SbD?JqW*eZTfu1gL<|xy1AA2 z{U_kMn}G^=n%pZJ!6ooN@O@{P4qw3eU_5hf=-g0!xB*@O%GaTrz*x)gWj=6#KCa7{ z(c2jGPN`Fw`x!r(H~Q8dTpL}_)X>$#T(8am^Fe(G*5Ztj)SkA09#PlV9H_g#1o~`$ z$6LM{^fa5t`nfd^YnS>2>Ouk*GnXoa$iF4NB|acAAYrX)X>4h%I@p`mBGMxAbNJ`* z<>2qVk6E5-`VTUjDpNWW%t!x%zOlDpGFU^`!(x6nmtHY77ripZMHhlPZacgmUd!%j zqrn=r9v<~wXA#{1YKrdh>c8ghElam7J&l_EaLz&;$a!1yBl9B-fxFUWQVDI*n(33E?)abA&AsF; z&Lpr-GMc##YOU_;)+}3rJ#*e)&x84w{=o0yId}$-$H(wEUTVMo8~tn7gWgB|i)s{X zLBZNki5am`u&(d=;Cny6mR^)=U^Td&yZ{Tqob4W%2s7bQxD&SH=h>FsmhGMEog2z| zjXje+lb(~k3H0(bOEybRPfbrvO;1g$vwR2_WG~3Jg(jTi>Cd|Z)UC`B)zV#)euNpv zW&~%Ts9C)LKY}`ywZOSx>}335-u@66GZ`-$LmE%HhP(n7fw7Wtmif8$8a2BUImgNP zYB02CzM9vjbvpfsy}+F9a!?=Dr)ON%n%PG6p*{1O)Sb;&jTH+sg_%C-KI!{Y_oo~p z^9|T<9D_fK{wTTuCV@4%vy*2BeJj(G(}Ni(=cLX_oti#1eK&AvE7xW!fV$@^d9UQ{ zVouIia0PUP&*{ClcYY0eu=T1pp)>4(IpFViIjDEL5iaDc-ZfyneFAu|s?oUrT*EoN z#zN{im%*3deZG@EI@hN@&>r+Qx)1vA>Ok&a*7eK_ABB@(f<61x<&10m*x1N*ZU<*X zxu5DCR#%z|&wzXUQJ4&V4>hktkOtR8*P16lkKYAgOzYpEx4S#s4_AXVvT862ZU@%` z<7j(XjGL#yJ#YFZT;>SdW=?heim9#70wm-0GyM1U*f*tjHdR9 z_N=Z067}=z=l2FAzWfW}d~i07`Q06$X5I_}4`%G5*q_lqqn%(@WLBgu%ni>CzXNB$ zIOY`|!J}b}Y(3&t{BCOEUMqjlS3Ml&f^pnC;QjV1{er_mpOZ1YdC~izH`Up)rQum- zg4mOllfGEBr|w`aS6{>P zU>v6Y>+g6X{lK4;d{WXF|Jil$7d^$U&uZ;&z+Yf}&vknp*fXi-sE&9Js4cz%#!$vb z##_dQ)>O2?j&Sz~@Pog^fL1>w6 z8JxM<9S@qmzVZm*UJI$DX5Q!VKA77cY&qQ417CK>OkOG>QuT@&<9q)JP~s_=Xj~*)?wE8 zwcy@l-uEOkeO(U}P}B^za*mSoj9yQ?o~ReE7eA41v^Zz5{f<8ON$8W%`n>gdbLl14 zr?Cv&`_x^UfY+4wtQx4-pKF=*UGq8fJA1=UrkB)fd=S27W2Oti+W3WFkLy@)-Kthn zt)v6JEo%Pewri+?{v7!^GBi3g+MII;&iY7Sd0@ABrQz zk)tpOW^hi_RHy?>IYGV^tm3TY$G|vN@7P50VzmzaH#I?@j_dej{6YFH7lVCEsU*$JotaO0>68kRrRRT?;YjM{gj+vC36nJXWxilY5$}I-# z62?hiz)x@{=L&7$grPUU`*SNagR?-5`}eT~YJ1q<$F>$oYgbMt*^5 zMbnCgCWj_pOTCu*CjCuN8yuS%oB1*OWA<12g#CVRgLOdf$!|e@UN5>amamz$k|&`i z_~yD~eb#kKo$bH%Qr*pZ=18zsV%S?bG3Vu|30w|aBU>ZCg?|eV z0=<&z+Q#Ru87IK^%%F^hqME(C*S_$uf*Qs%sGj`PldVq1-Szs*ZdwU+#@$^=!37LDDV_gOBg8Q#?lB_}bIOEtS za6#&Sv<`O{xF5a(Z$d{fE>hdr!5pI%5Gfrg?d(_mLnEOB=<{-4vKHr?`Mj}@wXysE zWhr&ve$W)$W8LFtf!-DS5LUwn;PvHR>prSh{W;tPd%?Za{lfj=0(g~qt$G2>>D;fa z^PC0hyT?k71$mtJ<~d+}Fq{cz<|gL`^DC+)t0gDHsl?WQL&r?VOg;w}|B(41$U&?* z*%ME58P;|b11`8)b|v_`x}+}LS6ICJ+=Xbo}jOo9RN0r7|bBld9YesGN%9UUEQ z4f>Nt!u7C1gb z1^RwP)7XL0{!0xE_2Cqp+C18Fd}^UY}bZ zXO6sue!O?^5WO6JIsA6??daji;YfEllO7y>EK4}k)%{NGI9)m&`29yPd%{}bm(1U` zhIAen>!}f`^O>7_P3Y;E2E(B;WWar9=CPSUEzax2b=bYeYh^GPJNyR2z?!4Ab?f;T zF(>X+(3_xkMpz!KS(J2wee6SeTm0GToaeJ!V)TgOilD8zQ!uLhr7lomFVfVtDVc*exNBe@a~_u=HrR)hHh>=`g!*AY*p}WWo~88eL)T6ZfZ;V zcl1sLdK}vEZ(t6#3e;bWtDMbLCsZe>!@2hLLi^UA>DSe>)r-sx)rQRPkS@#2LV4Gl z;F{<)9|vQlkx(^MHB=iGda3 zz8vZogF4`_SIW{>qJU%>LJ5gH;Wnu$ZSosA;pl&XzED)VE=N-wf6= zZ`9|?zgwT_c0AGEADuv5TTRUS&b3A_xB1Y!CGXNTdv%~8e_HY>T`Q}CnQiAVN5fja z{Uwh>cd#GpZwMEMiG0QvUkn8>1sEF?oc;6$XZF4ZpMZV8##zRb?Z6(>AK+zZ2!Fz3 z%wkbDx(+S?eFRPU4b;O%fPK7v9h(>@A2bg1Fk>G-_jg(Z)&~zUpL#)NLB{-C?Rar= zadK>GY-(P5Uixx6r(TAh*`C=;@m!tHS%m&S<0^B=`{7P-ZMJS@oMg?)xTp>^1vNZ< z1C8)k8lz9c*Ly3o?7b$81?k7lFCg z>!8kk0l0S>cYO-33kR5?TZ7pI%gQV(&v80a zZF+TIr*~C9QV!IM)SEs8Kb{0?O|#%dP$RV1q36u!z&h-O%#hp0d^2A|eNMi<)-2nC z-Y?_f|JD#|-LBhjfHe_kq@;G5SdlMGi&Y zhf&M}&xaAPgq%ADA9DhZ^;7o}*LHJewO93=Q{l%_KL#^+dQyv92EL7E?u9v>GvCx| z{>I@jhFKyjz`yNy$?^X`hZ2q4TG(=U5qiQn&|B)7WgoC>iffwpU8!TGj;X7wNt+Wc zgR!9IV+`f$N^c5YT&()aLeA2I}X}!V>@-y%#7-uyE<6iHr(ahLr8EvUd8XXrI z7ny_acr=$kZ#Hy+ZDa3N=2o&`@Ie>yl1!+ieqz@JCi$;o<(piqzlu9H$f$60`~TP0KU~Js#CPP z5Q=se-JHBRIStgBPJ|kq&2(z!R3<MwxrIOEhZ@VWbVO2 zuoibM=vy*p{D%IRFF;LQALxUehiQ(v89sy4!MdI6m~psq&{d$m@AdL77zgHo+WOn@ z5qt-+yjb4P%$fTZtT*{P=s|VuZourj)4+K0b2tpHeM7;x>TVbb>fp`6>u@y812sr% za#O*3)3xm~uvf|)M(W{t(%0m5xC_(-tP`sbt1(#La*Z<|(7);#Qe&fIgS_ekdIsGa z^pq9l6$O8Tf1m5Ezppilt2mpzN~8)WP60E(Ka71Cn+s}8_Q!pl_&V_d49_2)@BHr% z;~xfR_1?o7z0F`wbWU`CWPhX!bjA1I60U*)_|{s3dVsl`HO_-zj;)thj1^abbtjga zpts(8$QZ#j)*gQIUUlP#!T4k+^A+}jnvz(TS7W*yT!XgJyKe2R8;k&JX2wG2g8jeO zK~pd$str4HJA=7%bvZlK_}&`A+}zw;&*GlNZ^BSGiP;9$uGF`Tjr0lJ1g?Gl+duRe z_s7k=0$u=XiF!PJ{}U9#&EUHE0~En%=54vR=+$@6QRgDzVy0rIYqo24Ei8a4oO5spe2!dS{eDMFj+VH;^RZ!ureACPuFrrml(h--qiWQL)#%lzN73hY8s|FQn!YvNC)FpFEy@OZw?^Nk z&^*~Z`DW3Z!CWSFCiQY>@j4HsYPxEAEUbk}nM%PNxx?AR*++7Z1hK7g>F3Z35A6A% zR(cL+h+31j)`3kW@UeMsJP5|y-g9cj*2N0(@2JO~983;5IhYq`ee9gPbAq|q-oI7z zss?jbowMugo+@x2*ni$I(J(kO@$%T^v4zov!QL`AGB=WgJE1FF0+qv+!&h@AZ$0>l zGg00J`%SI@bGNd1quNl@-vjG`5U_M3X4;nr^BMEZrC@zg{sarKC8bL^u^7T+Q}#|k1_Xu2<+214~(yjwOpTn#;Q$)U@4u4#C-+p{%Cp=jO`Bz4|(~b55ZB ziS7ySL2vp`jaA*BUWTn;z0}v>DE;x)KCP9yU+P)b)BX#%J`aN#pw{O-M@j9t+KjrA zvE`dE6ncO@3u^&BHz`;P#+;;_!5kws8^7*jTpwIpM#4ZSf2@2k59%3a)A{^bw{pEq zfFHZA7^mvzz7%#dug>o?4sHh@Oqn|wFIztvV=AwC>uhT9mw>v#X8L@mKy6TS?E-D-J@#)^`*}V7di=-oKbHTq;-3}os&rSS zK@|s8d>DR#c@^eWI0H_HyUX8QepR_uAZ@6|ii|IXPA9e?0mj_`g=cRuNYoQnDS+Yl0Eon5UC*2L5VHy|%*?aOHOo!!Q z%w_CV6BaXjZWQQsvQN*Sqi5bag*ATrH}oNzLw1BKLA_}vm>+%(#!jwrYOBWo=Ailt z-Us~v&I)&ptOss#uB)HJHZYelZ&mYc1lCi0U0q|`^OiEZYd-|}A6mF;j{D6!%(II# zRO?XkP|}%g&!wMBH_J53+{HPb`b)h3`*8-Saf$bPMfz&4;Vfy_Oz(aD+jVnwb4@Z$ zGRxA-(!ZpBNp*(CU_R$LmwK2ytG7Q4fF{W%L7ioIa(GgIWS4Z8bbA;MjWdliqaZJv zM>W4?Fq5f9agAdA;4O+<1Ui#3q zeBhrmpX5lvk%Bd4*Oa}q;L?Hya7q3p`41-^Mv<+ZIEix?$Hd0OCc#SjLd+Xxf%@$< zX3?#L&*6LOhTa4A?v(<)Gw##fKwav6`b5m{-48m!E8zNJOr_3zCb<4?Ve;rhoO|k8 zXpPQXE3b53pdI>Lsofh3sU_J5y&LRXbN{g?)B4BXU_H;+=WS3o_-~K8`S{I2A6zZ` z{Kh?Me~0xlgS~P!!GgB&w|eju;0zSK-%Y@poZ3?zm{2kyI6v)bygS|x`UKo(y!KuL z_nivhz2&`U4ss!0P1nCmscp7*zFxQ!4(&g~Z8%G!POJ{6crA>TkC%^o2Bz}__Qvx_l`a$>uBHha2+nBjLkr@waSGzqI2xeqwWZM_F zr+VKtm<2bqWN68E<2kJq7z7_OT zcLlYiGGNT}EBpeRz}k*;1zaN*fO^$`&!PP#C&3h^I{MtX=B$M2Fc(}K{db?|3h*>o z6ZNru@!j7G=9}Ii=fWZ8n!6{Mlj$414t_uO`!Qc{^HX2H-$2bsoyx{3YZPkz*6(`2 z7HSpN@O->+VO1DR%|w5D*?8Ib?AYvJR@|WIpy*YRt0Miv{g^&Kg1VEjk-3<8fnFciKjRH`*+rmVz&!1L z@DOx_KL7Fs{kN_u=fW_sCgw~8*ByUvJsa-DSA+XqB9q88fSy^*;S z{ppijN^gZ4r?HQZGj8~XGYdAu&tR<70xki6j+)VSD8-v=oH@+LVEkuJvklB4v&XYc zb3Pd8247P{HMhAHyhqh#tTP|N6Yd_~9^c`K^p7rLc9}Vjd$#kLw!#MRo@#*CP7TdE zg|&Xt@7Q0kHNG|8Hqkb*Ie&BhmWo>{K6&DkCk{Db$O%_Ls$#0*^a|4}Y%IUAd;vUL z_Sv$|NvQ{a#s7-0j;)Sujc$#;1vSC-?>flG-(Q{iHO8f9Kwa3)xmQQ%U)Iy=o4KpC zf7fgEvtBR{%7L~1TDTdXK*LT^BU6*HmS&981=K9|!43G}FNTjfL){ol&-bn1Tvz?4 zmGF+I>3ZJ`XTnGLR9!#Ef%k_on6MY7;);~MGu<~nT7XUuQjXfA3VYVWTxuii@QR%^f>N;P`de&b~0 zC)ai3V!Z?g(N{5x%QfA-PYvDcCyF0<9R1F|*49J(dFpMe)2lfNu0i?>7>noXn(Q^% z)o^9;mBDq64`8%Ml zq4zfKdkgY-lblB8~pk2 z9ByMI{k7_ct_xp*F{i##<6vVW{eZvFKT-@`n3-hHt=EO;6CiN~vjgv9-if)t9^oYT zc@6jkZU=jMjgizf^th;B7$0~qUIt!s#=Z9H8b^43ka2@Cg4g+na2}eg^|}B0v#cZi zNzFS{5(>^XLuw1oD6sx*tZ@*m1*!XA$$T0Gn4@?l4@D0}3uA?`d*k=Um%#^6HBmKD z4?KsiKKO6{17q3?K_B`1oHKC=+#k6=qW^mnGzK-3#q`RlX<0ikMt5B`CuvNL{o2g6 znH8xOsms%s2iorIoKaQ}o`GfAW!cTp4GzK0%*RS)Q&e>JWuNC9wmQXih{)Op{U?jb z!(5+SQ;Zdtf_}_V;Ln-I?A|JzNHCeXOg=AlIiJOK--mWL^<>r-ou?K_q`54#(zHa7iuB*madYRQmj)NN0kI)}q)=f|yTz8F;n!zmm zRL0C_zy)9}POVW5$#tn4o*Xr}m!K-Rr=12P;e2=lc7%6?oyk5K>^IT}+Y8FV-<*^F zL->cluWaqG8mz+qYTd~GcI)3Sa*o?dFz0vQR3EY4ke|!XmCBULJf33IlT-A3J(;vD{5ENAlV?<2F^{L>z|)GF@0kCbXX5;3+Y!fuVkLe zK9xNHdR{9s8(i;#Jw(<`-A~^F_g(c^{V(T}->SJHFf(ivU=ubZd99Iza2 z+&ke$@H#q;x#JbVb>EoJo`OmE67(CIN5)FWN~=5l13lpuP;YV%#9|V7_skRb!fUYp zUwWdqyS}+*#=z@dt;u}h63*YWZjn!Ye{W=OD>u?C!B6H0^<-@&i>zvdqRy-e%D zc_@eAE+|QqBxXTzyg2Bus~N8ue?InnOdrA1P!WE^tLvezZL!R_h1K~=@&CE24{)y&F;+}VCHe<;>yM4OUg5y;fr8~!<=Jtj=7)vcTE8A7yAh>2XiEK zCiQFcD*e~{VF^@VW~Cap>%>j;+qxIt3zx$~&^+8cd^PlegQ0^=w0$O2K3qOH`_Fi& z3-d7Aa$fG6aAEkupci9)XnycLeh>W~%-HRSpC+4^&8v+s(%ku5Fjn$?(@@i3=8Cn8 zYv5sKAF6M?mG@RKTR;!ycKYqq-{0rl@^hI(y}V#K(->wTDT=~OJYH6LF~oo zi_vY7ZIM0UJ>jF!AF`orXd9dXdaTs)%{wNQnH2cWt$9BO*7J<3)ak5ydjoz!Pi`O3 zOX7NT3amc9`uNNE&#!{5^bL%KZ^3wBGq{$h*PDy^@eN?T=`2vYPzUV@#_#H!zTX7a zpv=dXgF3f+N*l1|WE^EpWeC{s@EqI%`Uf|GkG1})Cf|*-A>I$a9}Y!BQS1L-fqK$( zxGQm2a7M4Woagg~VNrY$69t})d*E9?u&>5iYjbK#Ya(kRw}O5FW2Gukp1H_XKoQ72 zs|HvjRm;2pMu7FCx%3m7yPg9+KXI@|sV3vPqh4(;)<4%jcUt!Y8wL=k5+>x;~hDFgWYh?^Thx0Onx6e;P_1 zD;4p5v_rRRYTAi=ifBTg+)W^Zsx+XmZ z=H%8j?g!Tb*9EVO#&~m$hunj#H+jvh0DJd*Z%lxVvDBGpq3=Q)F| zS-4r)>)t(69nBopjd(G*wvYYagSwpS+XNy|J5!sk zl%56sYaI3;FoItyx*~y#z0~af-Q-v6C8tF<}|ZGkUj;ZJI$HaP7F2*}0wIe0Uqw zPOU#1PugRrj(0KWlhV&^4cd7rf8(qC9=?RO%tL7o&(edXE@j>CPUsEyLltNTtH5>2 zStt6<)xC#;+SEIs|H#)Z4TG40qF3Uh(jNtnTZGs9ey}cS-lGQfF3>WSdnEHnW)J5D zJ_(O;X3gyE?CfItv9^QzuO4A_XV(RDvM0cN&TDlH80UCR+Q+aRZOPA<&_`}f*lXBW z)$3JXuaEmrV=^}T=J+>3zl`f&b$I{y`$11lF* zzel1+!aiX=ogF!gd=J*Xv1e3fu>az<*m0Z-RBHGoU3@1LHDl2(IgDu{-flUCWHC-(fba2DN%U>J7m> z&vi@Ry0P7jum)d}eg*do>)pmhYDRh^|2+2RG4~#0p>5RTK7i|BHBjQ9V|CxLYWRsd zf`8XV@EEvn>Ah4>u-C=cb{-frS$FYyFdjb<^uEl758yL+0Q3q^2iLSupkL{JrS-Q> zqu$&Gd|nqaKhk{L`{-omW%|9<6V%|;pkBzlkXeylk^U?7SL#vFAO1M#2R{`qE4-|* z-{F3TX#+m+^uebORy$Pf&|Fx-IR|r&%sH~<=$51B7o8t?$JN$|2(Cw`Fn@PE>;+?+ z0(x@o;~Wng;8S=WtOJz;W2u+n6PO0ZMD5^i_yN-3*FS(h@FnOej^O`RYyW~-P741k zz}}NtV2tDEkAu0OdY2y?cfG(|m4@(g-phH9!ZR?GJ$wrc%Nv&WH)qE6MgeP@Xqq^o z;DmxriA{;&^lSVO`ym#GKG8mber0Usy|O#BJ5-!k9B66#m}#O%M=k$yh{Fozr|YqD zEq7h_Ijjj+fSS0u$`mkP(JOA8V6AT>s8Q{P%6QDI*Qj3(1oJTUj32<5U%!koy&AE) zJ)uPqOQ~B}gY68TfY-a)$Vhk)T0uXsKIA>6eo?(l^)e5J9t>TAr{?15#lc(@*A{0A zEQMzI&GK&nKi&oB<)0Vmdt(w~68q!( zpb*U6td;Z!^Lh80%fNho1|-NcjhS8mwGVsI-U8!4_Y!;mt<8=AwQcM4>WpjQ9;UX} zfqb|Vj2q3z{2tR`AK0JN6x=uTMjGor0uSR$v7X!qDuc0<*Kj#lg>TjCtvMJ^ya(Gs z-NO2dUS;=W`yrkNW7z3nJY~&E{rCka0=SN|% zXBVGc+=qVLb=h^<+o38n&os|$Om7U%>RpgtpmjXGF0(E(9{yzhTr3;Qz5`!E2DZan zxwmrN>E%)XK9PFEC17u)y1jdib&#pxa~VD!W?Ims;H(wzAN7spphn|br6yp^v4T3> zPhgLUZyz$dWEQw)xfb*W`ykcB?*Tms*7w)J1K=9s+Oh}KnVLdRI2F{RIumof2|ng* zm;&y%YDhlLpIaIFgX=_lurBEDVq9gcHiced^}WyGRpr)fVX`J zeR6Z*KmVqF3fE>m=;L4#xW^2EABmUs($YEV%mM+U0eu?rvOV zyfj?!gZuB+U-UIS3a(YwYnmKy63mNx`S{C$)-bTtz`&PgEc-P^?c+UVNop2(ia zN5EDRnMg0M`GNk~E5Kaab-WxNIAdJzm4)DYYn}SH)D^tm^lf;}9m2b1?&Lk*nsaL( zj6E0|5FNl2mnu;%(V*55;;j^Zk*Z*9Z=F=Hz48AGoRwwG!q~($-yGO{Sg-Mu^z?VP zrp7&B45Y{6efp%0lX{f&DA6mI0KG{Mfbo=Zl^*abU@J2T>Tq_QvGHQCRxur{E8PKl zn~crwfg1F=*i-C#f1b5DW1!YxJZ@dioV@}*TVtocKn*}Yld+bXxn5KI$Gr|70{5;D z;Q&(!$=2mymAJc+q8OBaIaP88U|0;bUzf)IK zgEKx#!2Z;JPJF7KionLAjZ8rq>7`IqTv%Lq7`}!3ita1=1iB}?Gcj&QvP-H<5Kno= z??~qMBw>DLKBx3f%&dg6V9l>3EGS%1*b7=0wYL0FG$1`79m<3caZa`r!Y+jy~!hI~GPle^6Ue3-aTZFao+m8!%6> z&g9zO30CHVt>TGfrpsIwlK0V(i6_ZTm44pjbLW5Yw6|S&s|T? ziv4TGQ|65?f-$$gf$r##-bdb-)@k&e{fNih!bUkJ%$j={3t6+!zdsG!i=SuakKP;W zdB#lYAqVLDnhBl3`^H`m?;EvP?~C6#gUp_J^Q*HWXGNBRvvMoMD=?+y=6Di3ht9LI zoHsldzKVYpuLDzJQ#cW2L~IFkhBeVO(JSGb$TyMQ;oaeJpzvibb{jL4-^qI?=q37# zzM%`jz4~o1Mrse%3w)~t6OT^}bT?y0a~8E0Scep*L8M za^11!atf$987HmdOlNCW#!~;q>h7r>;7S+{-phJ6#CWSS^V*D;T0#`&;Cb7DU)=bm zGUqzInSC?+3)6^4r$?txf$gd7sh^WSyWAw5G3RW#-QbLrH(?EDZ|N7-o9$k1erZ0b zHZhvM$Rp4Y4l)bh{aateb?`RxUaH_R-2&DxU5C~0y$^=Mi%^<3eaWry3ivlJW_II* z(h~yjdKupQThwQ6D|1^gUv*$?WqA>0ABa51t)_3rJ9@=Iuu;fu7*3o$9m7I zGa2)!V?PD1d9Q(ct+ACpgfgKrA-$gFjsxHtxDPzv;AS9Y&WpktW-sZDa$Ok@r-GhJ zYd>mX<`C8sjgkDf^5ERcZOl{hp3w(kPrQGpI+HyUqv&(?b=R-tYg_|v1><1jE@P_i zOMM?)8}0BfsY{kAU8eMY&J#NV#^KiE%;8%zgZDys7RI9()dKSZ`%?#I240t#PmGng7Z9j-F0G z-U{X+?$fSo#v)~z$MXmHy!Ht92(OB)ig-@u3}}>Slqi>9F8?>^ThO;)d;a$P4h09iYG9tHPVCyP?(CZ8{jNvRzkL!j;U49Dn1>-3 z$wiijmxs4eDgHkRWvcaN9?3!%ZW2HO9E*vWj`dR%$1_UPW@p5(e9 zjhU1DJDyFoLiKXmPjdj$Otl6j)^`zf(G2993;X>+rdM!3VI1~Y>7Jo2SmS_Fvz*xu1FBli)h2W;UMLnKy5mF4aLECE6(`|W_y5xs^b5F#^@KrS?_Mo>qgsMFoA-8O zs06Mx)-&|RY~@@e*Q}241n9#&0``Tu&-+{rhI{esseyH1mfyboefh>bZ_%f_A-W;z zytoGO24rkGbUvQRWQnV&ZuX>dcV}=`re|U51-J(Ehu4Bd^hKJ>&4w>wIokJAa59|F zTxDbImf*fI6K;lA@a`VOlj=TuA(RKb7%Mp&WFn}4`m@@@(hJm%vZ^;lJ?i@1ZSh4m_0H340K}7 zs6GZ`5U;-h*~!_-8HpK*YvAvaze^e?8Ye!0(Qp+wOU_=I3CRh`-pudy z9L;ztp86C1fVJthWNi6q>v3n|b*q7@f+u4hjYWZcY!`eW0ULQTX+rL2cNl3^uzg#8#@{2 z9AUna^)uH4*`K>V_a~^AS1+j9`!o8yx`(>XS@Tn)Tc5W+&!15}OOKO&acgj{C-&z3 z$$4iD;dOWzE`W}pw`mu10$fY7U_3jIS#-uo)~Bk%HhS6g>fZ#`E7Tj+Laqh(mOJ1* zW(9apSRc}}-D~C;K#L2!r6#f=dfN z0e!B^;>+Uv2(eRPQgjlhTGkG7yOqpMS<8%+jiHUfyrw8;E>~vupt*Zh@O|?>T9>oV z&^+h`@*3-l_d2Sb>ATmDV~nrfX&$!^e12Vv%~!26s>_+fs@dpwwFde*xaZo7(+-SN z?1NDwzZP7>Uw}91U2)x3!*~to29z$@A})Hif2{}?Aue~@qdUKM8N&dz-k zEzz31b$WkJ^9+=@qkjylH3c7=NPXbP-pRNGZi%(&$tTQ@|Ma|Xkfkvf`f_jF& z+bQ5RJ-yuNLEYQ9%DTbv^rE;n#OPOF2UoxkpfBnLI3AW$XX}DzYB)R#*6A*Qx9MZ= zNu1^0J`Y}jAOzlPgEtx&DN8|L-+Pq%W7wvPT6{lzTb zIr`FE^X7uJlf(G()Thi7tb6|n?$tf;XFh>$<~8*H+cexXoS@ms-mI%)SH<22bFx$7 zrvz({`gk><^(p!gOa=Q-{)+q+nFam8b?7><7WYs7KS7_QI-7ft&$fP$A7LbHXa1;l z1@F1J;JiHVy@rsbAMrAnc63@W52ppQLR^PlW}3n>u%7=jJtcY>ZwEEBGhivRVH5Bg z{0)Bm2`k_(*a_yoYD4-l)wPF#`PT3BxLkoB+;}QmnhiVxuhUE7*X{>(a{Zliz<<+N zbS=0?ybpROU3;oRZSoIeBXjOP&@|mNZ6EAxh$rF+=N0uy^-1~lVVnUy8!BWgWcxyO z=F6Rep56m|ugp!XW1P-xW%D?5O*MUe0PdZBs298pjhNTqT5nxW4f7^?Mt|k((fXWI zb{-&w1o5eR@gmp@<_pVVIC!tG0rQ2^smt4|wt#t7RZ6RrHqAE8K9+tg-8a=YrEl^& z*pS!|^z(k1_%bmGeg|iOFNb=`ddX8kuh~nfmr~EeI;fec8F=}(a_05b*{ichpbP%j zC&7MCbKox^#`$FK9o8=OPBfr@%KFEYoGCfmBikc|1%(BDU|@V;+%rM;NB2h`i#*08 z!#g6Y!mGj);Uwl~g!xeS?f^~TrTmxj-vl+H^5B|t4{U}I^k7EiH?R;sgpZ*ovU}h?GVXGXFgCNs(fbDhEU!1qZl z$=W^=P_8+b^=ji;MXJj1J@vX%sMV>V855sHmCm@=IO%8by?0$X5te|OllQ~~@ctMM zYE1rGU0W^E-x~{TfU)3uWXz%#s6JxNr8(%o9|dpx%OYl|SflBT&(}K4Xz**Pqp84K z(4N`YRp1g}+YZiOHg>2Bk1*@XeBI~n2WDA3oPId{UCDPPZ-HlCc>m~yy96#yU!1-d zMrB52J}v#UR4;<@?|%Av)MnZ;`w}~PRIic#?n?1WbX*ULTLY*M<8fua4p+ds*t*~x zx`$&A$M#0|M!SQt)YQn-$k_1MU=HsE;S0hYLmg4HZVC0rY5OxXv_1#-i{l}Mw@mHM zz3+T5R#gvHH|Y=7mp-FDH4Tg%%BSwCqqvL=XLJj z6vUgM7r0kl1Kq*+_R!y{cfi`5>##A8dr1xOHB<$)->YFZ9)%#rBS$wb zQzNzyT#tepdL3qV#h@k>fL;*e@>bx!cLn%w)`vUc8nA}&F&Hx$%U=oJyT%%S!r9Dg zb+6Okw4ZY!j4fYh7WyxESP!KR1+yz%pNbMi347#LLu&}by5e=k_m|vX(hoYpHuwfS z6KWR>PYzFNTKpacQG2)$4nvzvn;@oAbE;5Uq4b=xbAofT#^EdTo?HjUre~BpLzyM$ z(|M!Z8-dsP348*^vyXsvM%M)MHuI&?umd)Lxzkh3wY?LJH`JHUVRqha_yAplU(CLk z#S&Cn8-~+ctT*LFQ2XtqWs zR+$E_e^ud9aQ)MBdW6|6u5Z@g%mSpR2&{%tSc=`hPn@2QZ)U zS?mSI==tUH%e6SxBIqr?oIX4Aye~pugv_IiVOB*}MV<{m8*T-q`K3Ycp>=}ha38)i zH7k8A<{`f_AF2bWVOS5G2VUbkc<unID}WZ5?YJ`vF$RSI37G3@Ml& zpHCLIEWQO?lRg1;?+S2J?53EWrs|REkxk)EoMiWW_&WFr|K`)cGMTSu#5$?_)5V+!X!FS+g*|E)N>;;1!qbv1S1Do~OBe{-S0x5c?5Bj8q`6)Wf?`Gr~D zXVDXCtYhrt*Nvx)lZs$d>88>>=+tjOQ!vKw2bJIfx=sAt3}Ubi|G*5W!BaAZK5={Q zHZuFb*zE@}H&DYfwmJbu!INOTWt{gDsF$mw+jD1)v=JUNdohe?`^-%4> z*wp<|fAN{%-lKlgjakt4dXxk2#~q;7bP?wdslizPGJjOJ^qJLH|5W;^^!cgtQ-_j= zf|*Ti6KxYcz|ZZ$S#m$a70D}-z2GoZlQkDLCcGEw!YnYCnG%^2Sy8y6urYjF@NKY< zTGN?MU*T8LucFOk&0{6e5-QTiMfLK1!yMkbVGpPH{snC~>sEh211N${(2N>Q6#Ux5 z_?@=G7BH^TU%8B#nXke^aJHSlSF4@@En!v8s+@7mR~irdn8WEapq`|!`@cRD{ock< z#zEF0%)>HZd^8mLfxj**S61!<<}ADit|5;y|Ihd9cKq_LFYZB?K{a?7#zT8}3WmT# zP{IH}>&06^eZbxXV<7J#HGv~Xj|B6v?5S2$@%i(6-BubvgHq8q7Jql{1hlaemxKcwo)r zjpx=d8{swTkFM9N^H%4LXQs_Xp^HK{!yoW_`1kNO7y%U`6(V!PbHlCS68IqWLC_ob zC9`qvgYM7>T;Fd;pL`jtgR1>Km-Ac@C%JC>9C>YxixezYz~^9ZtJ<)8xV^Cx!8pUc z^n1<--wk@SZ-YDvALdxbL24H-fj%QW;5ig&)X4{dxnLt03hLxbpbfrlb*XvGF*YVM z2J`>p?4%z-Pm=4RUT$j+b&l2H=_xqowY`w}DyM?+>_g!DumWv#4)a34hZ|rhv(weE zK89X!A2n%pRC9sB;B)7FX5Gw~=QD7o#53>+=$kkMo4|W$C|Hlv%d`g%lxw;AjM#T> z?B)0P{eF-2OSLHPt83vPyhQJTdthVw@yw@Mm9{Efn^~JNp6;3InYurDe{v|NI_YDg zd{Z*5cv|r)XaSvJGIW5(C5=mlgZ;f5z+RR7WIofI8YEW(;eIgNayWH43k@~1HR)0r zo;^h0>Pe+11-ba}(&53r(vbdCH9^-YH8^|fj0>%m{{)vXFHK*CKl{nlYSqpj41J>+~N7S&FfN{uxyaB=BxC*={;%+9hgUF zJYxNF6lb`(=j_Ss$vlfUw--EC`dF#^n0Kz&?v7_-VgNps`2Y@&?~BE(>k1Sp`JkV^BPbAtXs?mHFN0# z(?LB+kANN#*Ep|@eu~H77xbn{P#cVqy$`Ip>2-5$I|0;K%-h@}ra~8Rzp`fIefBdL z!yEtmdv5RGJP~J%`K&rC#Jt6|N#FOYP!HZ==8$vkP79wFE{qgLZsshISMWgI!(0IK zt%6tqC!#zM8xbE7pIk7xz&Tk<3YHYS0l&b*uor3-)+)6B@V)qZ@fz?|?5o&u;5ks< zu(!Z3;a|c7U{z>Us3v?(ZPHx+R%*1aN$w}c!R88TChqIEf^pJLh%->a*KU8l`=;xJ zYpZ^UJKz8vW z@!3`2-|Gu%PB+8X&ubg;=Rr023-r<&QyGWpo0_*ek^!~*D z#K7dhL&Udp+vy62?pZT7g2XF|?O^o&YH^zebqA{sG2Kvr#q_5>;=#95r zZ;M_=ulbG4cX>GbaNzk$r_wl@o=82Nd^)M7Gz130qLM`=qXg~SIZnTWU-!KBy2-l9 zc~C!9KeY$^c$s+;w`Ok5jE1=|Bs(N~4crX}nH%gZ4C7g~JMVRSx;DaK<_|ps=P`lS zJ>@aT_vKxf3{_!Bcu2TKs6|NMK*LbOkbAG1#4n(q$sE$$z;&f9 z__OT>a~R{)E%@`*h>TBNFU+;{G?|0#r@z#?>TobNv_{tl)BtyJzKLfA#}1o#@I3k~>ND~8?qlZu-_W}d zJ{At@JL(}XgZHQL&jnze*{^$lF9+|nRq!s%go)4!j0IMJ@q!x3K=A8&KKz>b%MGv) z)K$z~%tt=OEB!Zm{ORl_V>rjJX1Hc}31@$u!d$r#u@SL1p#$h6a80Vix#QN}I-_T+ z+1dMWBOaj!c@6T60jx2YQ?`N^pgwfX?Ha_~=DtHg9l-a-eZaN6KPUvA246BO?0=wl zNz|B(1N5SLE%jjP=lLA{$M{8Gf!9cF$@uY6a6MBm@Or3O)M1{HeQ$nj0I%C#_y&%n zj;6Lf3YPKMu!XVQ69KX#UZl4%7zUm-+&7SD@^CPdPUw@h2+2c54L%rGGuLEN;^Vgx- zq1hUl8ktNglR695CDtX%L)Vh7C5wv}7u$ehtP*hc z)JyOkT#>pW)h^vGT{}}d@O$4xfA3lF3H0H#z)_&*#hhSU*|swGU1LIfR(j&;`Vh9m zHt==nH}!Qj1AWof=Uul-!TW6pxK8LzXbdkh^It!L{zmnT<)DY)To^_lt?`Qc=~KB+ zp?ZIotCq7pcYAPd?;&bw*6;lOE%XD|vN}msei=xVFRcQ4ux^>G?zFVJ>4?(R+pNAfgOu0-s zV={BT7VvJlcY~hrCiqM$fVwTq4Q{rg9Qy#yhL&KS=Y8U@jg$1JoPy4)M&1JS6c~4# zo~bVtf@`39=zXBxG7?hW^PuB$LU*eP4xMD8q7_6UhjdIz}!S_ z*k9ib_TbIoj5YV2=jksDMM9BX<#&~DdtBS&iYpdZJdTgU6%R8hZdS#i6^2$Qf)?dl zl%HBOwdfjHQn;kBH;gP8Suh|zAZ~rnK00HlO7KGXh4A;G@5$QRgr264v5X#F*Q`(Q zcw7Z~IC{bsdf?U6hQn`Q-|J9(0Om!fgL#JiA!2OvKX7)Z>#!Qnbmo?H1!E~|bVJ|{ zI1}E?zL{ME#z2Q54f|j_I0vOgX^S9cdYZG1!)4(>Q!-|n3&!X(nbqsehED;TU!e6o z!_1J)U{8yFN_}GLBt762_yqhg2B;3+gL?ASrp)=SgO;Gb$@NKn-nFqOOaouP&!PL3 z&!O+Bp4qivF7Ef}L9n+)E&pw3&G{;N5Y%)_$bHRWU0;p)>T%9MTh4uJ1>3>?kJGcK zXU(I;57*A`LC=C~zx%IytRDQu^g=&?4p%W-F?)Xc{PgXq+k-q$?~*Z;XB-|WIZ~pZ z$(mgYcoVKnUYUFwYH)_ig|HF!rT3-lWa?y=rcP>*)dVn>! z=Jb&~1xsN7TnuN!pD;NzIkbZ_&($x~Zu`LB^asxi%?o`{@IgVX^0mrWEUH-4t*~36 zGaJ-gBhVw(BepoYIMAAmg7SEGwk+GxNQbSO8(YN*@^C+5tesE(f_aU#5-**y> zhHYR>c0cDn`2HGKnR}Usx`(ZSu3(MDI*mD*TEGa5b|5-7B8SeW?pB8jpbl80>k{h{n;V@Q%oT|8aU&R@*q`zSd}8+zXV+L8 zU4hTfx?|gH+idGh>&##OlFp$Cqem{YU|*CaiY5ts(X z{KhGpz_@2R_!_OTnL~|-CSV_%x|7e{a$-&ME!U0(;QC?QW6b0C>jm)FBjDttCm+?X z?Yih%Zfr9E7J{*?zrP90H;tbNYl0l@zrSOAI|^JgJ_I!~_n3>py!-(8*;y4PE2D)uIJA=I}ZD5aDJ1G&r_it zoDE~)FIWI?L9dctoLD@wpE+5X>LUCDXa-pjX=b;Sv}J6+pe)8mW0xP4F7z(NK2??d@~;i`mu2jyu6? zqBi5bX8*o5tc#f;==x&JXsmoUXWHrUx|%+n4S4$h%XihNuKjlgv)-LHa2K=(ynr z!efP%3n~}rCAZ(VF`oBC{{P|p8$Ukg%=SK@r)C1#iR=5f%vDwIwpXrW9hCG-J`kjVCb+`(afZy{hxE87#`B@*ix{|Sh zpFf6AU^F}im`McKVT=(2N zRznLsTYh#QG1qjBH4b_Ld~jMpA22>z53YBcVG4AC?O=>!FN<;39WVu4yW9)*f&1b~ z%)(SFSIbjJHc$AkhO-DiioL_9fF6O?>DK8#lYa)iyiF2KJdQQtdh;ka|9k9_u}3Pv z6^E}lT|t`%dZyn`FbAbs=`%;Pr#Mn+#vNU>)szm zKa3vcJjc!9&EfGdAv7U0I)8Nj_nd9u|HpN%2U?YD-gnG=)3lG#$Evd*D@20b-zE?sfPYj9IL)xsUq%T>{=$9YG!ZUZ@2B zY1`Ia9)|1T5%`O073BSaC ziB*nQj@z>`IyyRfJA4xPBr+4e3x5~B2)aP4P^-{a`CkS1!+yL|dQ7a-#d2afP3bG# zOF!&ldfp#NKa%bWy;8k`^FS`oT%P#=)@IjoTHLm*c@!yZux6MieGHd@>w+~&^&{7V z4@9t%Z(-f*xXP3~B*4gF2DxgZqSggny=Q zxf=CV*A-_P_!^9_M&VPl4z`Ux8*}xG{>8YcH>fK-3f9r8GXKO6^L^_({(35O2lJN) zz&Og->M$5@sUx|jn|rBG=ub(*ci{eWKR(|JLKlSWk8<9RHIJ{OUq{b^2bkON8vTrW zLwj+Vbqt*XZ_y*B7tvmee9&t^8L8X{oR{I+F^_pXPje^wPPW z_u_mCb;2``o*C@7#;-mHuA^!>qQ>TP*(^|*n&sRG*6FUGU)H=x57345OV$Bnrw;UE z8M_$!JPJ>MYmWD!@zEIghx2)x;S)Fo^kcsQcYryaUZk&KGW-b3K)*tDx>s%keFV<* zP+z?mj9K>KV=`v5H)Smt!?-sO0Be8l&-!AmA6i$u6>7sPFcZ$mIU|T+Zlz|VPvlkd zjI+{b1=ns}W?e9k&)Uc%P?KIm^I`98^~`d|${kaCYykQxuLk=9#)Ip<@z06iT4ukK z8j@TD_PMwR^np2`24yW&ubgrAZP2D%8zvjR9pu~2?9r!S-M0lgRTR``W`Oa&Ya5|V z5L+dVCIT<@R{BKMU)2zOmKuZ4*!f^DgL<0pTLb1lj0=woe-!yB;y8+1@PU5@@5bMa zKV9&2!Lx8bd=2K<%j3)ABf-6(1I&rd3F>yKNGdq<>7VdFoP>UV*jet4D>SY!z5Mj@ zHHvB!omhBc;m7fh;}69iitUQ*iqr@5%1Zbb)C7#NeUGiD-U<5Xo?yO-Gl@ULS76V^ z@APf%iS!crz5jqcaZ|zE($D72=Ysl^v8tcFU(}L(##{^4=FK}ha+ZYa z;>Z6#mNO&MSXhtJd@vSPcXB0uS+-gBT4skj7sVv` zw?n@js&=5-fja-x`RDijzwiI}pO1sNapMn;Ke+eM-b3vUw>!KN4jnmkM2YNUAZuSgjA8&>k)H;oyygoNli5>&$vy;JGE{Bf@ z)BKB%upd~hB^Rm@5%;)q(sfU>N_}tb4^%S3luQ(UeI*^)-@3*x@ zJrTZl<3i&?S4Xan?0{FJuST5<_ZT>D*ElE!UaR)-PVAl7Z(#B0hS&`;=L)QZ^`LiW zRCrW)9@GHeNAHPm@c!QjncPfpZq91Xhp;Y^2Pfl6ai5<6J`ctWSO&HlH`+M+cJ_Gu)Uk3B#LNM`gzKp$m zz7J2q>u@e}gx_K2rFxTI7k?c&7CH77UQ5>&bFRVQdu$Eg*L*y4P`o#coz2y%(J!haK=cc&{0&TWc|va&6ILHw!l6-P;8nK`r43xZdlvw;#f| z%UtN0$TN{v_;!Hb&E=fmtqo?&-HGcY}n>90f5@57~;OK~Py`M=I_10{nPt> zGF%U1VFef`={<3swI;b4^6;ZP0KTT>U<~p&420$2GrJCqW7L-}h4*sb3wn0cfXw-7 z=hwzzP?&EV)e>A!M#2bK4A+9|iG5<~*m5ge1m<1tr}~kM({_Wg&ki^Ydq55AH_kIq z`!;r4h%fVO@HzM+=Z|15X_VV2&^cUdeZQ>3sTo;kI~8t*Ct(qo&svL9^S%$P2W)44 z2up1_?C8hLsb*(qXJ@8nrpCix;QKcR+zaY3yQCX*2lXs<)(wyZJ%jp}^pqV3#{2pT z)IR-s2lxhD=d9uR;lA-3R0H!b`&~T8L+xQVOaT4Tw=x%KlN{Z2)SuJ+)*R9O*gYtY z3BWz3HFF!vh0BG_-F^ULC4Eb@dj)Zjx!Uyw*B6`v&X-d|S{Pp#e+8VCdn&Ast&W`r z-J;#1%|LJZu<)?(zRKOAw(*x=rWG&A9&ez%!uY57M)|~;~LtnuXaKAIA_TEv)OfsK$8Tk1xX22YT z5pWXqn@7MJv(Nc8oRijuxePTp%kt{X)tTn$=IN7DC#NPPCM4RyxiGC{T8Z8P|M8`; z73@{{w)orP$|aRc<`&N_UIWz*S36wgK$Qc=Q|%75JM`}1cMlg87ZpDXicudXK1|%3 zx;J$}`hxVynUgc?vg-o<=|Jg$;M%Ey>7Pl$%!BY5B30M4#32YM2$aj6lg zdAkm|wlv9al0P$VW>BLuS^XGqllS9EV63C&WbI}R+!nembRxW-|2j(2dBM4w>+;v- z*MKpw16IMSV2t$&R0I2QcY)qbbtvPc?U0+F8{D^($pL%Q?;C@j^yV4QxvrJvmgV|f zEXZBJ#N1uE6Y?em8vO9Q;elU)Z6H^ztXpokTs@#`Vrybk3#Jw{0Bci?VvS-mqBEi^ z>8qa_o*M2;Z~7)?x7f>SJ@QXx9rS>=@p%qohLG!*&yLp#=VubW9W^L*N1r==2KsHy(HGG3)0J4aCcdV3=vPs%^PDGjaeGu;o9e+S zFfBeUuJ7NOFY7_kbUM5Mzej$L+z)3!C(g7h55q#kLXF{3<}aJ0zYpfy_rnxeKwsk* z;C1tQ>8)7G`~`J5pOv9t4^LgrDfZfU-HbogO4H%FekX@Bt zmDZ$mBOC@jf(w%ilXX*dQ(NFE`Y&!^CRUSd6Hb-=F~}|4SGK}j`cA#p*7~|0?Hc&W zmvXkB`+>Tj`@C_j`#>#bwU}F}AKv-z%z*pwefWO6pP0wrh0otuTAjKz82_jrxi)WM zM!ffgz9Z`*=Ipma5Afchq#2xJunX_q)yxE4!W^|7pw?oXR4%7nu#Y}Z-;-Lm`{}1( zT`mLG<(w_n75X!K;ubgw?gM>5m*V-W1|QI$Zf#X>pI(JmOJ8L&--yy`nQCrd8TZjk zndPP)HkC8tHkNJ-*5iBV@VBQ6RK)UWG(QXZT~@FMuytc%;*p~u=7WEy-3 zZ$l^e7S3b_%WKR-Q3sj_TcCDc?YwH>J*lSD7u28L0(C0mom2Bp&AT1^`Wesy^i}VJ zyYX52>&xl+H3qW===WR+?ziip1P+0{Dqiaw@d3Jqwt-JzCiQ<~pXu;5Y=Wwwe&&0p zpWC?5_fFkMUz;)2^_*xmT7e4dP-?eValXKdv?XWh*BUr){% z=`+&9Q^RqYv`r0zQ!=Lz>0X+d5BFy8&3*@Gm7W#UeatHcfjP{ha2(6TFY7p+D z>aWiJ=mXv(@+Ro}eH83ZHD*$i(W7E4rf29@aDV=Vd4k^KuH7R-BSKGxpA6?lbECJ# zZVS$SI-%eMP7l8#(3qwbObgC0aCY38@I%25K@88;4UkPFv@ zuL-;zM?yz}9@qt(*=!BO8icv>li>a^8SFXwot`><8){3B!WOs>u7#<1#f=GEkKTvt zn00VD=ed}N><;e^PYg{AIhSHFe1WF96rYGS+6S3EcOuN-{L)cq(enbc0K{r(BYwZC(=u+QHTc<|_hf%nYb47GMOszLN48wb12>hDokGhf#)Zr$=l zFcEZ(wzguOy(y@-t8;z|Z^LqEgI1}>P94>lBMuJD@IH4x7MU@>^hC$-0tyiF!eA z@08?}iQsUWlA45-i zX4a(Fr1xj`XD%{|Al0IO-ZO{@4RcpcQqT$MYW#v?y!br-CuoQ4Azc!URy4 zQrBARj5w$Q=R-O#O$F}zyo&i1gTB1}^tbzOr}9!kpReoVKyV#3{ww7CI`i!F^Ue?E zLD@6570gu|Lu+^fUZuyv-@Cs*1M0IWYI*xOVY*swW?2!eG2!|K`M9ikngvm>)3?}Xn8uZQVyAasDpt82)Z z*Z0f!TK#V|vt^81M}T{rd-^zP*?J|^Y1L%|p^^XUk5E_Z39hl$CtXj~ym!+x_c{1% zndzjNgzhp+kTW~TwOkc*`%oM#VaaZEh zl2c0_2K&N(P5hehnM$UTsafe+D7WeK-pt;N+VE+3aVCLY1N(=~8^4B)5XDF4o<9cM zLv8@$4PRqTFi&?Lg}s%8JAu~bnlK3Zf^`#f7uRXym*eS6n1jWYbIuK(L1UuM z&>X748Q}WT3Vwy=%+&pfd524(6*Jgk@HahH*082AJI?#id%A+NUip9iN^h|F(@)u- zvI{Z`f_~o4sm`f}uq3&JNtNA_A?OO$-yQ(nzjrG91qIBgETtIIlUYnZFuO_p>3MJs z`ycrKx{~?emEjh8V@`uk;D>ACA}}ud9b7LImXKF+YeFeTQ*$(Hbk~Fa0QXV-=WW2( z_#E2R7FY?(@C+FHx*q9UI-dDbt{uj=gTQ>vp4bkcmgv{?c(sM+;C(QEA4MO11F()@ z9_PMq9_L=Q0*nRJ7_I5Kk1ag5@R&NPzN5o}zNN z)uPp+6X~`1kU5v`U1Q`W3$g{eb2`+tG=)zybK^-*aOobH++@xE)*%UIBd-u4B&Fx-N2EWFoVCmNDza zJ@8(5G4I9Te)e9tiCGbMfc<3VNoqA}cb%C_zqos)K&;dGImVpYk1inEdenVx&~f zR2n*_JEps3x^ePyGU)X?J9~EaH_q^|SJu8pwK{zuUgHs9TPl~z zejw|Z&NDE7ya=qrE(f1G{bHx!9dYK7KI_S`$+4TFH$~es>%V8XXSg?Kiq-||j>eeg zy6y$1Gr!M0vKUyx8DLz|8T5&mXBbCp zfN?Mde2y<;hJt&M_0`Vd&fzy$|ihF-I~dst)>1`-8qmU;i-hb?Y&h1!_mnKwlUO z#!n|OqiG?%g;#>H=PPh4sC}4^8H+wmKT8PAxwq5nQaM#QRajC;HZ!N>w8UwN0m%W$ z4E<)urH@NDg9Lnst}-V(Cwme-A)~=K?!7O=?Z51vn$+52yp(;damr=uEk6BAd82 zd2O<4s%midQ$yykz5>6&X!?9Vgx=sD^KSmT`5nR?!gXPLXnSZ7oDOsI=jI<_?vZgy zv;1cHei#Q`%A9T2lowzqTn&psPm=M+fAuiyYx<5Jg7u&#t}dh>$!Bdh)L|}A2)sYL z<#!8a3)QFhQw>SIsuT+H3WERl*La)!-m<*1;AdLOx#RzUz5uleYk+D{*5~?g7J^!o zT9ul%ag^)MPs~D4bMSkAVfL#Yz9#g)KW zg=ZBqGO(~KTnffenSxAk=6I|yR%jisC|(rTn>j2xELs&hLw~p|a#`ff@SEWYa0Jci zEI1kJ!(;eC+(&$Wu7mTySr+@~9rD^6%hZRKU`<91bS8Aii)bv`7O#c1gR7wl>}0mB z@sxFEpLOe!uDi{^I)WaI26$eLc|HMSlB!@`;AQ4r=r5}msTWbh+KqnoHH;074Nc{| z>0^1v@;bwMW`|jGF9LPNXTf~D4)`9vh5O-Tu=a2Nyg9lWkg=9Cb*&?so4bz~bNS4x zo$L8<{q<+Je_8F<8VF^@;58L6f8`3O4SER5FfW{hAKW!-7EqB5eBe(rgU8s|+T6`J zs9VFGa5-E9uJ^8K-s9f8dN}HU8nXMV{RtOy4wUtH|E@8k^|F4PfxLnqlOCxaDQ8%o z1}`OE3eG0jlh~7}1D-+tD!dMiPEGs-o`d-%oS8Z^b$a^rbRoRUnV7C`li&?_6(8Yo zrN;%miZz&z<^ActY7Dv-iotmBzgcE#z1GsthP&W8SP$lluC=bi#=mF4uCiTa*2|w^ zPW#WWrgTlIx`2H~dcySe_&VQ!PC1=&?#R6(h^-#TeIUqn2QWiLeMtX!JGdF%gZ=Pu z=;6>L{Nk>S7t@C~2ByJq=mo1`D;PJ8h03AIp>@>zVwjdHK@{)P!MuZc)(QRluB+yg zXVcF&EN@ugyRn|=I^2LcQEKqk^WW$t9#tC{X2S7)N(U;RV+Bd52+Ou$bM|($~jyxUo3&t@V zSqq(>H$Cu17@Nky`^vTNUe44p#_-;`j9g1E<2)O4o5|tH;S7|I zmXE3@T^+wVei}H7SHJhCpsz_C>Uyvi=h>knVGy*6w2JfrpXu(Lb7hQ#EkD#DzXMmZ zL9nm67k>|T!SgxK=iCe4`y)Xw!|C``)H&4Gtf3o^TjLr7>NGx+))g+JU)h{hEv*h1 z(^z{vAFLA%0X>haOIHWyK3SXGU%KDNJD3sDh#5^6f-z)MNaJTxgENk?uCE8|6L=By z)4O*2YiplsTmJbXm>h z^5fLUss8Ey>H9PHXEwlt*$1h@tntlo^^A%lAMwp>vOfhXL=Rq_q{=%mYV($W|lm} z8Pz|feoCd2X{HBP31Xm~B|A&HB)SA=rl@z1=B$F};SF#tQXAi#+??#f9K2_sBe=o8 zmU%5R5vpdZW}B2YDg6M9Yrg~cj_FW`8CZH}=7Ji$&xZGjv4DOh^OaHgqw?Fv+s5Y< z&M9<;y=VU15WgY*XzbD0mGD;dt>|g6oq4_I0+xnw5ljh92~C3H{NnsZp++G+1DC+* zPzkET2)qXR80~j?1HOZEz_`ncsg`8UWzXGn@F%tTdd#7`5R9$Vn_NHC+UJ04ho6l> zjf>Qs;(75vciTp9ubQ`Ohk4fyX8C2HUT(eMJOyY)_8^O3p4b%0)JH2S z>BdKD1bR^1?>++KdHWiUho&$bjPL*Ej9>E@>($1==HvR(-3R0gu%2yPbvHZ-Co+$r zNxDgTYsuD<9?T_dmui>F$>wCA=Iq(C@C+Yemgg<`x8%1Ew?`@ZFnnC(xX8fh!05=> z$k^|&7VNRs`>hYt*-h8Rt_{u)x1jtwTmeg%rP2W|4PP2Q1^UCZ(6mq$Fkauv{H_n+ zc5tn~86Lu`q(1BZr%z=MsDmmF8<*SyBjIAO<~b3@gPsdL(Duythkc;_q(6TgbB- zjQ^U0`J8c;-b~-yn?WC3KIjow^RnOD_gVk{L-5PLoJik+9wz(8A7uWz@sanKH8?M* zx}7yV|9$)CjPZ>5CQx^%KyQ_Mq+t&^>juEox8>X7P?GM`%r=V#8R;&68+3wrXcefEX+ z^mC6wD^y!+3&xVhzWQ6t8+<;d0di~5V}CXEWuH^)iJlE(UBDbbzvVN~G_Pqeo9P|2 zZ)^FkCFWIX=)<89j3t}G8fI(G%g)0QS|_U>_8}9#PAWSoIPc;%e6{L&)@qE$oO_M%uRu+GB4-5u3~EXP;ds!;X|Ae%GaA&P#P!nqrv;o3 z=8`vpI(idklJ^4hZFBOD;2L)3zjKF+ng8rF?t#ykPl%m9*t=Y(%>Av$ zxt_VNEkS2Bjyjcm?@#9KsFmx7ZUe?r#@q`bf{yOqXl?XQ@ZNEKDo^i=`JQpsccJe> z|3v?ZI>Y<=$n}vK;Tb`mt~cy2>I~-JpWvI=%*tB@Ixyqc_`~<(4Ke_qW%HtNPB=%6 z&3vmJ+V~Ohyn?3jrtyxTm+2X(1NX-7jVp3l$9n?q1m_WKif)Qd0nY=DMxv2z%)y)l zAB8?bP3s-{lDU^^1sn1<1lM~EecXlv(eLt?#>%d+$a~Zu|KCiA3>c(oN z#^vT=uY+re+Osju7w|2pDa{7spzl7~dGfCBcshpohFNz8p2%8R%X1^c5W~3f4${Ag-I{<*oq- zI8Q>)!7_RS*JRdY_9gZO`H{83X~}8Hw^MJYR)F<$|NKGbzo_|+0RIg&t5d+ZV;h+J z7=L>G%rm{W)VIx9TSrKx0nPz!$#)_~_4sEOA^5C0WY2I9l$u$+J;_BbMQ&<0jR-Q&)o$+Z#%*KMGfsGm;n>;Ej~eA zU4N0o0p=FWE!YTII1)b+Xr;qq!(x-*RB+b&H=H|NKU_b2Fmy1O( zzuf-d3<0%6>#RQe{Xk8_?=>!VU6=uCfAj6r2kU5)!2Y#QKu!83XbY|n{++&HPVd~a zM&LbB35bKc?ofrf18NL@J&lpg z^+a#5btG#zb3qS`bspmeH4JMl&PY?o)k9;={SSBo%!_=6%vtm#STpRB+a>p5<^dYh z+QaAG>Z}Dl7k}sfoj)=(GIR+uc8w8sg?EJyF#qp)s0U3zFU2>Yw!aQOgX3W?diX_< zWGL&&=uBn#j1tK^%EZ%`f}ToaV0FQ*Ia`AnrN*}A#2vxw>{|K_-uMgXQ83mpeo$vI z{{M_~B_9C&V_T_BwxVZ$2)GVdL-T9qU#?MV+vaOEnE|K2NKM*nV_nbnL9fz9&<|>X zz5?^Zb?^wB$Qi+dLEnaX$T8@|%%!J59qYf^o%Pml;6~^LEAv+7Im1N1{0W?gULA}l zdxd(1to0ngKkU8T3hvImJNIPh1-~%YL(S6OvBBWI=$>NixCE>bY(*pY`dkXNp*ooF zy~^AbV{Kz|?@|Bmm(1a@pLjEPC4ZGmpl6y=3f=3gNCYFFP(|S0Ovws_dYwcC( ztH@^ir>8>4OvhkG$}QPjve%Yg8}zT-$9$X;=t@82Xy`_l@2B95K0*iFsat}1#6E-m z?58n<@J?6_Tc8HBY1KQdskecTU>H;aV=C7W;~Mj`Xa40}X343~MDaTKemn;2Kz%!# zn+-fK{#$=BN89y!4?W4|sphB`mR?wDY;Me_kI*Xj=>*)>NcejFCs#;Wc&>uLQGcMfg#)8_ouT!nlSm_6_ zrf$BtjXo^n3qL;zL%}>9$@ZAfO21?Mjy;MmNKfX(+=;opnQ>JXEsK61`#$zw!FvUh z3nv%O1&7vt3qQdVMNbqx2Is;l@I&Dbg{xr%bSmgna4>$52`T&Hdt-ZJTcTT{XTyDw z`y!u)KMhxe$3l+|zz>!0sM3wQ=r!pJ-sxW0-0OKYy~QReG&@u%zI8p;gHdZ~J; z*_;vgBm9*7DfubqpAXIq=0v5fL7ub~KfAh{uca5bF5ir=Qymi z_tA^#U3aElQMM@icKYq~V9t{3o$Q@-Zd`w80AXlR(ju78^kCw_#BnedJagPxP4B^j zsRx5zx~|NTm z8!$GoUR6jgrbg!4a{=@O*OjWAH=~%{(S8DSXiRr=;-k1@S@NnPCNJ}IG1B| zXmrr)umc~ly;#>n1yEnL#-_G@2es4BVH9(MyMt>-60g=t`0+0W*OQ;|`!$En^al0^ z_lck32T()w*>P5tUpGGTed`Amb1DYw$#CZOo(D6)+Q0@PF@LW&d?k4H<(_hTf_}G| zqCcQ7GtBh-Rs-WFYdx;b zPk=duJrtL~ckJcn9>zpI56)n-_vQJpgjnV!F_vZy*-|^|-&#Goy;olroeg8D@ zYwq>#`)UW~tKM%dVGntn-)G#|2{K1BMD&vbU1!a2Ie^G|d=1He7p7*}te`G7UGRJl|+{bA-g>T=dF-TU-4 zH34I%4a{Om9ZenWguhoWlkds7pbo0{*FAD9y|ky(+t-|WZbfEWwq}k~vsAOxkmQiS z1Ku~$H(}4u*Tr84bL1M7H2A->#7fR7v6oKXfI%gLO72M9k$4(h(^@54CG{HI0*}G; z^z?L5rif^)b4K0sA<&m`7rY3M;nVvV+@C&VCLb2LW5eJ(xP%#Me}KLkbrH2*YvW!E z^(Nz^$KWUw#qdsS*|7aw5jQ+e+C`|=6UOf^Y0o%8IxS|@0{^Z zn3HI}sE)W9&ZPIH9jGDYfO&>-2&s!>H_Ev`os~H&L&+t*I zy_^MWKk9})8}1X`z__p#9$MF=|ABF}xnpY>4A;R}&b_S9IaJ0;{#vbRH%tNbbYt+Y zFcW^`3?qG*{`pLJ6V|~jaQ$=*>;i}B576uO0W1XP?0C~(!8vz-Ge6UQ0(H#Czz=KE z>Z1CZ)QQaPHi0_K1)%qD1^mst{12#~yH;2~_ZiU#H~i4JZ|T44_AD+Voh)+Z~gN1%TFtsRvUL15B8CqBY~gQ>tG(; z0*w94RaU^6V7}{mtyZb`&e+0d-5wxc^Db({55ilJ2gXFkNNO_bs~>^&GwWa9g0--< zcyzkae|sbkq=S@V_~(>JDv(O7{|U$@s1&XRA~K^SB>D-Pszavq#V4TpITqH96}6hrnmmeO{kO zC?^!0c^Vb6k|L0r`@)-UJ>xrzy}6CxA1 z^K&BxZo}vwy&BBjbHM+%J;APbyO~pP1#H0Mtv=;?VIJ=~P!no{vCc-kGivqb;qK!_ zu>08VAg-)I|D`#m`%Vd{E4prc&OGl|z}ndt@F5s`yZ88ahd_6*?y{f$H+3WT>c>Hk zt8tK?JD;#?+xJRMN}r|gz4_U@pf)uWZUVJJYq1UC0x;Ke9dh4E!Xxx7 zwFK85a<;U~hk(LaAV3}L2_`HQt}_gZrvy*p|$ z>Ub}6o~zHd_rJPwJMg}L461?Jrty=y`>f2Y;QWGjlkX;@HZ$3fCM8|}N{<+}%l$oF(uPyzg`cqHLoS5keu2VB04bJOujk+Et zmQD<2Ik}E|9nboAp3q)q?>$97&sA_dxVNe6>wU7eqUYJZSYs*kKKsPec!*)u_~`jW0&PG&q~t#l~9d+V=XYLv;kb08Oa@TA#ZFjHSkdnve0>95A07 z4PO60z<<~Hr4(F;%(b?GH84HC;Y>L5X!_CgdZ?PInn}U0*|E!5z2L3GdKyQk_ z*7xPyL+dIxl)E9QshAJ#qep!*s2jPTy0$sbXgB?z-ur6cJz;ywJykje_}1&&QvSUsG^R!4}TL zbVf?ug1SL3uYQsNu>mo2JUt|jz`^nd%MU(o@NtVOE~+@D!k7vl6@66nR^eNPwF+t# zEQl?LjgO9xwu!Wf%nZ*ATle@O|A&0{tJa`KrvC8n10Q&MdRL559tG=-u613QXW&}!Bdmw2VBT)LYrfur{_I7})wHI5J2T_m+wKPA zO7Bzm!**b;U0;Q{wRM<@;M(T>rB){kz>Yv-=)7xd+yxW!($KU z9LhO#*}=;W-Uly2w?o|y4S}6--{Jdw$%khgnQ>$w42ADtZSmS-eFc>gl@jHX<>|az zlH8fvnYuoGefnc~DDzOJFk6@{hpEp!$-K??`cE(qa1S1UuOY8oUf^MUpR=&jV4hXFFT9Qsu*PB?&3nyws2ODPGI^Ehd20tv;5m2&{Ik#DXXpeS zp%ARaCBZl+3txh@{dsT>9!xc=N_e8K0Xg-?8zreGu z)vbm^heRC)*(K5?(wI5bJ3>3?upbe+9-hyCK8US88Gthtrz zgc_2y*Ym(N=_^7BzXNJ{-UsR{*1`1O=+jV3@qW4htkYR@ za87{wzV}E8JsIxbY9(r)#Q1a;9}693lO-N)C{ zt9=<<3)VZXW*+Baa_ZL1ZStB}=iiP`&9$U`tbMFYyi433IcGTi37!7Mx!?K<&V(nT zPed;O{hECveIpma+VI-&%FxPC^KkQU_fYpx83~r}_vz$s#@#o;bY?%SrZ(;VtZ%`b z+~>?XoAKWZ*%z{llZ%se6Lo`g&zdHiCQnP9ma>@tMe2*x(DcystB``3nVFflvu_9I z%&Dus0X;yyyhT}yU`|s4|6>E@#N>l(jd{ZZ>td!+lNnzp);UpF55JoI^J zOKeN5b-Z>1TU)q)w-2D<7c&u})UzOPG5FD)IE8I;+` znJAN!latAkWJwL^QrxBZS1>kuuK2m)XG)$axdv_l6N`iJdgAq9eR?qYVDc^Km+F`L z2GrFzq&KAh$C1;=`B@X`2woqV_ZdDs}#q8dOnO*Tr2dZG|Du}%udZtEu+7-Nu~+i*b6dKU=`;pUQ>Dv zu9iPa%^h4v)H=<>jQua8N5QpUy}B*@3@72&a+Z#Jm37=_IQP%FMAqQUp}p4YK<~nC za6MErH!jncpnpzJ+(G8=8e@&YA8brz-PpX*^-$g1+;KBATh-5vLG))DXX!I|6}sZb zyYJ|IL5`uXO+T4FyQ18p+$GF@*b~|ldNT54WMgz=aK_3x@pIyf;jMzV3O)kkDdVX2 zPzhd(zZTb&J~TEoHVB-5c_N${Ig?8H36UDiy&T6p%@g7$#77p5EP4t&-@yLhmhqPH zR*TLs71)4Dj#o5aHv-`6JWd&uAaaKW1=t>RlSn07~ zwt#Ef8Jq!rIuwERh3#li$Cn*nwwGDI>QnyReWm+K3(E=v-Mu$D&rEz!JzyoX5VBx= zWFBf~-mp*dDDXAZbOoS8f`Ij&?} z$%rE(jx;^c^uX`?e&07||D65fp!R{<2hKTo&cS~0#i1__jXOND_fkN*m|_^}rsI zBQOotz&|h$Hp6~c1ed{XH~{|H8&Dly{kKn8)63mnVHSMLoP;qj z70!;F9r>!@tAf#>S#2#SjM)$39&#r{!jbT-(5#R@TkTNoV5a-pytTnRgq!g%R|D&O zdP2QEN&Mg^gZG7A$$RK?JH$+&s`P@pFS_^XU-}eQgPvStZ|^NV%*f5h)DzSlYttj; zd!a5$=zmn*ejcd%ngdviQm3+hr}nZDti5h4-Ns3>o9LWa6FhUTaVDG3!x1nq=?7{! z=iw1oi|Pl)0Oon_>tAp_!-3obxivX^*R|3i=3J;C*(3g^e!53F}(E2vGm?x_V@n{%CTjj?v8PS_82fSRB+ z1>;_|kUn7Fjrn+Wum{8%hI;ku;QC;FZXu{wUI_Nltq1>24dH$G7(RflPzB$Tny}AN zY2K{+8atR1TbnC{)9J%ZLIU0a*Bke}_3$H1E^iY^`3uR8M-R)vW90>IP@i?N9Hg)44+Wp42@-Z{0(whf-s}`2&Z+ z85+JO@4z5t_5KEtbR=DnDX;}5(=6MJZk^uQb93i1`L9>508VFba7`QsYVqa>*6Y+X ztYdj!`8@r1Pq~M?=ezgozwzbSP6TzKZtyvL2Y16=V9&|va5Jc* ze?@QqCtwdsJG|K5AL>ok!ak&OQ_MN#_Nl8URb|F*4BErT%mBCtHh}*=8H|gb06+g2 zs9pJe*3{I&`+z#2`p<5#M*|ym(3|@yvv|J&>vL0~F+2q3xcf`(56;S2%9KGp^449| z!(WAR;NEAm>blEQoQ|)_o*9n|5uZ^k~wt4 z;8NxzISbI4p`AmWLv15%BlegK;hf&-@#*n)h3yKL!E!hVCf!$ovr%Rj&JNBUcOGvr zV=mr1erxR3SVQ&fiSsbs?t|&I@Lv7+dRM z(BGlwwF^AKoQ4Yd74r3#{~r52wlBIbx+JnB$j4WPR)*f?jJ0*l&v9)V2wR!=V2#|_ z1>T455o)96%jy^P!MeY%k-4sU-E;6TxMsWlSktQnf75SgZm}Cq;%tMP;TI-Z?}D-T zq|Smd@E|B;?gngPfqq_(`kOISFHp;R9Nae^gh9{x6=U@; znawwX9z5f!BlLL_${yc{Ztp&3o|VmHGnLYn($@W}C#xqX7f&u;1;0QQW}!GcuB5o6 zcn0o)Z{aqmk*tABe0H)oJOG{dh){l8x-{4(c2=3$7)y;RUZGQ~A;7+uCYw6}^dRC2_Zh%J6 z8O*z^&z;0fw;Mr?>2_!g<6sc<2VSoW8P?v$fc6+8Id~*cNA6y_YeE&?|?1gE#bdIf8&lG8tPHdBbeK`gIU1M zU@*Noh45|ZZ<#7Pr?j4@7nsFsUwR6^g88!jOf^9NkA95U*RPZ)(^2Sm!nqPw0U%k}0{~6|cm{Y2Gn5VZz^DYanf&Fm-y7%aH`ljTYlG4XZ zA9s)afOA5BEch`vOFR)tL>MCw>j=(|I{;JSQ{v9tT^U~){}7%8*NY{f&)<2ww4_8g zL^ed;gKgn$;SHe;$~pZ1hR|=!DOPhdKdTO%@;c>NAJAvA4bSe3QZsOX?JYG5yf@qj z%{zVrwcM6qTgLo?sF<#pUIXHP{$q~seP%D5pYOnV%(ucCa6f7S z^}wE_^Gcmpij?wr1^VKQpY&1~`S3%uwe|CTN{>=TE$?3`I7O55~&zEypJ86D zC*wP4gg)2@hJyEj*Yj^+?Ry*;x2emSn+`>P*$LLT^kO#Utjv+{I-H2_+jwX!Bw#NX z2dS4^a~p*Z*tp63>NM`)a{1+g^H|(3&9D6Y0jLD#U*6lsPijqipc=!9ycI#u`Xl(u z^>Pn`zHl9LfAle!UwMzMg)I2@7*qLu`mTn8{xsK{-{~c@zUSZNYcT-S(I$bf*=E=W zK33zS2~Yy+JwEO};B(=+{T4a8eFI;EHG~W3?f3@&V13R&s0`1d@rIx^v#lF|&$Bg~ zgV}>w&z)ET-!t>3PNq&~ElkT!3v{e_E}mNlr%`*F0Lwwm#cqL)$2$f+vF^vlYkL2GV&cR%#EiR{e={sJEc63? zCLcvVin<21kGGG12A3CJUf3QkhM~{|Y+O_bbdHmn)Z?+oIbr#Z*skcVXd~DZ*%YY` z?}gtBcK~(qvhZ`k&jk8C-B#x>vP$J)coP=d+A zIORMz9rR{eyLO>{x8&X6ECXX8^`ypl8q}UDGl$97=M#7ZHUkny$?DwdT(gp9f!}<7 z$^5|YWNlBstNtrJ-KTK=O%u2s%n2U@*EL^X*Sq%MI&A#(JXl9DrnW}68b*U(ufFN$ z+|$f;-h>-K-9UZwcVchfj5qB2c?9&{e+{*n&8x;V6^6qOSPkl(e}LXPbxPyFnYo#{ z?%D3yWICDti}P$+gR^*yi>$}hghE)6Sds8^_5m9got8W;*#y1>XE&)cZH5ywCuVv> zLonaAwy_LeNxzb|*QFbbf;W$`>)+W-q#?MCUt|L9%R!tpreI9LKahecup0(~@Aqf+Nh{dO zx#K4?%j8(WvEX~G=XHjbpgww-vox*uSi3VXP_wECXMnNOA7K3Ax|q&O2l?Y%&bk{3 z-b8u}T(_({o{XpcNzkkHGQ07z_O zcooOt6~Ww;Q<(8&&C2z}o&oDb-b?OJYQN@kgTeejooFpQ1P_4MtFgbDjJ3S|@D*71 z@}Ag;4^h2IufbW=@ZQ3oZ60OpyQN@D!D->s!h<4%B5k8>qnE@k3Fhu5Vu@Hc&Ka)< zSAsEBQ)mf0nC%qfZ3;ArHiZORzH*LVh~?-!OT40;96 z#9R6y=q);oZ@v<9Dyl&XQ0q2cuukRI&jn)#VKx=S6_>8)73uXggamnt@>}5(``AiGuoV=KNF;xhEB>zZ` z2R-7}y!0m+!}Q?H z%ZI>q!5r%dxS^Z?O~9W1{`8VQ2gXu*0sf!|W)irM8tYVKZh#+KtFflPg)^I62dwSs z4_8a__x1#9ZNtHwvkP>CIS_%4^zZJ3W_iu>)b!tnBj9s$Cv=9Mpk8R4Ydmbctf#_S zMJX7EKkY{F^?w_Tjkke0yx!EZa6X*K+!UWvUdmw3skM*J;5Fv`rtYb}Gz1#LrC?s? zUj8|L9&-fs=?EALH%&E7U7ox=*(B8@^-uDjWQw3(U-=IKVv<2?*&Ss%a^^gXSE z-f%li2lsgM9PiOF;5}(Pbw82lJ>1jA0GVx5jXRK#1zsYm!ZibU!a%6I(Ca9YxLWxjCdV4=(M!GeQcVHNt3Fg_~ zQk(dKna65*)=)2l&%xZ{X*@T23hn3G2IWeXD`lQ{H>k6@Mj1=o11&)P<^-^obuAc+ z_}`VxA9io`ac==*>Tcm~;f~N5&SJLc8=OU@c4gmzx|K1*L*VPbl)3-LAm&)E36nry zfccv~hZms^=*8#?dM?d1jlaf13bTWrCi83SamGXDo7OM(z$c*hL+#7&H#T|+E(T*N z_Z!zObJ`z3&reS<4mJ-g0P7)MPZPoGXBVhB{f)oZ?=x1OhquMpsTi!koB|6$ACZ2S zCe(PX_3CLcFK%DbzT_d!(KyH{v18I>(u_q<-3|9A?oWJL{AuxQP;c4>_Vbz>FD_nO z{Cwj1#38W1ZXwKo#i_+XoU}5%GF_A{qLa4;r>$(rE@QUgQCNT{?Bt^-2VVO3=`{}> z3z=OU^R+$?jOW$3t!CV}n)CHA9{SN^r#@v|qc&9b-!qJz(QI$T2VmW}2D}Hif*M6%h=Q}^=7YM3 z|Mh2F4Bf!k$@omKx$)YE1s?|IPQA}8s3$o~Tc9s&3FOX=VJ2_LC-jD~P6xCgi=U0wR>(&lv^fNR@)(9h&L zre0t@W*vM2YHX`xtI2#GkJ&u6IkK54B-cjPhS!Gog!Y7<w5bZ~AoX%dQWu)vg8qaMtip=nckwt~LJsKAwZ1 z7s)!>cIuMW{nx-R&=<_T^hoLxD1sYoj|*~@vz4>Xi90cIVqyqfn!GeQJT;u?YF4UQ zx>@?x%&oyJ-ruvo2OggJ^tJjs)vhd#sC(-nS6kE*z8%z_Tt6zoE#N(>*5aGqfKT8) z&`YA%PMyX5)cLCBXU@#9H`DdKJbmMS{1m7ysfEv{&)oQ81{he zHRmia_Vl{&IxucBrn(C3WpRy~0&jwP)otK<|0L)9dL0=TSeLWc*L!n1-rdpgHduRB zQy2o)0lizLC==l-ugx2teh;cZ2? z75!THE1lV26pn=&a4>!_ejl6(`U&)I&Vw&Gzwal`Te$;6E6&t=W{4^SgE2hi)|8l3{~r$6yM4uG4$Sj4c9A^4nD z2R$#o`E_f-+}i#XV@I#MZ#XAmaBgt!7v_1lg&Wg1rmYB*VNL67fkx!ZDI!(;FxG$?6MQXNmM z`;jyLUIt@T<3{5^Qpe-gV+-+0c#qx$eL=0s^;KQw9+(WqOasB!b$NDqwio_{<`Ac6 z>j7ph`Wkr;=D=L20zDfwnae+$UTgK~m0&*R9=kekb#R{CG<-_#>!U$Ud<6_C7!qhp zl?p0RdAlk&tHpZX^I$EnfVXshI>;k`r*Cf#oKSEA(|yYojKFub6uQFF3wDe|dhdXs_t0u~TC$qAj8`IODA{3=R(t_oE-Z z3@2K-me&E-?=Lws&swl~sa`652YL$he0rZ&f=|FYks8(&;C(b4{Zo<1J?5tHO*onk zhlfRmMU0I`#YP47xL?!sl=`sIgUpQK3Py zUXa4`?_Q-Yxs7vd%-P+uSAzHW$Mh4q|6dE%EZ=}5$BqPZ9i8K8E@R#34DhiS4;tJ2 z1jbWp*d4(BK-U^IrjwuujFlc@wm>z=lw^Xu_iFlHlh7LMYtcKPt1KyR;cmh~IGPE9!9QvKp8Fb^H^*9G(mw1)%m5?qtIhKU9JQtMzj^YHqEansvy z5?;%dP%Bp}cYVqA!P&{y5niOmqbEZR!n%)Z_nn*>GYRbRRaY~f*ny@zi!)ps7d9^Z zojDoyFHDS0jLnVCWeV?%=)=%H(mwJCEM|6?vDog=Ztk3Zq2J&r%>nL_7eZb7c%OkQ zA)BAg$1+pk{N2Iu0GRK&ezXO(>6^i|pbc2pe-V0tHE8es9O#Rw3hGE|PU?O7(S2TB z56mrn-tPtTh^3(JbP{KLKEUir<0RL|h2Z@mtzbAfC&hSYAYLb5M`JT;}D)%Rx`KG3Q(0di5Gy z2Mo^OE`+loFgyg8Jw4^ygj;FVizyk-4X5!+-sd zzj9`eHEnb3k)Xb;=f$=DQOxwXTu+LCynn z{jb1UhxKarompT`sb*vxrOxB?8-{JquW4s|XD}Chacps{ALOFB=-r@h?%RWr2O~|u zeaQeLQ;-S#ZCj}Mt-(is9URL$Mu+yeU|+U2@k^IGPT4wW*4>jm%;kHKKSQA{lfUinH$+$Ha7t;hFX;I$idvf zoch!25CZ?rWMLENT{7-@0`zS>1Nz0sKzZhxxTp66W2a@f?@wU{iffs^%Vl8Q(7N{B zyhi3EAA>sgxuAC62&#a!M*ZckJNg8^fHOJw)W>sm?&{nlsYg<;CtpvtO0`OT2wgK> zGlyY#c6hckK6W3Ik5#{@HA#QpbZ|Y}07LQTsxcUcm*ET;ebPs84`)hef_vJW$32=Y zD5yO(z$g6-xR$QRW9HxH42w;=gBYuBrf$ala3CCj>vGrST9&jd=>k6gJ}2tJ#K|k8zHXvE7qkz09~|A2ms18TUMEYPUlhcn_?hsX@1mwT@C#TMd=ISUEd#wzYVYP?-Qhg2j(82|fwVSijAS0+Yh&!Au5G?G6^xHQ!iQ!* zoBND=i}l%wunF43b)~NhW=TASwrE^sE%#H<3#Zq~oa#cb?rRKc@O>&X3yg`*I{t0mZe-{)~V)XMG zA54XnU_7Ds#afZ~w|S8H&RQHd<_k~Kuhp9wG4@WE50wwS0{>%H^7PR3kgvI#wXv$3 zOi#{4Zipwq8r;RL0OM8vY zK$Atj%=5k(1hpUv?oDTc`{!Qf&8d^W1n#X1z!+*Wdcv_3EO zLcKHgd!}JGo~v^7^}2_5!T&N1egJz?tj{N4C8%>h4{8Zzz_%|!-DeeS1N+?6)o+F= z`BQ?~mxuBX+qeN%lr!C?j7L$?Asi? z4|?#eMNHtV1GULsoJp+qZ9ZKguR;*p82bza>uPFR`kAaHsvE`OEYPQ*&aNKf8dwSa zeL>!WU~cB@yxGBAmf!Mz%i9HSgL{nem+RokFbLFrnuD*exv`!Ry&`%so`zT89r&+S zVqMcU)7tq+X3lsGsdpOp-vxs}oiYsOI~_sY+#Jz>jl=%gE!fWshTn~GS_ArrmUD1Q!`EzUI zYvb30eoJRJb&qzB)&*mzW#MJvdT?v#R=V0x3B6wMdhptM@2$&QmuItwYn^$ud7bqO zdrpEH0X1WDT=N>|<(b>Kw(9RPuUbqFw-IK;+wcNh3U%NcNKv;pZu%AOfypoumVo=S zx$X7L&vkt^?s^{FyRGXPi(LY}p(hN5ws048hHObT(3H+*POtHszOgsJnCBVLpYGpP zo%xyes8(PmuOGXoG{&o`C;z_~up?UdXwbXwzNFsknphR=V=}+-e)M@TCeoMbTKF~R zm#cf3r|PAunyDHL@aUN8m>QcNn?93sch#6H<|^g}!cnlU{txH}dj)(he*}Fm`htx4 z)jqxF)j{>C8f$&STy{0+I(WAUo3aNo2Qu~2_0q;er$GHg{lsISzp^hB!%r|hIXzh} zRW3MF#hDR$UZ%lBW=7PdZ~jbp72f3x(V8VSgPAl)mO-xl12Z(#yx#=(YHLEDfgT5I zNqfP2X$UNb>7ZUyjatqlFdEb+{s6TDYwxZ@t}E8@j)7}XeR@px=kE{V`q$BIyMfx& z_@ePeRm)T@<5>sxf}8-=v|Ni^TWf;rYah4;J^|MVV<`J5T!SmY?V!)QJ?B5^ zt#GX_!WC)0ZvLfT*4`6in$l|7tO?J-7I0lqpZp(Q!7splN=-*!hB-_lma(O5Ws^f<5D4}nj{y~G^Y`$7%a*uXqO9oSsNd)Dh$Pje|S7cuU4 zKW$7c>`u;eZyIVE%7(My!_0vj9UUEgHTG)YQ}SG=J+VDZj@upU5bqG*9@`#k8gCkJ z9cvxT=XE&#nUOOC&p-{d#2)nP48sSY*0TizF4{m;N*Fs~?#urw>LQ?S2>nmx0fX>wtNc z&&^!8oW2n?f8(O_flDgbi(PZ9)%i2M$E|se0pm>d@eer5+k0~D(X~e>Qs2{eZB4D1 z8FN0ydYohZH#0+D#NTv17>B6|`h7cL3AnC44g=vE(0hL=UN&D}Z*J#$WbC0{yoI{yS@fO7!B|N@ zv-#aPP}_ML%<&Xg=1?Cq58DHNdoPwVrTaXQW-fKBmTs>kQ_%;9FLHG^UK~v@w z_!_Xa26^1i%vSO1%>{-+OEB*F2#kCGVV3vB==o>o&gN9~4n&~ka%usE_*(|U4E$?e zqvlcz!Puip=_-NVWB#B=z}Sb|tF)Sv@zi!^?KkC2hKIm)Ph9KN*^R-xhU}-%)8IN? z1JtIhb4-K5%o4wd8lE+gBx}s!7iNEi5 zaD86_-a8$^{@@m1jASnD+Gb6{wa}QRi20ZLTU|fZ-=AR?runCJ4SR`Pw=d$%mrLMm zP`9rIu5InW>vRQdg9h|D8AI#^{if!hk>ioTE2j?G9n{6QfqA2zTJwmT;cA$9Y-Zq_ z*N2dxm#{~=NBS~26JE}|oC)W`bfL`5sj2DVss?LwYjX>;3$s;WJ2QL3&>+r(yOo|Lb^nxp?-0V<{{rY;7P8P}z1nQBY}pOk5xZ5_l)-E!S>YJ5H67x1-o zPjbIiUo=+g%Nct)*1iOs*COu~wf6DgdNK*@XE*mYcIpBC*BX+0&yAeV=Y4O^ zJ^-9o(G<$SPw*664z0kL$+*kdSRH#B=zH{9`wpz9l!r2)SEUEs2JX4OM((@nDPGsc zQa!-EyCVG$){@=Z?T4@~Zf-Lcj1j!>d6#7CgGxR{#l zbWm&B!1;jsNUNe->S1`8nIxi$xpUj3@h|kP5Lk-IBalcpRa(0J4G}i=wm+QkG=99h-uDkAw zYhgSXcU!;J7iD~K2yOB(_%-J0=IB3z{lD+v<#`yauRR0$n7n>_M0!Ma#C8OJ*sigz zf!E|b=4G{k>YP>jKC^^A0r!1mhXbsLElS1cpHD6F{JtLi0p{$ zJ(+tlZ>8Q!sU3Nq(>vhorj5lLi?2vrk$4!A#mQhU!R*BBglkk0*vE2a>daIp@J#Z$ z>AJyrbSp9|GFN1;$o3cdewV{uSb#_TL$DrTZf!p8{$$*#cDD=WLj(E(mxI0&^O&ai zbVk5(xSxIp{c+yoXM%ZEP39Tui#Pzr627mlw+Ebep~i3?eI|vV#`7^$4?5GU=YK(O zTRl8X{`+R?W5y@?VAQbu8g(Dzv@?V3Fn{yto8rW*M z3f4fq()CK~2VcRAJ#}{D9dkZ=QmumzpqF?k`1#tL*Pfyu+|Qc_MM_5k?fqk%-d?K@ z;yX~I$}gQCtc~O7lTly)hxuUcBj@4wRFC=zP39HY#2J!Rk5@hZ1wCf2LDtlL5NfyP zQ108_XL|bFb6wla4ZTl&E_@yKa?ZHxx^;@?vF5?7lQQu#!8t0A#2<;bEo@s@6ZBSo z4|+;mvxaiU@0|FYIO7gac&Ge3<;RyBU+%3F-a4UCnMP&GF-zr%!Y2yjye*0@3hIZ0 z!h?c&ST0EBlwah35zMi$erSE+a!^k&mbwV6*QqDFR=B>XZ5ylH3dX`WfOR)#d5m{{ zG8hj%0BTJ4gL>0xV6M^@UIXK)HJn{ggSoxt77g(Exwc#9yAUcvEpT5q#;O8iz;*MZ zl8*up`up_eTL)CD`T*3T{F~Z={w6&e>QA#kfy4U4Ot7EDJkvNqeuTkr0kgs119c}o z0Ir$M!Md9{@13B&I+WVmAh1T_^P~5``mH`x<4)s^+_7BHt1=e-+r7~1*SgCX@Xfl- z5^yh7Q@76R_xZCE^l2JHS^xiE;(v+Ti*GMpb9l|+4o5m1seics;k}3U9_o6y>*4K( zwjZ)+*csYD?<2jB^nn8~sCZEElZhvT^L#xs`qk8{sXM^FmnG>X>6Mw4!F-2N*-_cX zxyGEFJKaAy=X16htYtn6+u?G~?9u;e0p)ctHrNVYFPAX$TVGKR7zg%tc#)i&e=g3z z<$+&uI5WaNf%{=Ic+Jg)-C+IRI@@{pjjdfj1nT0(Grxhgnp2s1auIx<|9O6M=EFS% zH^HCGt1~{E4<|8q#h>jOq#xiE&@1rY?>#+sdaO!Om7)-hXqbgWzlG9%lVp zeH!T{m?77Xd6Tb!*P42Q^@Ofq?Z&mEI#^TM3d7-Bm<8sczA#>E)`!jk`&RWQTW2%g zHNH^;=|W%c9n4NNkI?UIJp3w@rGKMyNoP7UzTkAn8NvCq^O(tB8xAwb`4FhhY+?Su zyPOAlH!~Wxy}?BJ25vgcRw75zwx{JI=#bO z(8l<`KSG%_#&wUi9$>$Y-cNH?b$dOe%ivbd!`7#xC+-ulzN=4PKhL9ij|TU#H7(aJ zW2kFk0Jv@)p$E;+tBo(@jB9H%##V>ncl_G=D~*v(0`n}N@O}8yNcHo!!+`t&fmg}c zsRO8M-vh3Tt@2w1XU)198Y9gCV=&)0{<nqwUG!h8 zi66o9ac=2z1OJEj?p|uu`u*%9+?UyxxsbC*XTzw>sEm2|T4+pP)|=pZVBPRVXnCw9 znO4QX!(uO#ag*1FHE^$y?ey2}hTlO==ms!W^56Z~bx!?nBlvv>j~@*BfzA88j@QB8 zo<+*iXn*VfX^V;6B=f$OjOk?XbV&UefJQjap08VXC{YM2FTR(dCl zn{ESj*g;_IW$a}AT5smZ%;1O}jRm#4ALy|&X7cAg47WgKW{vy%yMlE*wRZn5@2}fH zJ^to@&jK+=@j7`A{Jixz*EI8WwO{orb$N4aYb3@>&MUB%XPrO|&b80iH6Ppyp9Jf# z_SqRT*-M}%FdKZ%^u!s5y1-tCFW5B=SvSzh?f)@9G#>GN7m6mZj+#Rj-_+xr$#ib! z+|0Q2xO6BLO3h5p4D|4w#XF1dg9nd1cx2e&VTUUptbDNQ-&Ozq16mwtabVuTc?Vbj zv-+R&51)Uy<&l<0Y8TfouA8WvsFJLb?3?PFs=!>#`kDHfA7N&8X7>Hu`?(TO@0$Rb zqnTjlqCO2h5nkiQcYPoU&Sf@UG6(&Go`QQh16n=8b>m9TwoNhwp*3g6HG`>8kCVao z=I_mKL2svVk9yJ$r~=jDa&QiT`jRnGB0mwtL6BrXiR)AW$ z{u}2!xyJ9KAJ5T7bHTn2r>9Hrs-j}mO3yr zFjP5QIs7hXG%k%Ujn0eBi}i^2pgPwyelNTTV`F23v!2wNzKMMkyA~!#Cr33Zd=dE~ za+qG1U*QJ$IrMXACX6Z=6`Wmx%$k2DyoA5s*TNdY*>EjvEVVK4Cf|+M*7$SX1kFpqj% zW?bfLIF<8-euhIZE;lY`4%Y*I2G^P-L#)+VvhW)i%Njp5!Y^rWn{lprzI%`Na#QFI z#=XYI1Hjs&DTC@&>52{Kc7K#!A+7%=g{f<}qu)eakgx2eU@}Tf7F1r7He={()=MYoJ!+y{=C{ zADP#(H8Ag8dm)`OS}#&B(v`DHcGKV3hMqg~Q`h;uoUN_4y*|A@y)(5lnt;524ac`dkqZw6z-G}!m2hVmBZhw%RF4YR;CY#Hb0svD@2Td%XIxC8VU*pF*W zKNM!be=(IYzj>hhs(x~HCjFeoU4CreT5tFp{F?7z2;BECec6rof;I7{U>^AXU{C|A z1iqaIx4{NxmQ90Sp&DL@H}Gjs1!Kc*@B=Ib*JJ$xpMkZxC#aRZ4%YHqnc)SSH4_hDS5Az?k?G$iN%)T5scAodMw9s}58XU$A@Ocrf15h@zf) z2k05Nkh#(3VdmRv3@1Z1*o^036*NEIJhAA3LcT>QEC*@b5pP6U&kPDP!HMih=HYzo#P zYQVekcjNnG`(r&|d~|%Y4_pVoMShFC0kiO6TBEoOriG@3T7r9uxup62{=EIct2mc= zHoj)oG5-Yb(`WD|{~GxOgQ0^#Z{87R?HC`s*Bk-s&<#!ob$qp? zp70g8F1bHFLEU6MXSJv&x^5XCJ%OiE4g6g2V?C9wjn?V(qZ%W-9$H(`r)!+;b77or zo@i~xd)Iq;8u*+y$A_n+t?>|!xO*!=4;qMM_Icz1p6d^r9SEUuE$i}*mdX>dd4=xCa|7W#5~*jFb4k9d93NH|C~jS ziUH!AoSRvLIVWwQ9PG;96~sE`64v#KU<53KA@C#kaYfhy_JqC&i@^F$U3&1W>20M) z_cO2${J+^v{$ArOe~&Sh+SFy>{;bB;1(1{jEj^MS3F5xRd5Z(x+;#E4^)R0|eNpO6 zYvDusOuo+lI)8m^eav~->cDEi8)6%Rvmp^-IKWR31Km<#$ntOe=$ zJ|8B5Yohs$>yWkU2S80^A?Ur)pK6R;o_>2{wLh6FIgP#<%UkZO8`9AVb^dGv2 zTSU{aFSakHm(p{dZU$qfTVQ%@dh8Xr9y&xjL|q{MjQkm){LCp&Yr^ZG7=LpINK$v5 z3Okugp}%A{epUD67eLRc*VQ{*%TU>R0P`2u9b@k}-jJ=-J-XAc}XJbJkRSz07gl7yVejtGx*7-SQ*2X1hnY zCLfGfDF{5F6WwY16&1r$ivi*Tqj&Z&W7n=?M?lt zBCIXFHkhAr59btk&AV?FOu9M(sOhobK`t&e2%;h&VU8v`Q~e0U(@NkG{!NuuEk7>Gnrqg zR#Y0SQUAhB{9dVEsYak*_E)HpsgZdLW@l$--veW2>qn0<)20`F6`w#6o|$jy<5j14 z15N^co5o(oS*~fff-#Z#i2h&e=$(&u4*Is6=QYnWx4tfXUD&!=&3MfqFKZZY7){#jT&L<_Zg&AVi{P@@Wifkv>%o-BlpqH_Epl3*IjJ>$TJR~S47?lU z_U7Dw!&6`l)mpXB?-k&^p&r*9jL)qNo0~ijdREnV)5p?5EnaOT$<-M4?Ky}@R@o2_P__Cj_f+1#;TXnSgJDEr(({m&vPJRjylaf$J!*ZV)bUcse`7|rev`XkEnG^jYyF@xb0Mz=btU5? z<1BN^DX<58E-T?#bZs-9bWdyo6QDl~1Y=F_@u!%NX$@H)*$X8vlzf`~G;6GMQTn1Z zDQ@ykcnX|Lbrv`av^?Ab&%hY)?e65=L9FEb!)>W;9$%MgpKhOiF!NyM((I+#Q{XhX z5U@%Ul`YQog|ToUxDO1?4$XRh)Q7X+DOi_Ymwq_&aHf5(ea;%9bGG!4d41c5Y0uyk zXht9PN%$hvUd-3bx3+-$n8*DBg_Iq&ZG6Z%c64{ zSA0eO;Cj6jFNW)h{;=i|h&GRA!8w-Sfg1UW*oxSV;8`kqXf{VT2WMnDm*7NrCh|;V z1WXN24L=`xKD4u7XF(d?f)n6d&X;%rTqj(c`U1CIFwe@p+qVyyKdX-LHmEVF1z$wp zy|rZH5_2Tic6H{r;eCCLXx7% zo|BuCy94fomf4osUFltE`@FL_%rm=>m}?Av%q^T zRuU_*r==q2tW*O1p2n}%UG2v(elR9>JzNR22L)J@Gj3FGa_v-$)U*8wa|n%}p25$g zw_AVh^`N)zGpI?AgSnaY0`s#~U`%BUrANj4wO#3UrB`rffipE`p}+W=d)=z_4S~Jj z^=%!iGV|?S8}&QrN4-3Id3G{q7wk^$4m<#Dl5LVB5+gjuAehfIIWal074$Q;O}0%o zfE?u0thP0^HT4DTNbg8DqgT5Mz4Z3NjsSI-8$r*pbz8NTz?(!Ys6XH=yvNqZ?|{?5 zc)ZUX*Z^RT0( zkCs+ba+XSe&}(h}FdJM)^{A}|>vR6xdto6MTiI87J6s9AemlT@U5(Iq$vwvXb}yLg z>YX=+z7n1Wb;iT^<=o@F()9kD>mPuxpc(W9`{T~$Jm=RyUDSDCYT)V#>YZw<=4_u+ zt2XZ4MDO>i)T-1O$up7{rY=l*w%5a{hl9Pyy6i2S+x$KB%=XMy%2i_W$uK&T-pzdv zURMq9G`qLgp~q|*R0Y?xcBR^tdW>_i3PJ^;;&5>=Td+Z_L2OujSiCtL05ztDMGcGU zz~REfg_~dyyaL1H!{Z(hG9o@Au3qkWEc>JT13kP`q*Fu_@nvu!GjUo&Q<%+J0%`!A zp*GZHZkP2^uRT3sYJJ{MwefyE$IOnU%)y-r1HtD{{lw>KK3J!#4)=rk>ouTeR1UoN zAA_f168r&g!lzIzzgm8SNQ20a;UB|Ypnj-+Xb76Z#b7+&2%nxaBFcd^)jZHMr{ zH{k=YPHU~9J$OBD!$+6_CJq#j6B zgC5Bq$)$;aPsmiI7U_^36a!qPY%HF$EU~p!zsa__O4Q0E6 z>v_jq$6Te7N+pj#l-Ul>YfzJW6ucLFEPA-yqr7*lGa5IpU@vxlzBTiC%+b6cdqHr{ zV4Yl@ocoPhp>bvndIr@8)G#~HBWOPKB+REbLA}#lPmkm`ump^So`Y_ne<{#E=nL8o zTj6t1vrvOFUb0r!4?cluU`?+=s6uEEHM|bs9Nu2=AXvjQF0+QGf9fIV26{q`i;Ryx z20abO!L{4}`gJR*^=*gm;SqQfrhxUzb3pyvIYT!yQ_3~nJ!UHSdYT`82j_zNx$C8Q zqj8Y^yXG(E^w&72Hr4`FXJ2sUZSQFBXy-`h$VK6c!u3M+Lf;g8Q*b?el>bo>gR1Sv z!FxtOrd~;FLi!Ni0k2=*%p1%H${Z^b?8)7abr14C_h;+JKQdcJ55_>wj5sHJPIwdN zo_H|E+}PZhz5si5uZBy2tv^;2FACP3E2+xqZTcTniB^doi5!W%2n*<+uLG+?t3!j~ z?}EPzzJm+Fcyuyc0oF=(qqDllySFF7`@$NOnyp%X1YXB8?S1Jz|H#otf>}xGIr?l~ zf%?z`%&&f@7sbzC4VjWm5Z`-Up9N}CdzfjWhN`~(8=T1e+#5=6AUl36n6qoFbw5l3 z*KhMQW6Y6o7nJa3TxHy&uB49b-((I^1x9naulLh}?1CUiao_NqZF|Z-hA%lsWMOJy za4vc@6V3butFx=KU2|P?rAkVbTn=od!Ca{M%%yW3YX`HyzoXT$R>umC7aVsDo=4ry z`?3O9k1E1D-V)4DeO}cY#=)7T&kXj`fy^0m-)#xTMwfzp4%Xe(jce!C4)*ap-b(Z4 z&-L*=n0qj%|0qepvk2S+S0z^^&C{GQU?1-Tuo;}e+Y_DvbG*M`UTR)y4xGXKlne}K zzUmC<%ZhPh?#3W@vzNL%EQ1^H%=&zrt6O`!5&W+;H21lWV;{#_!Pn8RIXS0(^qN0<)Ja~JzNW46?|2ofNb9N1^!C&s`WVSJ_ohxgK%!axdnrn6{jcL zwdqv)fLA~#Py;ys-&sP&_kQj+P?yrTq_?FEo`9y{TA?rC47eQ5;jGPzz;#ZYc|QHQ z`FZ(tOP9_|GPlpzR4u9>7zeQx1+i+bRIb$doQI|K*O&-6+VGM6^yRhKqKaxJM2 zTbQM6yx0@W*9U;HhWWX%wff{7XbZ;OYES0$qd2?J+V^sJAFOX$Be|*6O~L;AI=&~8<`z&-!cVyDw@^sr=+uTdke%wFw*Sps55A6@V!};E0qhq5d#ZQVm1N<52 z81EQQ$I`KW@qRcg_Qc14YggY`-`Mi#^5{2kBe+ie0eS|k4Ll64uO~uhx+R-{^$@*j zJMpwW1u1&2jdhK0o6=)oEIJjePkX=JN4@WU^lGFuF9${9S3Wm55i5HebWtI z2KyDB2Yp=j?5L4-f{);0&UjP4RT!zDuel%I`}2vo_G$JQ{RxgA@>0E zgtqht7-#$1xIR||Jyg~q^v@5Yb}$aA=T#4SWDjyCP&52eZ$o?7hY#~F&n19Mm{YE% zv=rR?UF#atvuEAzMfe?Db3X>xHFc!Ma51<>dT$(sVpv0OaeqiLC+;+6#I4C&6U0;I zpnpJT@G-hh+B^6f_;E|P5Q>?lWBjk~ZjNhAWuDlC9J2s+(Hs30yajp`UMclTkn8*L zr$M*Cr%ZSHBG3)2yM#eKy(#z_d`$0(9*9&V710;DF}g80zk6DETF@_Oe3D|etvRtd zY7O|3nJl%y{L{F773Tw~DO>yN$C+o?odfOnRQ$tz@S0Yjf5<%R+wiyH-I3jqZP9Jf z8L=6$A3*QdGPnXQ{R38-sOmJ{7FV>TA=%wdrh7U$g#Y z-sE-lI9v?gU4dC3hQs+J!R)n3)UZP-2UG_{2Mc8)GAtoy38c7mQ^LMN^t+G_t;MtfpcLL=NWkYSxfn| z$N@fMtkG9fb|^FaE6^tIrb1zQqZcoe%6p8aDm{0La#aVJ_0|3afCXJ>ybLP@%+NV zg@v!d`1ttv(%912?J${hex89nura(b+y*X&ZJ;LFJ={HfFK6}kg@BT<$V}3S+8D={{AG`5YD=-%J^;0YC3~F)9@WnensTtb8x}oc^ zd%bJ1+O_^{>$vXsSAo7S=h4*%-@IMiF{k|h1bu1P1Hn@J9 z>lnvdgRnk(CYWC@0sWGd$zKQ0Y~q^fdVXo>($J&fN5c&x4I`eZ=M1zIbdPn9QI3u~Kcyb1lh=sV zz@1k&IM4T{=uOd{k)Dw?cnMa*97r&C&KIE&mKQ7!&cj&5TvTIWHPQ8X>rtF)<~_!o zi`QWu7_WW^WvP!^JM!98D|s5!$iD@(hY6hT`X(4tnFrPe>(6R5#uq+^=0rX>3*lOD zeL2G1aeIG_Ka5XZV?xJ5!CGfuo7#{%m204N?UmrqKfw8RdM*cmy44)K0DjIGcu8nU zXnbURaNbos91s65^uJI|2p5D4&c^5WIA@i$hpu3b<=*eCl51c)Jp!XkjSjp4YHQBc zGDh~bHy+vndV01oi{K-80@wnXn0v-?AG?q7tz&NmeaQNo#^6ge22fKsc3X;X!8P2t ztOMR(bpU;x(w*2}tyFE#Yu%h-3m(nu%^C#FwK-vU#?x?hKEhwOBi3A1yv1FdN* z^Zu+8^nsT2Ram=h$XPpTY{q<#m3l1DGDwF@sTaAQd9S?y2A*C!KZA9A;|F6}_igK5 zH^T#EK^O4)FuyeBQJc4xR|`6U zeJwA5@r2%n(cr&thfQ!F=RKMW8AGX~c)hvbsLekObKna&A@77>UHrTB-+{(!jbRhB zGSviJr)EPT=R#OdxewG3D$}=XPNNPJ_*>Cm?P=2Uqh2{4)M76N?@>SJ&)Uej;}!Ax zejWNc)H>QaIy5pgvOT;#d;zHQjw~1%%>C8_xh1kC(m&cix)tov?N->W@a&?qi%y5z z;VPI=IHB+-cnkgqVOSSmr`#2PDEd(J6wudHDN-r&a`@%&m!U611K=*WyWnoR9ZxDS zZZ&?@>-8Hw*2YU}Z|ZT@SvXkY zKO6+(s0+Zl^pEg0=&PK9-{w)!Ltq_2@0e><3d|LK|1VI>o(+DDd%-wxUvQl>FL@jE zE9gV}0X~I8unV?;J_+|6Z?X^3#EtiU%KntSB7H@AN@_}~1j?k#q|eEmllc<*Wcy^* zhSoz@W@Py|yMTL@y14o7t#~rsQ%jDQ93Rh2O!H1XLe}|Q8{JFwx#$GHuVr#pHxG$Z)H+)QqtI{He3K|+>uNqa~Z5=?(Wpg)XYQK zhq7~^Gc$vY7jLJJ=q<2*>FePBI+1x;wV7w8-%sE05LgK6xN5pp!F$Vit_akuy;s$N z&2_Ae4TY~kPoZ%S_RiqE++obSpiD>?$6fh5=uKf%PvOO7FD^U3%=|LFih31&Rrpm9 zYpMBuAN`(_UYkUl!XxyD{>J$R6QBviU}?cp90o@MEmiNNUYJwh0J97hgKJRz z_xeC+jz`w-G4IjCbvHBt*K7aV6Rrkpb-w<_(yl3w!!S^D+6w9qdQPn0sYzW9*TJ&m z%YykR>H*eN)ETV9*cTP}H0WVz1zulwg8Q9)4G)7}UH29DZ|l5cp%J);szaDZ==swp z^9g>a*91S1b>}h6K_AWee%FVu51$`7Kk^bdXUQ`u{)DgLZ1DB+obY?X_k_)9jb*G; z$3QLBz2zk^e|-RqS-np5q?tSa!i;2V1=Iiaq?z~n+_eF9zdCp_dZKx_7pCYVbdR@h zXUefD!9BYHPkS71kNZ;#(D!3bbKDsJx9deW zm;-IWHBIf+_2}(?{RjFw%@6w??HlA?PaS>gsQo^Al8iNtMV$#}4a~gQd)al=IK;p6 zNzh~Oedg<;Pv6&YC0J9l-$uP@JuEI*TyR(Pu4n^T7+Dyc_i$(U&Ty|#uh4DKpIM|! zs1uEbo}9;FjmACC+PQIoHJ7>IoQ6fE76tR6y?)*M)CqiFU2_3GJL~KA{aAl9zVP{0 zFHrxym~-sZT&?4r2`Av&^m#UaJ1uuwu0^IrrdGOE+I2_2!25~!6Hzz^JSX#Ocp>pZ z;vQHA2cTuLWwHk6J2|7*a|>M8`lR}#x^h1FHJNLeayc>cM)r;DWx2~Z)$-EZuW)C{ zoq^ZhI)u5eYq;9#c4&&vy*HR=c<;Ec)d0N`YD*Krb)f_3*~{lm{ihc7{)%uZv;gxh zpU-ii*GM5@D5#6;M>-DbMWg7cx)aL4W3V3m+&E_j{0Qe4oL^ubrzY_P*uV48@rRCA zEvZ`4AlD$6k#}p!t-%~sdz{Wtgln1BZ2~E)b>BtKbUjiycE|yUvF#9YQpjScs~D&-%)f&5$)V%_rqN$ z+;ze|&>RkwJy3Qi)HE4#GJ(lQ*uO1Da#LPI?OV_;w z!xPkQ^kQ8P>SoJ8Pq=Hav68jcH0T{LrqajeelriOeW-h1%?v2>JmWY24s*|HxoWw= zslllg$rZ`wsphGf5XnZe_rdM3Gq*Em>{yGq@jj?XPn7kL!SwX&i`dV6+bYZ*GuF}% zRvk3y-^w|kZPIP1qI3*$x`I?e$}PpOm;-(peJDPc#%n%5{yoD$EniZ;3V1qYCx|=UW;4?ZQy9=XfQXiTBuq` zf5B96oqLX6nQCC|&fL*8GeHlZYo=?C_kfb6R`F z_c1@i_$a|_5Wn8|$)1MWkKcY=O`{B+ed8wUQ|{09pQ!h$GpTo&Ll{SR{ZFQsy*-=) zynM$-9364g+~`8khvRjrSH#EsEN7nnz--t1BKP4W*c35d>Jsk~FXZh|{192(x_HmR zo`tjm#z#Xt7!n&2dlA+~*GA*;LF9vo8sndw?PUBNqmSkh7zD;{Y6eF^ZN$g-7k#PU zKu`DtW`ngN!u!Cx{2aZn&JQtvtp>(Y<~wR_Wx;&Ky3&<+%Jfd0N?+Al=Ci3k&1OcG zv$%Z@+t4G@3G_luKRW%W`H~ur@umH@=2>rnzHHZn-QeF@4C+$)Q73^qRU=ecUn9TY z^`R^NA$@A~U^J+MoeO#(e7#&teU9gVT9VqL`@gZ2{vtp2arzvnYwI=jXW0X%wx(93 zKe!}X5`8)La_ola4N-O7b@T%b0JW_v;Io3yg7Zd=Yu#(@Q{9Gt4|xx@qES$bFI@qT|8P6c%v>vZOZWlPGIbjfzf9^p*O3!rtXb;{n9GLS3I6}L>Z zOe}(t@D=F2)HD7loD25GjZckFnH!!1XG7mi-%ROj>FkqGJ6Ah574&or1or~#s*R~h zyRVwltD||pEC%l}do9#Lym#$Qc?f<0?`iX-rl8)l3%cPKdJ=Zf$Ey}ooo=<0;aaEz zZ^Ll723CTxl=0H9_@Vnk33E-ZqCe$7J?hc?M}rwq)tOgdy-m%u9y17hzajqc@AJPW zqUs%J;A-cuf-y~1Sk8>QGnp@9T(~{EJ;-tI{eL{2d4P`P_y1>k_8Gghl8REar&QKZ zv?wj8$dWdqRN7?;B}FNbwL+_;qO76NV*7|T6_JYU%slH1zt`*j)^A>am>FZt+|PYq z*E#R=KIh8ao%G3&z5TjS72;kx_|`~_+}#)wx@hkO>y122YAkb;NlAy&`QS30_2 zG~K9kgPvox_5rYu-euz>?+J5C^G9oCFTvYzBmC#V{WR~>yeydaxmcUq8Q-Zv`dn{g z1~OYtp6^$K*6?lKw}DRS-?<(xz>7ecG?+$AaUV=1^M|Al{S zQFu}KczR0gnVS)x5zoQ>iTe}Z!HA*}MX$g+U~Ke3(Fa9CDh{dmP_>7uIlQK7wW`&& zRM}GH!O9O-UR`l@#TFG>R9INN(4)qS-$}d^oL|sC)<4!X+BBHy{!aLva5j_;dR7|Y z%b$;r%kIk@tSRoGufp2)lQ0ncU4CMIq&2Tj<(+~#Nt-y+-dxQ5>u-EX z%V7>!<1rR!0rSh|qZSPd^e5}WJDJft7dAs@I0hbq=HSO~g8umT!5WeKxLT~=&$$lf zbzPw|s3#4BM)d0%m+F<820q8u?aUjE?TnMG=@|>SKe$erZ>mWx27Q?t57nv~(|4`L z?(bTanZvG0yO{*H1;#TA?jmRhu73}KYr3(HYnuC723(_!d#v&5d3zfCTsc?+_S%}q z>B$(xx$R4HOLLtvoicsWebUBS`jMPpxuJAJ>9f$jqX+7c z8!UD1uKjhN!)fW$(kq~Erf=rF?0MN!U>AIy`#Q&C9>kxdE(lO!VSWDDE<5` zV63G7>0Q_d7g6^)1b4w&X1HyD|6-nH%oeW}suuJzT*J(siBKDM0;Ph&<&ou)J;i&9 zw^rC%VP)~k;>pmVs6)}r#LUEXFgrFom>p!l#0AW8xS6wu9;Jf)Gn@tMLhFKliJzH8 z_XDWU8wZlo6t2NrXAnez;9htVT;Dc=c*_ zZ8)!NGepWFWwk(`rTfb-^qHtL8w;7!ZGe_ccgq9U18a1CY^-REX$)yi+T8G4F#b6n zZ=bP{*Hgc6bFk+3JQ&}o&DQ|E{l-}S{psKuV%)63r{SsaJRas_!Co>onfhRjVm4Gkl!+m}zn~GX>d#>?o+7s~%|L?hEGLzF9+TM}M(3RP$QRA)LJjI|nob9SxowE*)nzrVV?nvfcoK7vC`RUvE$^q$)}Z{Q5j z17Mt!1Z!~HICtPS<^mZ{NiWc6`4j8~bJ-#EMc#!ZM|`Rjdi(+%uaD1JsW(6)V!_LskP}{T8_8C+R-!2&vw1)f24ol zSu`i{wcSH6SLARc$amC1?W;BqJIGmb`lr;xH^Re-hZDEMXYeb~J{z0~b!O3-ML#5d zNX&zQa98{;vb(3^>tgF-e?#|*-7Ai)JhJiwl^&=x2S!vFQ2|*esDrdiv`hFkx6;S* zZsgs_Z{gp<|1kS^Tj92#2iLwPFQCtebp_*qN#J!>v$2oPz6IkEYy9sr!%EMoKE1(Z zgUfQfO=cEZM_8C!n7g#>(!if|5A%7)GLNRXtT^z0AI15sgJ1&e0gGQZKtFg8T7kYM z>ws!fcQM2F1y~2x6GlRkhF51~wg)}0*6{8EV=Ch&C@3L=Q)UvkUY!7}uN2+oNKfhCr%UbuV;C-|sw)u4VDEvwzZuHlp@R<{90*@P+mf~={Xt!PPjXLkH|$F7O3g{nN&gNPWG=|`%J#}O z$u+_Kdt**bYZ<5y>VdVMVQzgDXXqL0-<@}N5cgd|&zN~<&_{zVqvu2&NqxHqG=)mg z8_cP`g0q;h_71!XSAgCnH6p@-o&cEODlHuW)cJI&LM2G_j3oO9weSqkP^3D5&| z5;4&Qa6GtAdOvgo>-!3;Q}BA5Q@O{^fZOPk?*?N*4b<66>KtmG#{7Q%GG>$Yr0=IX zTn5j9d$r#~%~TJuU+>@D1jYouo)q2nbBUYtZq8eZ z56suboU2Z>PBa#e#h-vWi8@@ZHxsRkS{L06&i;0TJ_Qyf76o%IFG^hGB}i0=SBQ6x zbq;!bJvio)=q1s6Blkv*g7x9`oMcfwe0=Em&_B!=ydV5O^;>LZPQ@EwT=_ko>vv!v z7*D*yT+5%CL14VU2j8Cu)a$nh)Ctv)R>S?E=4BqO57hNT z50dpaV`BYi)*No6E_Vowc|U=D;J(reyf3VmnunX$_`TH9%+cIWke~z2$vEtH_yKC< z)d)OLO__sY&!)4NUWa$Vb;j$d{$l^1^lz#$93IViJJw^2`@B}|=rMUA`$E=rrA@j`;1BPR>X32{foDK< zOLoKgJuv9;d?xiw;I~|mS`eI3a1%3CI>JA2RpzSTby}NUiz{Md*0)b`p9Fe%O?o@c z+s&QN$20Fe@3Z9fGC$B;;6Cntuig>Oj|Tl7n)L30Zg6J7nFVX|*AS6x%YTwHAxqKJ z+_d|lzPt;?^zeVhxo@sx>Oc>H>(@v08+V19;Tt>%=280Y2=NLE3JZex%Qfav@ZTH< z_S>nwuPj(uVExX2yB7Yd>5ZU|{d~9!jHmWNZE{gHFTF|D($qGLKW4$Hc%g2Bx?nst z8M;7y*w3uq&7cp-uhBE0H~9!}>YeUu4YLii=Vi{zw8*wlF3Mh74KQsJZo>>?`nXZ;ZyMb^gi}| zmoPBZi+dtQh&GSq+qWqa){RH z;9Qg!;C6TqT%T4XRwSN<`jChx;v-`tagF~Tdm{Qo;Gfzb*&n$L^n(0>f5biJJ~$WV zaPF7)f-$l6Pj%Smpl_sa#Ic2@MP=qZs?BCctzLajn6eEQ#m{nf@( zcd+)WuV4Y(4Oz%Tw9)@)^|`;E*quLL#Ut@PVC(^OBTYoGp6_m`)@dntY-e&kc?bna#5`qp8+r(6e*;F)(_ zG_D-Uyg2LZqd0#g4V9U(dNLTh4+Z0Oy>!-m)LGA9&Y-d8)a=yk2bm8tlhTvYZ!ize z83JE&@<3-e8cqXs?te=DDY?4z>e4IVco_d+p@h>Zx&Fzpe8XpiXQ)QX0{@8RFWPk~;L0rX88 zPya^Ok3KoC&zs;rtcM0UD9~vS;tzNN)Vf&|M{W(QP}rL~VC*a&dBKYG|rwx+haee@IWu zOv{`}pZZSl`EXXlF6apEz zm^Wc8!w@Qb#b(H};lpRJ9zLETV4$0^KXe-hja)V1tWF#olO$lO6(pC6z`>-ywc>RPK_ zsurRyXP)AyHlV7#Wssu5T(I{?OP8$qAC zzR~}*r_uN(?HTF?*5JMa_ik&ddbUdPO8&oZ!gz5z=)W{JeiX)l{;uDsv#KlUGt&Qd z4t30)@F(-nP6c!Ri#f+un#Wd#Up*)wDE!m~-3XIS$MTtlxA4b#Zkj*Esh~buV*A-wo=B3*b@E%V8ce1zrHx zra)WZtP$5LHP5#XzkPU7{-XScm?yd~x-VLWAU>Y62F*pS^;-A6rr?@_ckcv5lNKE*I%0mSX7@a2&wa|Ak;$pasWr(p$tZkP`c>(Hk^?1Yl%7%g zYss&i0@bDDn9^fP_m=D}(MzzlbZu$nWaZ?kuo`{^eNL6rl>Tb^fbB-QPIAMYu(HW@u(GL$@#fCSx4qChKy>P)nd)xE<5g z&J2IXnH%azddrQu{>O|sKkfp?KgL7u^-)kqey48BS|qEW8XYshix$`7ibj z?o8}VTmbfsHHkF|&dTY*S)QX{V|XK7Aq~U+u2xSJR`1c8$iF4 zKAg8<1L$jUFV!#eCwQ-p0OR)>VEtUbM=$2|n4kH4eGlqY#z^{>E`UmK2N+xEd0Gy} z982Lx=nRJu!8X!6p{8Zc-aNZcxKCJJ`c39lPK`~Cjf{_^OYX(^9;lnBi>j2LI1!?- zKE6KQ2hIY|fIk>L7@Yw2_Zo}61sj-2Y#p{XYzl3n;(AT!ar%Wm!N;oK=2`q1FM;cc z^E%YMdx3QcV+?ED)+^N)tY3O<+)Mj_&$!pYb$l%+!kIr^4||!BcQ3Pt^$Hm0n49_c zA45%0CwG3{Y&aX*XWM6eMm{b1w4^(%f(E4xO7Ep>-dX#N(~Z;5L#0fm%q-Xh+q2s_ z0k<@mKf057yk~G$-CEAGdz@MCchWQ52F&mN%k_+B^_ZzK>X}l1(nD!}Uy8rWy6o#P z0L;gYv&{F+%l-XJ!G1PlBE5FzW6rHqXV52U4E}!J`zXbC=bgY=)WuMmSDH7IdCzx) zInY0NGwh$f6dzC=oKNG|wu6U3jb;ewaWnR~7mW3d!(T6Zz3jW}ci9P<37L;LPsm$h~Sr9E?=k6ABOFJ;Zh8jjuvb4~XJHT|J@LXC}nfRo^Td>XYqDVSa~?_=-B z$zWaiFR;h=6Z&{&gZr`9$2fBdd)8j?J~5s!-_wg_JZP?e9qwhdCu?-az^?pV`HwNT z?FI0;e;lp=a~-`(YD#KF-kWOZcY^x0@s@j@9!c{n>v=u#X~mf0F&bK2P=z_-_X>ci}zi9$&#+ z(BthrQVaBb8xyGUx<^?Pdyk$abpq>5z7|XInB1AZGi?v#U&+6co^e`}I_uHdqq7Ua ze8c#8H>jETtW^aykWKh}d>zMvy}loTd&_9>bsYi&;5%xsYHRu7{P3-jTO$>t6{D+T zt7G~B&Pkk;SOwjRx)l|1xYLfJ9YsIGWl)+Z{r|DipYcEAUclDz*6~%bRk7YMIXXGe zn%;=K5g7;bobRDSi8g$w3`~sLGse@Y^ z*Y|E-s}@li&V`2Hv;Pa{CYigsE*NtT4Gj$)h#ZJK0n5V6!XJh{477$Sg;ffDz0Ga@ z^MCkkn|m2c8jJivAMGVz9%-!F04`=;sBx|NhWXqQ=mOK>1+YG7ov#*?4t@nS$(E3! z?l+#kK5Gy?L7!_Fwv!v`@%Rk92lRFt4~>P^;M!&EW1Qrgycf#BYj7zT+f2seumX$= zx8o7_^={03yQWYD?gqcdEAS0Whp)jkYzrEuH5q-KuhSD^oOo^S+T5#|S2H8iBh#m* zP7TfkcMi(Sr7s6MlV>}P0lfl`fLhZv;Ntm7@{{D(V0~g4wBo#!H(&sqmN_kRa`xn4 zEgz5@kShkYZ}*4I_{`i_%rpF5^r7p&F#a>THvmU3-u3GU~^!Q7xFG{*yKE;KEo28DIIk?+xt@<_`bPeB$b0{<$%KBh`g9 z!EA$bnH@Tg8H?tMYMFyTudw>3dy&uQRqz|MgnsZa_$+y^zlb;d5iowL!g&P^*kh;R z3B7~!+U)_J8<`s!9vvPv?y1R1S98GgsTaTt;GDbqVC|*}*oWd-DchpkqSrv{NbBIN zl-`lvkwM`>L5wsqG%|EH%%xVUZ_GE>f^R_IiEGgc(7V+N)C|;Yjo(CngF24!p?<_Q zU~XKIS>48k=1A7=|Hf;n&vF$Q3mFq#1AV~z^;ftBUWGAWKWQ&8Kl=sV0sXiCgOfn* z#F)o5=3y|m_PJRC*TKx(%v}9!{j6t(I5_A)>48$u32BmQ63k8eCH+f!6!X_s!}0W< z{Q<||>(p~#9Qy#crbP}%4!eiE32KM><&C4P&83((VJ`j?*k`XN#Rq>S=x_3C+}oyu z*G~VO``&l32lj$7!zfU{I2+WVT!Wi{_wNWe74!&v4$h=eGclJizPgUHsT(q@Z$oZF zZd!I)_QlMLnU?96>A9Tc&=DpkCz6GQk_Sr<1~Ua#m98qC1-+8JlApsgP@mccotOo_ zAB;KYfqu0cvNr@iwGVS2=JWy7j?|8%XcYbj)R)UbWr3!A5@(y}EgAziL1(Z(-&n+Y zmA-+Bg%yK3x^a*60e#ncVZ8Uo5f`1s9M$gdDRUTomai+kE~v%mHMkzu{X3WYGiF_$ zj8ELy#~NN6FkbTC%mVc&YjRjd3(OO@k%u7x@KIUN$EH5@IrwuKgMIlgotdeW59VS= zah`!btjhGa*M#SpH0=93m_?&jWlUx+VV*V#tfdO zPK542DJy?5wGLyX0ni^Fg@?d8$a4A*yq`va`fhJ7*(=$_9dv9 ztC>3r|IQ_#=BRh%RL;A0pI1*XMs8Kms^BW}@TQTb5xtZ4UWXIm#P86xsB6(S=vCaS zcwf=JqAt(~u7;E0rNm2#hM;FN3hiUU8f?nazBA-PT!rkyV^9Y`UUqinJ=L&kS z>Fxar?f~^dX9o3P_U_5B3SWFX&}(PSQa{E5P?UTM-|%gqf9EDR35=P1=4Bw5ALu38 z2R}i7&Mq@<`5erHjd|30PKF!km3%DnSmbAXxl^Ggs7GAPp7jWhIoH&>V9ad(&>lL0 zJ|Xie<1N=yb2fFsn)u4}AAG`mg#F zde9SUACexZe$2abomPvocBck)A=;w%#u8Ws=7egE_dyUhP(LxBGUqYwEXXU!n@F$E zEBG-^p+B)X^LmW$)tUGYos_+bdVfXEVR|I>NNRm@ zJyV%3PC5g;30w+Apb%mlH39TxI)B%-do!2|)JxY(pUS+1x-b*;A?$)@a?dag<)hqj zoa1iYv@6tSeuA&5Ij~x|`9(ek0CQb^%<3U}{HoC>(EyAE%ynJ2jVDjWCl$}ev-_Y! zu0yUtS%WfXWx2N*ckAPHzt>0jGq{$!HoOF5pfczG+zfgEto0c?G!He`*2ig4bwYn~ zHk4j;<0N$?*HPE^ zv<5Xt@9Dw#$_G&^@tM<0s0VlsTmf}MbwjmcwQy#);sm9eV?C)E4u}kh zV>P^S%q|@p85C{Yci0Zz1Do+@7$3SXG=`U$k*?3#T-O?6)dN(<<|0BgZjRC z!URya{u95`=dc~j%Z>&AYz+D?r-0W{9q)WlH}PZFq^*!C%alC|#z}8x-^?yyPXC(H zHKm=BowQ>mA4@%!TAp5>ekt=(=1S(V`88W%MQ%l|c3JJ~tUZyv~ z{moj2`coZxl&rN{yYqg^F(9%M^8%`XxmqnWgl*J@)$Q~K=#$oSVGXAvs7E-v;2c;7 zZ-X(G>u^6bD8JVG%2`durG0aKb9*y;GsnVo<}AIRdOy_)JY(D$10CU9F!!4bCvq<4 z<)C-`+tjzIiRp>y=ir3Q3BmmOJ()e3JF<5Wkxk1s%Qeg0O3(Eh;A`PJK9BQZo8!6n zbylm=OSYRj`zg!>yEAcTuorr6^vu}I*jJE=W|$7vJ9-Y>6S*gt4Ynz~DSQ)5gNNYL z(5Iow;mYB@Xx{z7oXcMGcfj1=bzl{^j@TdkAgGP6{TKCazs4HQ=b#tq7C4nzySai~ zP^0tN)C zVJX}XAH!{MJ$wkhFV=SR;ahs5?gC?i_Fz3mpVKXHF4!lr0GF^n^#AIrY76$CoC7gX zb2=T&YbwDe&XVep?vZw$*X-2n)J2(#GR{m?=Q5U_SU9n88#CBzL~2C3M!QCDiQN)2 zf79DN1oR0U56-f5zNY6w-2?iW?B{(o`f79xxF&ra{+iWoT(~z33k?g60_z#pDJsGH zoQJ9oXnjGA$>+s>#eJ{?^uVk2+BauTVGUAG1!F1#ucH1(pHcVDs?0;NC+#wDZ#6DD zm9zSq!q0fG)q3oAFiz5A&;as5?ceKD!ubuZQLbm}@F7_%FgV{O<}5 zmoR=AhPT`AW6W$Gd@DZoaglM6vEi}dH=!g{68fU>i=eOkBj)q?rWV--+~f5}tOkES zJw)c@)>_>=jQw2KTzg*ve-BFb<;GM=CcE56uZ{7MG4==G+Waf1$*3t-px@it>}Ajj z^l^Iq{PTM-UiuJDr>73fY@p>CZ}bG$FLT0$XmhT;TXI`+A7(zxtfP+nMe2)`=QKHo z^N-R$O6P)e;$DN5un20E)(Yx!&PaI*jFqfMPk~9PNvSx4o8N`YGM8okf`3q(*lKfU zg6lC$YR){{eZpF#H3B^f-RYU03f4jz<6}1$vCq<2Pp|VtuqJm8r=yGl`=89mjKlYU z`IZLTmqA@;HW-W4qpo%m=Thotv9H(s$X*HS7d7ENP%m`9QNwgk)VEQU^Blg1|MF#@ z^B3WXf+tW;|5wnEd2lu10?@Z)9l9V?5PF@yVYQ>-q2WROM_s8h=VYoo`S+U&Hx;T; zjpHm&<0gML_wT2f0kwm(?wnOn7e2=O{RP|v*WhjVnpwNu;7NEE?BU%--gg=L`9I8s z$|rxk3iP1rYqrkU42)&o12r9IofsSFG4Q_DZ{l7y28>zm0{^TJdJudbUE5r{dK~Ey z9F}`qoVf%3VpbpnG)-+~)(en!I?OmQ&p7;RF*Nz3x0kucvpZGs<`x9xSOpJ+- z2{fpIv4OD}(HYT>VBXdZ7KaxH^BjK({Sw5qnZisE54&%8UDPuwGOyBnq9z=m7sq_U z`lR~vQu?;egBM^DY(X1d4C={q!1|5P?3Lg;@jdT@G+(TT0p29C_-`?B*vKHR+ycE#8EDLznw9Chj>DR=HDz9- zP2lfjzNP=2F+G81;?G|RmVm+Xuh5WLY(AIj0oI|+b@UJDxBP-W(0#@GikrbNMZXli zoOn6W3G8t=FMeM9!PtYb-=e=oPl6?pC6Ou64vL{$xLf!)`c!7Zvv3o**BWbGgcn>L z%Us{sNUi!v!I5At_jSxZ(zl>LvpfB9Q$amSEj|v$I#mm*2K$zpYX{DOavhls85joE zO8xjPu(qncq^49#y|o3X(Jq4_;QMNb@1SpY0Y7K#Z2o=^xEHNwK3sRal&^vtfqSDd zkUEi?)8Ak%*!7n&yusI>N*zcoz&*{l-FwP<$^mBcoW`sVbtz*c`%QOKgMARpx$TE& z1jb2f5Y||I2D*UHff|Q3ApOJlKxuhtpm%(U|JdjHfAAZa2Ym!vnV zJb`a^KY9Bs_zX?~Yog}H*Dk$=*657w{a7EowMXw`LZM*Z zm>QnXsamq0izneT@H&_qJOVwS8K`p`W9q9=!?T{9fW9ylK7}m!{%|NbTtK&8r9khy z`d=SwNqI>ygWTGZv5oze#z58_ZbJ*ZGJIwDyXbe(jj)0_#P^5qXBzM6;n%4JxsR*2 z#z9TM`>#2;ju?OM1fNImG4opQmzB(=Q`2(oFrU2K|# z$$k^m?55z!-wJvZp5yEY^KkD|>#x=&jcZz?rKvM|PuSBt8q|694_FJ=b|`v9n$8c*umR7dXsf8iON4aS^Lan|5n z&=39xtKe_27UDkTT46Y#uesre}FwE_LN=Dxwb>`Oj`T(_jgUR z-sYd~m-E4WMi245V2pn>m{+~Qe4jg^HuMko_m&I0zT6$VJN9(^X*yNL$DK*K1ipbb z#chfohkIZsI2Xn9=kyUANgN4g6MPi^DE=S}0QIpaqfbWb!>-7#$mwtiGlbUSU+WBN zgu@Dl6}tWn0R6E;@X$p}ykZ9mUy}N&0t< zq0BkdtdL;JtljAi^Y0qrUs5A6u5+Kz*Pw^YoYOVqb98t67WE5Q0R3!_Hu9^gLW-Z~V_>GXk{Lx}5^RmEP8!ejgSM~@ zs&KBZ8uMkG>0_KT0b0Q)Ffl$cUbRBi3UiC+77u|zMT3gciFD#pm>i!R_kg*#qi;uj z`zrEP=-={8VnY5)Tu0t<+z)TY&-+cB@yIMsE)b?I!d zR%(sk-)Rio3i@l*1@#d3pgyGL|1~p{tyf$OYL2dbt|RU-*1SJ}Fc=%1Lcg1}+%Lge zow>?NYIEi!UT2@NnxJOn+OI~fKjnK+TX+i)F+da)(%=+0u`q-|* zW3w1Gf!C@QTng4L-PeYK&&3w-8e5la$hi*I;?9CvFbwn~HUQ&=6Txd`zGOhJf6qA5 zTu=Xwx||xh*U#(X?>!UDdDNlwSg1ki1vD43cK0#3hAg93+O=HG?gSVBYruHSYd;UH ztEqMS`>J`V&6nH{YGHbcj6=-L)yYl*{jn^@oGhD1-(CYBXuJ+sTVE?EnremwNS0XT7~ZGK7Zy612|J|By@rk!F>5i z{D<~*w1Zp0XIb6zGO)j6Jm|aY4Eo&ExK6@5QHqE3$IOqJjp>c)=Tgt58YUYijgMxQ z%q%$#9*3oH1B?QD>GqWDDbZ_bz0Um3^~f3Fp1apM-I)_qE=ymUxiqsFLfKHZH|Hwp z-M9oE1hsEHAm(#j>3w{NbDfO!9>t4wH0P>a1iRo*a1C9Nzap4_@-gSc9LvmEYr1L$ z*5}`XAHntDVNmzcZ?G8Vfbr2IkOue4Gr&Ksqxtv7vDVYnr}Q113D(*^DEy%CAiM$A zmG9ylaqDyMf%UpRpq{FCp&mF_+T3FtJp;#PkIfE;4X`M;C}(Zly-BTN3cX~*ncvzU zd{(lcu68zl4|4|fSGDaEz;1RO z!5B%M=~$=)>fjqeA4yr>|DFHf*FOX1E!)BTe=74aecyc3obf5Bhd;{a)tt~Z(K?(l zxcgp5aNX4Z@&K4W7`ywrUWOjp2-MV{1J}Z5@UR*4DHsi=r~LKE>yiDOGk8Y)jChAc zhr|&0v*Mo>i>v=1r&T|#`od}pt97i}vFeB_BdV;cw64-?6<@13y~6YgzZCycyt8O$ zQU65$pg-la*k`eo(Us9Ia2NB#_t2ZN1!qbnFmE#sRd3P{@1CH~*#3fB;AQ5f+k;_F zHU^A|2E+5*+2wF4n477ssB63L7)Kc!`lnjg2J738gC0ri(Z=#K;C6TkR)BSV z*Z zXp3NO!$;wdg0nhDheikUSky9H7heI&eT8cA)8S3f?{qFa4VB;x=5ZJ&eE|BNwxVSl z(>8}IU>f~L=HJFpcfh@HHGINci<>wj)BU~)sOOq@Jpt+<59U1>)ZNTayuPl5dPs~B ze8JSYtpoafJ_heY>vHB}w}W0vF()H^3T7|4&zjGKj)Z*Fk8~lV z8`Kni9h}*uHa;HgS*Z;6KtBYYYhe7<05*p=qa=0@AXF=^+9l<`JPV`ax@6@vGY4mzq zBW(=of5wdZn#`$hF?~D}hd9?=fi%-GW>m_;?t(Tb>_U4@WHB|hsN?#T9`7#0`rIBhS=wTXK zGPLBv(hGxi%8%`v^RWBI$;Qbaz{4Zzr0S$TgZt9=rPsr2nb$H~U~qPDHU+IYN2x_w zi?VN-L3<^2jH@}z*Ly%sO)s&p*>HH59zo;lfAG0kOHv0I4i>m4!#uEV_8|B>4d$F( zYw*3m8rN)auK!YI@+6@tb144wf! zNY>Jf&FowGgRT|*#l~mf)5B*RwF0W+rH;adoGUjTia;&*0qDkj!RI*Br$MGcW(oLK zCs!x;2Jz&HFceP4OX8mBJvfM&UGIa>ulGl7FfLXHdJNWrF^l<|vC(r-8O-a<_0-IV zfj#8LK9D&(nYFpt+KMI{kf#AN?wMCT{RX(izVdW~7s#LnZ z;`J4OFaEuFM$wESXBJ!)zbfc2%#Y>=ev{t#3eIFUh5D~C^W*d~sd0>k*O@mon>jEm zz#Pr|$6RMQGx5AP&Bqpjy|DV*y?3q4+4H%Deg*4k4{>gpo}+!>dUq&yC^sL}k<@8Y zxm51_vh#y_+~~5=!R(X!nFjj{oW)=|bcfs0SpMTFUu20(Hk@@h!ClwX0$2VQJ@KsUzJA_U?WQ-^1nbGSr6`U=Zjf=wI5uv=i9Z@*PZ1 zPEVelIy;!j`y9TerEpi~u1u3`li=LB>vGrS+LyJ*&2lQIKXoZno3K{np6cuFI=v3e z>w3etVC>`?)RJBeYhUWP%?p|bIu4;+f$_-cunWw)s)nit{URGU2W2k&1udABl7#ca z=LbF)W2dq3JX`{q!c5_foHP9b=&7s)r-5r$D`xaO1=qtb%nrW_%>7O;IK7}I{sD8o z??T^&W+Y}Ls#T~~VN&s=;v0)@EP5pINa9S;K+a;Z|_n@cy&rb2AtpM8JF2+|-_QV+rdQ<~zm{ zzJCPtL@%X(_c!p%az4T}MIvF$RMf3k339d1L z2N~VTxXOLV{pK++7k6!OA5_D%X09GYIFM(*fcK00jk>V9C$^P*>j%d1>H@~~?}GcH z{yU#xeSFp?oW=E1{3mvu-th=r5W66Ddh~Q&`NqK+Ys;8LJDYlSXJ%5Ef7Z{{&z;3g znVy-RnG@3|rpKkmaZ16psXvl`B%KT3Y#Glf*if>e@S#nW|JTlX;(W1L`st zvle^|6X*%P0@5&q-nY?k2{TuE!VSz6b^Ui=aPP@SMz!bq+0W1wjF~1v8eX7(&iKYS=N#~3*MM(0XID-9RZw^OhgpZN zE&ZV@Oot@Y!w+=|EaYr(KX&c%`_%*g)R*}seJNwX{Z_wFTjl`222)@$`~aUqF+DK; zOvix!B)`V^)vs48ngRNyZU*C6btl&jb?xzZ?Ph0YXBMXyr~l?mcAtl3*=5;la@XWO zgFDLZ2)re}j;;gN@Qw4I0b>=fqxCj@;68`e>D1iy*cwCWaXJ}{vEBrACN;hi@O3cP zv!}q?glnBXl?yrR$$H#4X7+^gLU{|1ETrpfWH8U#+`J#SMt%nBOWy0|Db|#YrJQ$h zF*DEKDSW5!#>kD4PO(l*QJ)=a6mJy2jd|bgirN*e1Dn=c7PTz80+k)8uYD=wQPHs-FIcF8z18Pw7U<9ap^ng9NJvn0tW2nP$9`lR-DElLrfnt39 zZ27b0-zfkK|jNZ zoC{C`)Ip2rx4IUtKXUyMHMs8lmVame&Njk{v?H}6^*U5cR!mkdtsKmXyW-FlhrT=T z-GMoK=Ioiad)n@Wdlv4gxwq!tgZmEdyJi0^`&%7ob>PZFS01{(rxzM6hD{dDH(OoMELY~5VlV6N6vWlsh58vAu-a%O0-kFd^LGkF1AbFCR#gYr+7 z?qD42J?jVh3lD4va)a*Oocl1om>b0+wb7G z&~bE?)DQa6{n$0jbxEz;T3>g(1!_jCAQp-RGgi#~o`tKyI#Vs`6_w#?=9%0J=8oof zOJEu353LQiLpk1?KE-{CEiU_f6eo%k&hwZTn-?1y9T{B}UKN}<+d14h{Cnv4(4+7c z^W59OFlJ8O1h0a#cfCHwmF8)WGRH}Oh4m2YBd&4gX08)&!C-K&bZ_+DG8R7yjM0yC zt`k@z_Fl41^v>aTg8g*@=VVuc&*3jnJLwAM-^NGY)8^mDg7u~hoQjXw`~Gim4^rPv zQ17!IFc?k(gZ&xQ+fRX4IV(Z!?a9I?3qKBj9G(@K6{#7k8FL1&XE?boH2~+c9*iH1 ze+OqJ&PvQ6u!rl+w8Yj_@B2KDZz z;TiBXv5(DIO0C|w%Gh=RxHhN@sSo-Z>s!AP-0$>uL|_ARy!8&buhau|M)xDvku>xO zCZ+WV>KyJTr$Li{&r)24-^rNC+{{{tK67==eqhWr3XJi+FMW=!Kc52jr&v?@9n?}& zptf`iR4k|%>;&*M<_tTGp>z8K= z>tDJH>;b+3oSShCvymIZubf@5GQBc=PUf7s3_-r5H%;A^e19*tDZ5q=Lqz@yE z&*Bv@mbGR(9bBuff$^YTqUPbBY5_apJLpl+Bk&2CTlu`c0md*L;7|CNvj@}?D!`@C z4EjPh7!UTLJPJ318j+?A*Fe`8bE~;<7QMpyj_fzFx7fPiU!b06Uz>W;`7jxr5nwF0 z621cUr#|p2e$jA2IGDra+GYHdfQO+PtmLd>>yO4WXM(SRx%h6llC$^J$E~;dJuYEZ z`eiT@3P7FE7~UGTKHc*(=VuaNoOLequf~Cz?^k$c)b-qV%^%!b^_p0tR-1MYRKqdmpjKt|B^A1d4MrhEi|NA_%PMTUF(c3df;KPPxJ{emeZTi z2&{ekysMABj~}g&c_kAg6C<;uv!fTqFACP3U*eGXC2@bz{Y4joGk1>z4Gq3;qr=w3 z*2Esz8s8eP0Vcv3uvZXEtS{(BIc-59$u);8KUdSB$eNR@DvFcLzruU*fqFrP2$6R$JlXbZUh z_W|pZAA!HWIh(rrV_>Xh%<@m!KXjsO3u@JDRk)UpD*qpI2cChKz*xw9@Lc>C>PbE; z#zYTN=Qg(b28^eE0zFj5R6m37SB3AG8TVgqVm{po)Gzgn?}s!ThKkHka8EI=9S66A z{sY%4eck4kAA`A~`TeJGCN!gFa3eg-Yzgll|86~4w^Lj28Z-gpX73+kCg+~$PxXGe z3hIGtnfc-qVEwoj^)K&hpZ$r{RXTFs!{xclbHk~7o0Ba~ElpJc{g%HnJMJB5RN5$* z(KM)ZQ0cj_1e`H98GK`mPU-4Hs}Hq5(Eh;see3rv*uP-^DF;tExZu!&L-xBkufRSS zQ%gbW4}M;I?1#Wm@LBfxp9$^gdox$k zGw>$pY4Xo2IH#Z{+y}-!*6@sd&V`EMiec->*Fv>$wO}^uTD*9FgYiiu90~sv`YEXA z4Gs+s`t91{ySWrPGP~)1*bU}=eotd9wJPJXop2LAa=lLGj3>h)Jd~FgUd}|{8Nqo} z`WouO|5#CtrOfZlNA0!K+pee5&yRqy%p&MX^fW3lD$sn}CfX)0j9(akEcRIJqv%J` zDv>HdZQR;oPdFXall5kv0=wvAQB$$krY5~U|1iI6Gn`1><0v zZ`T{Oigox4tqbX~F)sQHUI1sl8WZ&fYiv)@?{qhG1+~|&!5Wi(V4tT);0Ew{ab0p> zS7-Khdlv6~&q&WmI2w+wfFjOpvL?3>c0!j#7fyVdKy-9gu>ROf_f71Z*qNZ;U@$xi z6`(J3z4f3y$4mihwAOE3hw3vU$K0$Az0$Wb3w0mo^UVi)OOJxF%u;+AX41#&`fCo7 zEzg!;kM7eGd}gh$Jx*PDIjjYBpayUqU?V6~W6nWOFn98E!{~LZ4(4gd^<{^$hq5(b zTXI{ncS-M(XP`}Ko6_f#&j<7Morksn?qp7uJt02r*ur?V9PDc`W@{+VcqPJGmoyNAe`V_Lp?NK-EmujCD^n zFn^y#^dGBhGzafV*Yy2m|A#Sp7iLV7=7+HK;AqyKFpZ-l=|X ztK5uGh=RkR0c`zf-c_J>T4}$)tS717Hftp|)-dM@sQxEtMP%nQ8J_7TuO`vXm z1~_}gK6KZd%>|na)S>lCen3xz@s2)hHPhpmi{jVx1pl4ui1C_nk@Y@*raM60sU7%p zsUP`&`y6bBpWp$`lXLAU$uG(8$t)CeJHL;fB{dCwq~>9wU!VefiFeZY+dNnO+ghCd zr$4}W%A9R2^Z$&u8#0^MJ?A6N5jAgbj*nX(K}B@TUi4S0a~t=&cOGQcvi(Kxf#Tev z%%Y%%dQA41Y=c~bT#syz;2cxyNZY|Z{HF4o0!>0+oa>8wsySaj2x>d%t;Pvz4Nt-p zI0)uK+vwh~w%wa~EY<0$bxpq`d`Eb8WOk%ZtWGeW>HYZo@zIIV!FdINCHn3b57_!JrxH7Kf)s1dBy{bK!MjiCwjrsw-zW@9b|we>OKG2#43eq?lbbhsKm z5p%gW@T;jk>WwpAHIEoUkLhQy2J~QlNo`$SMSV<9kNTM&%1fXsGY+i<7iK5e|27VP z(iKn>Hi8;@JNOQafsA+6w)8KRfu7G^;MZ=2UqBtqz24k&GIQQ4fNQ1Rb@OojAMP(| zNya_KP^A>(UAO$*_rR}U9@rh!+4S#q$m@`|m%b*o0@pBgCgTXbtp1LD!JerLU^o6Z zYYe}`{q&W4pZa(9XT1&1Y5EA3fWAHZ+RYRFN5*$MncJ!NQZLl7)UaSaQ;%ei^x z&?9y!WT=T$3(wBJ# zE1&~h1eehR{3Tt4`pKPFum;aU&1}u=bf{BSC+LCnx+?&h^EbuMXQ%{Aa`g3F*GJPD73@zf?LLR9^QzRxz{Hl|47H()zl4|)Lq;T*EM z;kw~|PznCvJdV5J1=tRLZhmNfFu!1HXlv+4SO8zZN#T>iKZJguBG@8`r;Mr8IDA8% zB@!DP_^H&<=fX(P%lRQphV9Jh*aEi~-d<>)p|zvG6n0uhk@A~HRZJw@9V*YN9 z67=a8-BolEFdin}0*tYSGoS74$lH-!;a&Vzb;D|F>ie$8--7FJ9E`K9+o>72Kb!)_ z+}8U(1Mf>?iw8liVkMyQ&<^ivRaerITmuHNn&&fR9I-j|WI#dVFhSE#^IaohZ zXa1CPGOrC^8=fDTA2BD}1l{A^<82ac66=7aHpu7nW2!e1UKMpubWhj|{5ND{+1P8~ zjHU}=baZs|31&*(122VN3hxN*2+rv`zoIdbp9!u}<`>onrhxfb^}OnV z-ZY55Lf2w*GJQX;Q$G7o!e8`+=qWT$vL0bge;F7ro&l$Ux{-Uiaim|bK5brP+^JUN z^-$w@8oc)}%w3qd*3~zu&glX zCtg&xD2NeWEq^tLXN{xGr+uA#&5VtDg8nyit2;qWT8(W9m}@(S;tl8x&w;aZM#9~o zC*VE&{2#)4sLgx~<8bwc&d?v0f%@H>Fc5A7pIfzwOE_QaMKA|)e|{G31~n9Q7-L+Y zbM;Tx>}vQiPsp8+Q(GFG9vsYST9{lI%!-?poRu5_eZWHe3!uhyF}SX{rZvwr&!~Nz zLa(H8%TDn5V%rM*$m;Jc;bQoLI?zw>H@KF%?&O2s8gr0^P=|A^dxJ5=pKu*q54*wr zt{*dO&ja-ub0eSOzhNq5zjlxu_6;x%{*=EI!OoZzfE z*ACYRVC&D>^1NCN?ELCEkp)Q)(6cA3G8|68($%7mWntsH=d{yhV)? zje;KT-SOS=iZCuVF191OBU%Y|Ms`N(a{fV^NSnwl;ah@zXh>*C;InOsUqekX$hnyv z*BmBN2VMx@!;RoGYApX1^A=izn(-N6exz^5HQC-6^%&RXIdBVDud4~$>FIY(Qfu3d zXJ8Y(C4X`z;zQAgqOU|=iF^|NBsg2Tgc+xgg8f!%rRF-vfd1Hf@Cx~T%~d`Jdt{7> z%sJJu)D72z|DT$cahI>3@sr;5rC^L#1N1N$8|g=Iee~a$tDX$*8^&q&Gxdk6U@YZp zWqz)&M;-WohyNGE-sXuvLI#F`^^qhPi}|0N$yo;a6x8AMxvD+ALalc@J< zn8sMfR2A|nBv%N@K!3VRQgHD zC&7G_>r1aM{S)+w4=o)UoCRfF&c5E4;o0=F>4#xPW=3WzXGvM3tAnr5m`Sg`-di<5 zJ@nJSeZ$vIElqvY+|i%+7BELPpXiwBm|4Nu<@GZ4GSza`a+lEiaygi9_W)y5_q9Lp zc@^dt25Z_Z&RjW-dD{KKb!9knNUZIV!W5JjmKW+RQj4-zMQ^1(fy1Fc4bMJD!a_z!0 zm47+xqVH!o+?Rh}{&mckHSVq&sT%Q2+@Z0dv1j3q=pE7ZoF92H91I-{X60G)^v!40 zeNWv$AAq3=hJk2#J%qj}AL zo-BWl&h*e411;bzxCwA690S(Vtgp?6Pnnm#0iHk&vKQR?emkfSe(hPHj;&ra8r}mx z9s_zdeSbVy&vbqN7EiJ@K(*iloUgf>nqY;ENCD_bk8H~QYvdrOan zeo!-6GkIF-wBYQVXeOFj3NJ#3Y=_|doQBMIZ-MXmO3;sBJw!pvyzfmgJ{$pknFlx& zjFqi@sB60}tIOr_rcSA^LS4bee{*4dmEL#8SjJLnOBf{%VZ< zW7&^oJ2hiR#4sgh&~(*w>x?kHcIU#<=+fv-P);%8S)p!dUiBncGs%T=ppEjx=Gr!>a8U67 zFJ~&H@zX<~=4H(WJzXyC) zt^XPyJOJuj{=YARF_yZ5UIKN9ubDMq{51*m8Tfj-$EpKwWtPN9X3Vcku5&23=ZZot8IEO*o&tQ=WDPiyePaBZD=3oCYhVLCVBqceE1UVy?(gp;i9wP z$M}!&3W*AdN8^viC&nfQ_s;m(_*hA_Bw9IEIcBVMQ{<+|Fc`(0gIV+)x!;&8w`3lv z`_bL7jv36g;d6SddxF>Z5zbpzyY+hb?2Ur=K&{L=`#+$zmdBhA*E4h0*pb+giPVvd zA&g}%!#8Q%vATS9(C2(LeGaa5_O&=KrVUv4cZP_1Z*%Z@cot38n)q^XT~{yC`=xHy z1Ga%{cq{zB>J`?J%?oaZF8N*ZCow0&*!WNSz21V`pgU&`yXQ9p^<8Un_3(MB@4N0i z2gXZ!5d8VfQH_&~n>&H}vOkL+S@kxxLgS{(z#QGrxu)L;i(m+R4(i6nmq*hRYY%~% z(;Vmo>Q44Y)uiuy2dKH(gK19STDK5?;~wUxJ)e6%w?4Bz(~&cFKS+I$a+ZLxP**q( zs)03xS7AZPf|7agap}jU3*l3^A$db`7mP}cO2yK#^o6h*ZqMAFi9mm-n5&q(6lTLC z%zrS>alKb7uf;j*>ZjHlU6aizjOz|DlR{60@m-8L{64ehti}LUn0aEnPzY)=hd`bA z(SJQXA07GV$g#{SZJBEs_!JK24(9ZP7`GaeZ6l9yt)B>k!MxZ#)i~OCr5jMnX6oG8 z!I=kX{7gH*`rAh6$hn!uRHMP(mbPFV<;T|UWr{~*T^FwBwJX7#Y;FmX7 zG{-eBtj|n!ubEoo26z_qUm9CY2JfHy;4ARYF)$Te)6B15XP!^zc<1bTS9}EAXP41WZ=ZwD@KfOPVxF=3@an_!(6o+V zRvt~?;VS%GUFgfL#q3|_SXN0?NqDZf^9Ni!ABaB?uau}1_?t$>N5!|tw#P<8FWAT& zBKI`4==0%^@E@q`cZ3&*7Ka+cQD9s<9Gz}|{(dF{-W1GZZ^P_I?=wBix56dhx@rER z)_*5h=eh{q0OyTVfich$jM=TxXUa0coVR}T>gts=FPH>hL#R9y%+vL2jgQ*GIC@B4Wsb|d0&TNxv!B70xht7Ux+ymT z|K}O78?0mL9q?>Q_o-v(N3a*koU=Qq&FNz@C$pa5y|9)(DoR?xEV8Be@Rk6rH>e%i zAQrE|tc`oXb=c4MAaBqEG?rJ#7_0z8PZQ?pt>9c;J>0!u8E2%JpG^ek?oI)9aetS^ zuo8x+hNqT;8(k6H4lOe+ahP3;s{UiCZv-p= z=Kz_H_JBp;!=e5b3WvgD5@QnA7F}C(4BVBtE0Kz&VqL&l&S1~i2B@GJAXe*^sn{g|)fI@AM}QOkb}eO*n$ywK-R4Nbku z^}_W`Uz5-NB&M{Oo9zJgrf<=hMu2(c70lRG`*R(f!C9roNiW0Akby5i{mhSj{n{{} z_d$9CJHQ6!qMx3BdZ1BRuk=}Z0gRDdU+w_)+mGSD{pkRGzWM@O?`MPi*mtlAW-x2k z>%5qGA?Edd-aL39=RfJs>;n2S)mK`8o?vmVoZst8(9`GZryfv+^HF>*dQv;rBU2g9 zq^D~ubH9C-UxRP(;rLAM=6t9Kyp(z=3R)F;v>az*rt z=&`Y5V|T&^@H_(7E$1*-h*yZW0#5BkIltF!EH)@QC|VDOaDMOOa5bC)KXVSigy95%Y5=p z&OCVzjAh1y>!fkegW&zrH`+I9Kh(a+zR1Z?4R1_qW~(kLTvVuzV7BCr~YSLH}LSlU`C*?-D&jK`myy& z>|5G5h@m{E;KPy+OVpL#g;!t~SikEH+hI&`z zW@q3U_x}0-_QPqMhjKBz3Kck~$#`Z9ah7p}`m-Lelkg<}gU;J7*DiM#y#)iH6W%oA zcb~ua!MI`^81sAI9tYO#4}v+Ip32d%0n7tk_t(Sucs-4Q{Cs=#O>;@>4&EciOlnL` z!FcIK@EP&%^l_>?`8{0Y{Cz=-eC&9SN&sT@v@zuJ{IfLtH`ndHC>gO~!d<8BB zV-w@V4se7w^S46yk-j>$apUV_!L_a-7&l-u59W%iH8g=DSVa$m@%#W#-?YAC&%HG{ z`;s{Oky$EkMc5jK5s8L z51cJLUJH*e;H%FI@)ePGdlgX+9Vqy#bxTev;?m z2bc{jz~{goiSwWUBA^D;9$G_Ra8G{*27_^oe#(4|74{QXgx&NMmpooF@Qu6ow*d2I z^%QFl_J*mIy#?QaG3ylY_e;P!y=$UtiEisLganDaQNHz%OvUOqh z(PNp%f?oY)xn;RWiykf72-Z9Nd5qI$Q5P`Rn*ep_;p_*liQ7Se#F$;bj6Rw$sGI9) zd5hVSH*(hZE!kVLGtx8C15*PHK~j-qBv}^hHBo2U4(d!_famzcQ}NU&FdnRzu9t2P z(=yY7b5hP_?#d{5F!vx`KmX=@kBm*{FoSO*=iYw{YTB-cdg1S-9yuF+hD$i#tUtU3 zt~0&C=kr(axo%jZVW127Yjx#4ppV!4eFCUscLi&0mq#v-OfQ&T@O-J~OI-tDpbezt zTFzTsA73AT1*}WY;7nLvZsY~H5n6F>Z$HkOdl@#t>)`iy|1N^3!9DhW-l$w&E~vMi zD1M@N6Xr*$K|4R`1@JX^%_Dh{Ab0S!sD<@~f53lh9nW>duXCLp1>2x1ahNsN!7vD3 z2bS}|E3y$SNv)^`xSqH-x!zVRgFinQf{juczxp z&ciXUH;=dGsirrY9v<(HqT)rx^+K4>o+x&r*cF@|dIMPR{hya!uiy$$kFN%Y={4*H z%fZ%kn_T-tbOJhNVmZw7=1gbzj!MlXw97VF0O5DOv;0$)jc{KEBM4zup9)2P*2 zUth{BRIjDpFZVTd5MyrZA@1*8zK@!j*>p&=Tsy7U-1dlvoZM!FB8? zbWe5XWZ%M6FLJqCp=G8eCt5zA`3jb1mu8#hn&!?dIBSeApiGRDbz z&-6;v<9wYN;M)2Veu(~R-fu4u!L7k{2=SN$Y z(>rtm)J78Y+8IOn_uJq>cmveQ-vwtE%);+o0~(>;P&zNZ0AJO_+{E1Dun69PL(EgX z`1r-ay~iUE_;?H)z20i6UxRU$@m3l59hN`>YEm~m3ygoR2lb$P;UiE-G6x?7`nlDJ zLV2M;JFk&fBRDVfQ)UhuE72OoQ~PS*t=0SFdZw4a{I4gR4d%x~!TeD##xaz1^MBVm z^FQM$Ybc9BUEDvr6U?vmIMEUk^ccAQ8AG|&x%N4y=r4L2)Er!|tg#$}HQ;{ab7q~| z8nRlsn)wTyIcH4bb1*$NJytKjUjF`q{RL;0I;+&hr7tc$4kp7{r<`?41U@ePacP_1 z$Cesfs#NJxrCXJ1RqCIDf7pGd7d#62FeN@E=3 z@G|LBTE-lIzm7& znbzryjlSf}rx~DE$r#Jt6}2ZdDDOYlxJpnNKEX%rb7q`p{Nl$-P;+k!dI3tFC>iMa z&*1f6f&WT>|0poOG%vNju@d~~$Q<;`;3l{pzMv;S?aP>MPM@7QpZbozw|<->x+=RW z`&{O^%rEI*(%+`O<)p)RQl43*&$3OjP4fQ4{fRxGw?)0l5A(RWsky3$HqK+fyX+SX`(jW3r>d)U_Zp6Qin<{ zD!Hhn_q+G{(EOqK@5JAU_lfn1JrR8(dJ9|zyErGL8DzuR@FQ>+=l8nDWJ_d&T&*8x z)Ty0c3)b;2`j4mRuUQRh#0%jUa2@cOPzyZ7`9kKYtEh`z3f9%GgmXZl!#dn9=mF+n zdI2}VFjx^*9H&=`CUHsc&Ouh4sJ4q?ut$GIuI zj2}nun(MBqqgVQe+BA7z9v1aYV`@ug*Y2+O1a^r($(Ir@CC-Dt3;!;h49;yjHF0X<^}^Q+d%`~W9{MNx zC!Ft8CRGOa!AwqzTA7-co)?@y7tKU7d5Fbz;9D@)`xq`Mx+FOFPw%~2p|!KS!TX{V zeW7pSsW%VV0oIHj0rfifGOp_P zmtbK@&*hQ4BSCEPGw1IPq(ANwn2g_g1oQ&6t7`PZRRm)y{g&>#Q^5F5AHhiYky=@O z@VdWAZ{tn5n{w$)I#ZLGKRdEJf<5DMda2a2+&7Hb{V+z?$2A=Gfi-#KN43BYAP25h zLqJXT4A{&(lU~Jp1#4U~T^jRTG6--51S&Q}-IfX&s-huj1Eftq+BbC2ra z59$KyAy<;RkC(L?Sg9g)q*)dzu`ss5`Wac zk$)rS!*6)?2f%uED|?#Gg~s?;F9mx?tZQ5McHQ>*G$wS-GG_2~?4u9m7Z?eyL*B2h zbD5(5tHN`nI{X276uw?f6f`7{vXYYnim~ozMT7Z zcla3Eg4&XC(p0dvR~>4Db-|lqERfa|nIASf(J098UZq}m4!%BPx6$CWPeEyVcTE=R zg3r3o+%C9+dZX`&u~jYn1g_`Cg|25i!5C%_y+v2zl{Alk1+04*EBRil2fK!C0r#+L z@BpY=wuJHU4)`3H=XrhI8}0Qmo?gwo^aj}mS+(g3=?dwqQ&*>Uai(rAkxN_#t)OvX z!eh<^9}h#IPohtvcCt2E--kh6&a+Y;rSGm6K7o&c zw<@zJyC{20?v`Mt*1Mb;F^zd#>I}w^?oV4m-PG5hkHOq^Csp;Y*4f;9+;e7u@ssryYazx=o|)r);acyS=Q`qEIq>AbllCio3f^NW z=8;wB94DViV{GFjwWLnqzON6)nwxc|>dcMRx8pP6^XeK~4R6dLW;yykPX)CWKfBjI z3+o^UY6>HYk0`EgcV+m>a0O<*&5X{Bc8hh3JqwNEjRL>Gg}4JgkAEKj6DsCc%=e6y z8{j(7BYGfuAi4=YhPrS?&-u2=2Vb`K|;Kyuys&n$@M{o?)N?kgkWBjR7jzK%_fPL4)keq=rq zl~0e1504Md+R|I|BzyqFz<9v?$KDXv#T32%YS$NKF3L0 zqgXF9p6Ujzz#LP5XI(HiGhTTYJ_6TSwIAz&?csh<18z&7c4ubf_s6&Iz385~i23b9 z;Rm1vJi9WtGUxq%D!rJuf@^~P2j)q7{nQoHC)0u7!uvxl$+-9^y|mWiR)ev#8qz<^ z?9!8K?ai-II~oOk%?ZTa_c&ADxO6jp!0J(LpaWP-zAiY$_PS!zm}jVlHV*84HQyY` z><{B7|IBqQAJm=((d+vWRAd&fT8!~eTi}oAAJN~Kk@9GnN6Sor zw@-Qdl=7v^mtI$LUCF}*hYR$T>mzR!Z53@9X&L!E{CRjoXhY}?SY2Xu;5F+)zpq|c z{mJW!tqbP)>CH-FAZ-K2CFVne!PoH+Gg`f;^&c50UCaD7^RCOlSn6xMM34M;ws#}E zIXz$$jD@A34s|R1O)o|n&dRiAcQ1?wW3WZgfb%bnr>w!f6HK#tCz$WhgL$F;KM#UA zwrih0?y=zYosUOB4a}d@y~BLZdc5&dZ_u-KI&*XHWLBnokoT22`gky2R9911SC6vR zvH3sVqP}5l>00JG*#^`I+zZu*T=&kT)~n8a9(vsvCIfRp4g7|8_o6JMFG_!S?89SQ4sAJ96Fxln;lb*Msvr6V1|J@L_#UWqq|%Yi zM>ik+9GVqL#LQ#caKHq1Yac8~4 zz1JF!I*0Wkb&$%`jeK^@Jx0PZ*bnAOP4LM1(G>bXQC?A=dbV}B{xB0>2V?dhO8gMa zrhF*$P{=yHG166FY-Nn(dh{WEDfa1F&#oG-8rJ9MzpV(@KopFj{QaR4hl1~SKeJVa zz~&O0gEh>rajpLt{sI55wy+fDGKavvs9puV3PzS3S@Je;W@9)%oIgE2J#K$|nP{1) zKKK7=Rz;zrP!G^&(}4%R7M7p+76ia($Q7%MFY`yQW!-|&Zw19QAGpl)rg z_BYO&tU|A*YmYr@%V0I!2$kVfFn_LkvT6{6>n-#78w$oyp_8HD{0udr8898xF=jIV zyF9%d-sARP>2Fp8b>DV|wE7EDR}d>)%}fs0q|c~Jt1ET{Kg<>C6t7dfF}{i4>6QMM z-0QdKZ^1cqgW`kYU&0o!FJ(c&f`XplTGcGSS$^MmUrq@=E8Ys0$Ck%N!OG~$=xjI` zIT)OUsgJ2A4uVS1nt6eGEf+B3vL$__-JuewaUFtRi~SmSO&c;Ry(M01*IciozQy$M zbnv|2OdrPwnGZ5GlQomA;2O>|YX&{QLdv6=M>Bn44;;=O&UVgq&c&I5at>JQr>%ji z(^-K={U*MqhrznN*Xtu@tEey8^IQ=P>{c*`bnVkeWK6UhjAzaT`*NG%-Ec1`3+jT# zxz-P%Sbf?P*^$v%8@q9&l1+ZhDj zd)DPY1ABYblP&`NO|EIy;ubR-Wj9!V)9?Q{dOyw<`r~?I&NB(D z(XIr2{QK!6U9JBtb9TnLiAU2%)2lP9GbIq=pM=6(VeUHSx!T)heR?qb3)WCXf1h9`%XD(1dC&F(0`LA_%~WJlzy@K=F1^9nk=tpU5Hjiz@fiMP&T zq501*^y%(qUZ)=HBcNv89PF`MhmXnF=^W^ZFI+8tGm|$y0_$$wpb1#Vvz})x^#C-b zKH$GGKJwX^2Ws6L!5Byl-T%Yyt%t~XsvM|q)xk+_F6kOL9UcYs^_lPt+yMS;+o3IW zy6Zu`egO=Fg`l6-*vV&4kAX40_uXFng4Zu6f?q>o^BMz3Y?QC%IR$uVkO)EZxzUWJs1@}GunxjEo=~#(lB`7b2_HZWVIn2zxkn<~R!u602rI`q~ zHKeAYPw8~dop}X1!8f6A0!^x1xLhzJqXE>u*as08--&`A1zU(0(f@E_>o(I2MwXA#t5 zj)Ae1>-kgA93BMkomSvJ*dFxpxL)bUzZTqs&0(GZ_hn-#>vcYlw}4vqZ_Gl`M`PXX z0{Xwyy48x+SC@b~md~s4lDS4cUgn4CPrHuul;5P6ZA5rPcxGf~#NON$;9N`NBz15L zS<7GuYyoF8DFVL9*`+OEVr*j2lX89Z`rthARgqPZE#WQU32-e~@AG{)$mBjsFhSpr zd9``A9)Wqx@h~5D4K}VcCQy4)dr|N4dDYu+6PUjpGzM_s4|y_uIA zhH7wM?!Mfd^qh2sM1{nP!WD(z!aC@e>=(@aao&Dq=I8$fHL^9bt>Fb|iofP3*b80p z5vXF>H~)7%84l_K);-L%+?TvZT#uXwVm-~6Y6DcJkMn$}3C8YsK^wRO+;bO0H?Xg4 zB76a-aF&@q=|Zrd%Ki6jda2ZEs^nG4(>HA_r#`9Y^h(Zt7@Zl-MDQy!)^~qrR)LlM%+ zPqurU&-(!Q3|<1)w`(}hNuBO{G$iYF>P^+1+X63u`PmBa>(!*bW`6GdCGHQtuV2>{ z%+;*tnO}a)T)Ohiox2f?1^oZj%C7^x4E~?@Fn3xnvOm{E(1Vl)dsL$E7O0*51-rpm zNxe!>)1$>7<<#Et!CX(@?`fb1-Rsk*c%R~rK{e1j;JtIf$qNDv^8_FL;VI5T^qbA2 zRyqNGh1;{YdrM~3Z8t*!gUNk=)Gw^dSQEF7KJ`Dm->s>epn3n6qIPN?VUFPc=UVnT zs3{p28CR(vkwOM_8+}iEnVIRoaqY8z@l4K4dWT-o#+)guCtGjF;_%{d7tS0w5<3!W z9d8}<$_*+QRPY-tgZ|JPD!{w>@8;XO;# z$dHJ6xEew;crNd`yc)%86#t9fYIVOO^az!u_ugw_9HI`VMr9xWWnk^Vylt~*1%SSa z)8QsipIQ(8TD@E?-Sz1z&`02V>*r5l4<7FS z)c<_HlN`)u4(R*#KV8r~(4Vn5crUs38T-xx<0|h1Kf8Bb4eIaK=w5~mpax~kVeF(2 zz&uY~!T4%76f0h=cvpJOp8F{r z0^5VN*jVZqy}ZUF-+*z0>(CRRr^p^#;}!3}+u>~(93C8w178}%QoBOCLSMoK;S0hg zVNz&PaK6D4p(jFv;RWab1K~QT2}%0aLwxx6gJ2akJ!=a$GdW~CXFvISbt$!{w_yx) z26M*i@qI1_@8LhdoUks`1ow1jF%XGfk3r6Z*y)AFa~TO0g> z^C5j&H2B`H8X*hLnfQa&VL=`-?w!6ob9v@^_yVrYUYi}6 z8=0%b83!Fe{mcK~8i}=%nlKz(hpe4i-_uuVK34i<>0n*-y)-^FKU0r3ewqQ+H(V!- znf|wa=#RS^tcjTCpUS*hub1@^>jT!+)tS^eC&4X{IGH$EoB5S`?$nxGXNR{{0@w_qgP0i8krPE-0s?Wu8&r?Jvx_y>%! zAA?t*2V|iM{c`5^#(~X2ZAtCsNBl!KG1qa*e=Nvb5X{zHl(&e?=CxoSR7=_j-ji*> zxMv;O&~&htd@Y_x;~VoW|IRo^-ARv8&lho z+k)BcYnUY%%7(IsAVM$h72q5q>l$023G6n+AzcH;dHE1ln_BFsG{t+vvBoF8TxBMsqqbr~98SaUET2YD3G=|8D^`<-2j9w~Dli zj0=woG=cj<_fY{Z7jnOPoc>3j%_G#J8bej^nfARgr`)1X2&#bp@0p-hs2;qZ9ty9w z-b}T0*QF=GHR&ZdL~nw%LVK*u2MfWR+OILEE(d;(sqg_9Q+>c3Y-=BCQuY#=i(6w= zhxff~PH$^%u%>6+tB2E=*}cme^F!c%W}RJ+rm^w{yq$iHeVTufIa+^Lqxuf)^*s&r zM?J~8Fy>ZoXW!0tXRgxj)b7+C=B7J0w=rx^Y))(|+!oA-yEt)i;`hSe3r|m+j!U3> z;zIE3OXpf{f+ndZsc)cLx*Hkw943K2o-Us)pS>h^Np5_0eDL`Yb3lJ7`lZNgrDxc+ z>3(>NI@MpuV{VjPd8eBIp6$ zLxt4x{s!wh`Y(nuxA!ja`;~`<%)tBy)XL2RM=>+ec8TC$e zEWL-G&)GKKHoh^oka>!2@0FRU6FHm}I*P%Tz1 z$iX~=z;muVQ?7h|`JiU=Ui`iI(b&=0J+KZ2&{MyXvoHUF$WpoFb4d4>(hF?o}*voJ8*rO#i_lqtFxZsalp76yrvFUqbN0OK_rc!#rKzQ`w~3XO`?!_?H($z4~kz-wu(+;tF{wwNAS*Onhn{1ABkt!<11{cw+gKFPtL zZrvQc(lxv~^*PrWe{ElbK00Fx>#mo9HIEC5Ul7b^eYp6;#pl8>=n55J0jSZKG$z6Q zbu_(y73otRn;V&;$HCJxqEv{j;~hI-2^FG=zs? zIJAOSKp(hYcLpTDHO{r*S5QMR7E?2725NV%71dxC7^@k>8Jij_nTw^E*R7w@HOBAh z|Kr!x0JT^@8$%_S1Mw2)R*eT^t54y2C=JHedXJoQQVG;-zhHjb3i@{n!CCPi!&}af zJDFkP@hgF59XS~}X-|dzY;*smV0>zB>?{YLL;HD4g8Sml;9lu{st#i9rYjil-h@B; zvlE{Mf7VC;Gk(KKoPFv&V(-%R$?I{otxG!FEX zxD&2mCebEzc4I)-#9plc!bk4!kFfKYS`cvemVC|ZS@6}q}L@0pLV2*!7i5r4BrN+75KkApi;vcw> zv$ee5GoUZr3~D7_E8~GT@vNH5>Z$Ov*T~rBBk-Auz{PMYR0nesdv^57{B!&tDo_)G zGX_4QJI=M}YVdnlKbaSqM|bUl$cgZYp!Twmne*SES9Aeuwi;^h#w%)!JO|#Thr^uv zVla+z-}XJ!i(rgo3^eTcuwY%)S8A=o{u=*WZF~awb6eLipYh)tC+XYL6VeRyPN)g* zgzupF$>u@tj`cjX#eX@^z#Pf@PG5tup0yEuo?bK8F~7fFh0fqTsD@AjtjW9skAU~V zZ}1+t{$0r&)M2?{xf`-KWS>eum9|z_4r(Q91+#Qro2|`#17CoCaM$XkP$gL<`5Ej0 zjqoes{Pg+hYME-8m(wo?p35RRR^Ti``_3nsy5@G2NXsh2+t z#ssdJc_s3KIf@p;&V`T3IMtn816>zqgFlDs-Dda*T!Y=?&AnZ_?7!;`dyDT4&Qtdp zvhJoo+&a@hcn{3)&O#r549*5~`d6Vcv;@6SGpXAy1Fwb8of@zCpxzdHSsQTv$5hV0 z?FHsb#wX4;>J8IF(?jkXdR6t6uAraMJk@@gUd4J9Q>QQy z=Jy*z9V|K+^i6udn#ZaS-V?qj+#=EnJDduH{PCIKykO@u zd5-8gkf7fG5quZEL4z2$A+zJEf$!P>)*)l-$LUqv4_+JBd)FUxsY^jE zUrotp)ph!L@P6F|`W4lptr_%#X3+M(^Q+XJH^A?7U)d99oOm&)Rr~t)GTYX8at8gm zuF>jlUX$kk`2d#D6Ko&L8O$xQCKm_wRadI8MoK7{7vTYr0&CVT*U zsqy*jndg*CluJ}kRu6nX@21{OwP#Mqtjw%T&1}tVJ$NJcMy^Xym%!ht2CwGgdaLii z_0(L_nuvXsk28NljX)i^2kZyearNvM;SjjKEClylud_9*4PgB5edBZNKCRwojPHCJ zdmb+YpKI4QbJV8vIoD#&{JHqS^EprPN__f-g=eSRao@^6D{&j;Y&PXpI@wLtwQ<}c>W##!!J=YyW4OP~qp zxx1;@O+igbf0CZEkHCA;z7=aT)+W>#+;2O;Fi;ydJ_~BT+`oD$^$Gkz-H!N;Kr>@TrD z$nTAhUF(~Gv1)rT7r6*rlYH)`!t-EHhH=FdH~{9Z1+W~{#eIIQxA`oq2k9+Ub5?Ux z*Kut!hpL1p)pgo(b_ret)m!O>iDmfqOx(g6rU8U|e+(*atU_b2zFoL*^FP zz}e~D!rj7mhVDeAs2@_lXae4k)*Y+Bb<8ozO6s zjokh5>}PN<`+!Kg?2^FGOpIAd=0%<16!XzeivZ-e)jes9-$WBGp20PHvL{Z`jg zfAPLO1>7I4>t&0wMei`b!#HC#GykiA=kWDP_Da5$c#BHhY97@VFHRXYpgoZ;6s*EMI%Zf(Ln;A#4W%xm?&`~I3s zoXWX5dQ!drYvR4~b;R&cn$!4PU&`4i>dq_RD^PbfXEK&K1Fix4Lhgl@^rETjJP7sS zd3XqnOP+*ra5Xd0%hJP`Uz8v80?eil;M5bR23pB(JhuKE=0xVdf8$fNo*k?y#0cu- z>gfOT1@z_&I%6dJvX(IK@?vHTYy{&iKkK782X7S?$Utjq$t;%B;ZpdEKEG$-0jLMY zW9F)TA@Eig|s7d3zMwLAgiVKfW|bIO0{<@ML@H^xZj_dA#wXz#4OP2PXU zp+C%rWAG6;!@ydMF_a#B?^kP~=7e4gbq3>Y@5MEsmQW8aqfbgdR3Kcgbn_e{)vm4Y3=7*-by;)!fAlh)<)RMvKAYk;fxL z!b8IAL+e9dfcwjZ@Bw|8YISA6J=~wgnB0ZV_}ka>;mHq!wb>lWHCX*=6+Nr=)3~1a zSr3tMlDfaznZAp5^o6RWHiiUe4Hzq>i_$^gi8_;UO<5RPG&Jb(EuYIQP^1&2`oKso%dEyq|eLqqltpcwWhCnb(4Tskzy?**%M8A6lndr`N;P z^r74b@4-5_HG6BecCL1AK17NlMO9!uT*~>?=2)>4vA`dp&S*S1qS%OFP5P6WLN_v( z`7@XeAA$80_tb50cIfPo`POC3$JLu{4CHgZDY7ZjvSiDWJxld0b*$vElBWoD9nZG4 z&*5Wm555+@qz8RGXX@A&QXlq(_l4WR51}7|*(h~Gb%S#^jESuKF9GlEa_}j$Cx@YP zA7gey4w6GakxU!M*-E7zPi6Ihr1mJHQ@HwI%B%=J^?P z&S&u;Sqr_K-c0Kb?i2o9WAOR3hHQ*(Y_*U12Y-Vx?Qp0DdV8GPqi5I}Ukt2E8-q^* zV+r?L^EtJcb3kvwc>1y40Q-YWfpw2yHDPnr zW}x3u?N0xy^)F*Bua_~1v557Y888Iw6FR|%x}GtWF_Y_z@su&sGB94N1$r*69l9R* zZ~Y#J!8K_pxVE~Eu4ewu;OO9}Ue=3YbaZsEf9wwL=4AC3!!1HBg1q3*5`PBXuD;AS zoWLCJQeb@;X)EZNTtq*ddzb5uI=9d5e7qH3gZtJd_zQl88#%8|Ey>=3UDSfTeoJ5? zxaYe+x`r9U9|$_s4+Qn)(>T{RSie}yTz~aq)XUY&eUkYkqtaNsMW_=$>97wc< zU4^>}r$fC&y&#ryMggUo#J6yD^6H>Z1*=waR%%wNVY*>@D_lg6@Eqtuzjk>j2d$WC zYi@UH(W$`<6xUvB9bR{9vunX?>uYRUtZ5JrT69;(_t`c!P)AlHG7j1T%Rt@6Sn5qs z@j?3ij7!Xmtf`OVq=U*Z z2&{3aE4p{7F}hEfS z>tlU-8d$s5GczkZD?B$kH|j?i*2LDtG$Zwc?FHKl>XxiqvJZR*qhShUphBq%rOK5o zSMq^^2MS(*vfzB)tKsYT*YR7SLaah;60;y$!8~;2JHecOC1;cxJMCuH!)B-g);8yX zwOsS#a^Tu-55-yZDx1@`g-^jegF1)2p?(XmQYEw;S)lwGclZKVBO2E1k#r1jb})sQRdk zx74|uJ*5Y80aT_x(KzaPm=krR`V!nP z)e5W!`kZ|N7cqlJ|K%k5vD~Y@U;O{{fEnjh$X3X<$h63;Nv#RaxO^$~QtG|rd&$S4 zFZ>9ei&-~S7ZvJI>SI_237DOpoxV16ZQu!OooSu9kaOnFWOhUk*bFIX#cbr-%$YG} zwQs>aSMA=s^#HWO3-7*v2Of8|YU4ot(K9$t)%7L}*0rsLyFQuAx!+n_`4LLd*LDY_ z!8*S&)jrNXsS&CXvW8qOTrI4jZcnK_r5=PHC3}?geCh$8_6qJPrfYnWw9(6Q}}%z0E^>Zr?K=zUjVK#`Xari zhd~dadXl@!XuGIMpYONYmo+hKjDIpeav5w_=1U}1t{keDy%&WW(KZEtU zcVRwwO^kEYkIbih7VXJZKlYlK6WYITF6C?!^DlkZSK*;?J?{?I^!&OJVD9xIoC4O} z{($$vnyP)*#$YEQ0n@?Q$?Ks{)Y{Tz;Qry?cO^$Lem17t3dVlc)jHstbPYDvQKRz= zh^t{vY);URI5sjiat#=V8rPPE;mjp6f7k@ZoNp9=Bk%@{pobv}jDjlm5Pc_Vl5F!&6(}R_5$h%v8jcwZE!XCnszY%Y&SS#_dYNWGDmX1^LjX FiK zlrd2=W+~}AI1Fco&J0;U+wdQkhc2hn?vlXI^nQu=gF4!8C4MV0m3e*h;2yXN{P*|L zho?SnE$2z__f_Ci>T;dIe|HqDIjimLVuqjViQ2Ee+$-tzDa;mTE9NTZ&gVQFy}u_x zJ@Y;A`8H(Sa0-wRNuA->0VGDzYQO!e$Rcd7p!TNg=;~-rukmFSh|>N zmo>SYpbqD=7{lw=)H`I%HXh6)SHaV;5xv~F+In7V=Fu5Ls|#!b!uy;b@oMPRka?MF%Uzs_QaitP z{zULhIoG5Ou&wO2vI|dJc-lqK`qb8^Qd%l^Av7r4pzNqqMxC;`)aFu+VP?shB|TT% zp1V!4O|c8WJ!L0zc0Yi%p|yc7{BMbWgPDJi<8M67%$z;oYqx)-HhyJmOs+AmJI*om zCRBG&QU>v3X z^d|WCCP(XF74!qY=dUmstlM1y{#kcwdiv+pfkL1^tN=R0HBcUwFo)Op&3OJjFt+~| ztQERu&*1D8>uctM>Er3+#`{6d0`I2ltMAn;P>Z)Fxd-f*RBLq2+=*wv&)!hI!Ta4@ z9XXm42@jq$)>cpWinA^L!T0?=`f)F~g1%k%Jg-$@x-flD>Ymi8=~L6EXHL&d$WF+f z&DkjJIPbFq?9A=Vu@q$6W!hzyrE_jw=;xiF##9lemzW;JL*LR_QW~GieCC>1qu2q@ zg6oZI{7Lu{hQT1H4f^p`&?7eqyl;=d-O!%-)XTxXhEDNL@$#k0mzq&9qhJ+yp2w>A zDo(ea8uv`uh0%q)0 zgSvpRf-#eI81El*7PX~iFb4Ei7!O$&R!e#d@BYK!eflKWC;B7!=a+-psrsruC}SgI zZ|ii%OV;MgB!!b=@1_Q+NQpXY~ab2ddjl25VJ*o(a}b zio-X@zd3GxV_dZgtz7@R>zMVm|GjSYqPM{sm(RB`j=Iz=u&$*a$hcGgkRER}gaKe2 zwG{mI6QHi--sakG?DZK~+qR$gO6E?QLmSg>1pSfzU#=hSBYKPcd*dnJ?`rfi>pjvp zWbEbIVSK0NcuKKTf|;zpF+<0H<9=hF>;0FckHGp~YcRigF#KTHSl2T@JX2yYtctFR zj$_W2wbrxYwa{y!r=U03%XKYu0^^HYzNvV%SWgH(UUwP60DCQuWMFMMu| z1zg8kfbjy7RPb8+<@L*RjVTS*gnoi9c-8I&K{~lksOZPuc=%=_BCd6CVdXNfl03IB8AC_f^lkUXS|G`q9R*#<9uq z$#MNlN5B~0fD{#Zi#C$OVGALF0y^`;h^nBmB`E&Dk#CF7HGry?;JR5m7(k0v_?DMi3tx?VHUHFh* z!m98DoDP-nwfbz=27OMh6Xvi(z<6pm^G{v_XO{fLSpj;wzlX8#2^bHJfcxPc_yDel zvY?-PDOBa0aO>B`O|Ff@K+Ved+gjegup175zgDv`K2jU@|Cj)iz<4Q$JBoG|8B19! ztjfGh_Y1YB5ulG<&u8X%CWxb43;h~>f3BD2;pXvrAk0haQHM33EyOFJj&DqP5YAwZ zj_&?X5;{Byx)c9Nt-5#}N zX#AerP%B+4?HMU;kF`A(g5F1aAN}FT4@c%eKNt*^j#fJQ3e-AQ>sWI*2=fc)7cPg# z6ORY|D$dW+L+~toz}(V?nTDA^U}1J)ws@|1ZaSzjO$Rlm3+b!63Z^k9(KX!M#$LgG zPzZm3HAH>dXTk_DpYb007uqtT?K3dmQM)$J8V5IqZVYDQ=7saZW1un|4jsnjlt2kx z8TtU8fIa_lBy=QnfB61z3J=tqpfKxN{{}M-UE?F+2+qR>;h#c31vBLIRt^F4#Eq~V z>Qc|^NWI^?4x zz_n3df%}TjuIsBlspa6B`X}cZn#-#Vm;jIs4Fd7r4|ehsb_t}m`5 z#$W#Zt6-d79jqla2KP!mPVT2u(MN`Zevcc#ny#^vy=2Bk{4n^#=EgMxjQbt>LZVDUm4=4=6Q0Etg*|zj8t4f^)%hPd|a~V2(E-e?oo* zFkW2>lVE&oe5^Z|!ySkmh}4Fq;icjIoH0KQIzbuOMIFw#_4mBrgL;YDfb|sX1NOjo z2lMJ*nRmUMp5*&r4)b)q37tpwCU_>tYpK^#Kc|0A&xbOZGMO8oY_@FnBS^xpxnHTQ z?+Ip88h`n5C-rF83G=aI%>TKW*(SyUU0@>o3a%Au)cTdwvwS|hRzCa2Vd{8l)Yd({ z)}!&7zXR%7OF(^1-O4y=8nouTiRob7v@bjjzW?3}#y#%)PlEe~vD25J*5-5QI$>Vs zedPXRZNU4hD;z(0Jh+GU;2*JeIT_vpYd>l+--5Bc*Ypo4%b7vy3vZ)yR}EDSxfm^m z%5WflAikK{T=S#zqdg)$B5JpLitQ<;SKMB|kCsXJ0r;V~$gE}8xuR>3`)dorD~owJwaF3XjJBb;OZe(wF; z>(H#ISy3gLzyfN4ba2Jm1W~&9RVef(0+MeNS zpbB_~);`XhH_v_r^hH0&%sAtG>*mwId$1>Xk1v5Kpbv94*w6kyP1u@`@3U*0`pq(Y zQ|=??SED1NBhxrn`HR>Wv1ooYmG9-Px_ zKVS>E6ds8_66Dp5B8>u_wi2@}lQ_w~hW20{eM#OWd25-a)ivHVZv3?&z9DWu%Qw+) zqB|oyBkk~y^bGY3>9O(sww9@v=N`_jfWzS5U&0w4-9f+2POxvn_0oALddQs_ zr*5?kjLocJjRW&bYXEEDXHai?48}kuJe0;Z>gV1U=I6#yZ-XBFOJF7FLoh#Ahcd=B zF3Oz95IGf|xQ96u?ZKR1Z^IK{Y-RoSIp_}8!1G{UxR_ZeLz&-foSp%78~t$lU5we) zI*m{5QPF3hKKUqTYp&&dtFNq7zTi`m49|C42K%v z*PRtUD?B4KgS)k7pp{=7x)@j0*+Jf1j~?N+pdMZiM#3xb3%mf+U>)2DkHWWjvzjxD zBnBNr9Yd}1TjlG+npQBaz`1C~0DB-C%fi_lK zns4fjXo*Ms7BGKPUs?~#!Rz@0s6V+s#=v;UT8;a%n#pY^Z$pi*da~$5(Fym}P4uxD z$E!J5H&VZ_u4N6?`&ggMUd|9I&$&eA;P!6Jp-18)*bF`gN5TE45j+kZp(VI}`Yf%1 ztziGf-}F+bk)K)o%;I(FcX=T6Kxlb*dHB@msZrA=?&(ZehcPVmxFZ* zHG^V&s41Dp8)H|6G2j}~1B@fo3Dia1uiWeO_gagy??5k;YmLux3~Gbd+CDSAW9CQ3 z8DB6{?sur3S3OUiSxw?==AzY!)`{8!sUU2hz`|w@XfaNeeJDe!0b5^bKMfen6r|z&16uI>f7(HRl<^Zqa&HpW+1ewZ^2+-IhzrvLwQ+>K?whVHrU!M@yyvm*Ax zQJBgcjD7G5XZD!OsO9Pxd=u_HdGEt)O?*)-JG6K_sy4!zg*lr`2Fzv;iscdM?1zk#zrs$u6=&{{6e^`;I@J| z7(*?AXJ8R*&EJ~;9oz%+;`4&Or3tYKOu3xsvLBo~dtLOp=vR@i=pb(zc_#dfc9ZY{ z&eM4u3Yj6%0M6xnr_*5vb>I+GhlBLSJHNu~YHrav+&SDO)+M$hx+8i9^k)9m8`RFn zgvJDYc&qbP2eVA{Cc3^}K`qK_)dq|!j89$!_3;Q8%h;>pI-~yM{cp_k8teksZ@o^& zIo9)5!YjvL3FeeM$TwZOg^o^eeLkd>?hrMqj!McO- z(4ymu0#BYfptVSAB0Zr$F6g;X4gCJ*;I7Z!8^%g!fpL_6qyexQ7J_S;@2NWE$2h0e zIGHQhB`I$JvHN5@>pTvPh?K8O9x zjPbRbAF%xeKd*V}GjJ<2v%QxlgZlnc@DNOeFR8m(b92vq6pTsAGBxC0+y&t+p)EmdRfQQKD?%$m9m5^NOW<{Q44z^3K_8d^*7M?^cQ_Od1+x*Bgq8&T zcfD|qzYN~%u0h{Hh>xG?`@MlPH^(qLZVI?pm%~S17pCHK`V!o`UH|?BzebI|2#o#o zmw$}U(wy)G_$2yCG*^%dv=?U=d9JOskS2hf7(Ed_5ncy3LL6>pmYp%$D)9TbAF1p9 zLGJJRez@4-z;ml6?!Do2sE5JYo|<_MjIE5JhBAXoPo-;@^&-8_#tg25-uu7960kqr zI+i(wG13<>9E_RVhfxedxQux96dxI?Go^iY1wOjvtRM;4AOygG4p!r2{dQf-3s4tg^yZXuYz-=Dod z+YSywi(HG`9YuEpYu7_X4+XR0<}wr0>pTFgiOzv))K|U$3rN=JjDOuL2Ghgc6+e@8 zi*?N1wyrmbxh85(#!SBF#zk2Qm)1+9FL;mW#kB_Io@ne-AB>Mipm+9wQJ}Bb*vP!i zzc*I$@AazKZ$1Xx1AYQ)ah*6P(Y{ju>>9j5-{V=ip1!?%nRTSbv@g3a`$*=I%#8Gm z^l9K3C=Vwe4zwlx-NvN}K3tzRW;bTlr;K;ixXuOh0rO9L5WHW_xkthTaE`_W;2!LC z=mq*FMBT%^(;U_7<9#rj9#rE;H4LAh4fOx@k07(~LmJ zdXD)gv%xh&{rz)#CXIQFh18&`Ktq^^uh=!mwPy`H4A;UFP!d|h7yof8bAt8M=ozpF zV+vG+71T`q+NbDS=>o3H&x79a2jD^Q{qGHnU_*e z+@Y(dU=|^B=W@DyJwoTC2JtH$C^Gx=c?89gvKR_CK zGw)i><8M45t}*Lj9Ou&M9WbZUFXMZ!4r8w8`t=8xdsquPo8DqyU!_o`Q2R*x$Vbcv z=pE}F>mKhOcZQ{N;yl+<@9SWg1^0pdM%L?k!%Oj(;+H}UJZqy342=%ODbO*xKeC^b z56+8hV0K(f7{NKRuG7A;=F~fhjVZ|#KMp<@diGt9+JTyyey!I)J=}cA{K2}uas6Rv zh`+K1IO8M=#v9hVl10fPwckOJLBSl8-^0JtW!o+6o>s`5QbLG4^OOX=_iB9~fNO<% zqF&eMIOEsnMs2VM7yztM^HBPsbc`AD*2qGB*F?!Lr*iNl453-w@r49?>z2RFl;Ks#IN zs`OQsYneDbFa17!f$O1bwrk)Q7{l34pTPuB+q)eWf%R4MyDKtRWa_2r1?QoUOpi=I znRzlZIXgM~d+zs~8sKU8*Q(=-)%)dZ_Vp1e1kdRjoDg~sQ_MnA=Tx6Izf#964j+Q| zhqbnWa4qzOmY{yK3arr?>puc|E7hpfX^oql{jn3&l&mLR0ac+27+d*$^hK$64FmH= z>uJVxu3;saGv`|9&*b{~37AKk3tmD0j1P^mk-FL{e30g;yYhAgo~L|fJ?TwUKet9X z3H;myoK0XZ;#%$6bz0tOd1_9Nldn|DuN34v`WHWoe-^(lc3&_Tds1XlpT1I!JqH|g^;R_F=OLR+v0 zsS~IEi&-ukVF}n9R|#BiTf?>Bz4$CxQ!^&i-?WSQD5K#P7zWlZT^Eip z^Y9sZdhPQ~;JY;Ua&1t=a2+wm^6SjyY6Yhq)C#oikC@-IF1IdM8uq64roJlts&FZ@ zhxGE~lDVYykTLL0=9|o=*-Nv7peOwxQ{fx96K&n+#`onM`WE%)*wgDC;cFQVYEx>~ z=3>s$br0JO)^F8R7JxOlr$Oz_SmYAUzc62$4%Xz1rTWv)IhQk7AAsLr1(asCm|kFg z!lmI_>OAhP>Pt7mKhOsMlJ|XIcnI95-=Wsk43%bO@s-7Irsqo!{lEAn#?dF%B-O{Cc)nH-n6|c19Jm&TZ?ZkzO2Nu zz%xCSoa;vD#d$~jnTexTq)*UiX(}Y(anMKD2(OYcleMd{P#0c;Zm=GT;3Ej-h4QWh zwHRXu`^RpAtH65L>CDh|k5u#N4%W_Ub0°zJ|+rW!B=Tp#o)EdcM?rr=uQTBj$h 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�Xvuko|a&=4Vax!Er zm@W1`eGGgKS>IU$s{h*;(>tXG71V6#H)`E}So419q%V8LHp8oM7x>&%UvOWB*IhNZ z34Gq}$3wn^UeM3boqm+paJC>@pg*SxJEM(pF?JBQ&9}{8%NZuOXK&A5nz=ONE`ldv zV`^h+4zvdK@inj*=D~1q2eCU*)u~GvkkF8j^_#Kc4)#sz@xCf_Rmi^mEZ~w4nIow`*~2>#&-g_!5RQTCKoMjB*ke;W z>czPzY7t(??|`vDk!%#bHe-XDkk8%2G*~`_8L$pc26aN?gZZjj-cxWQs0Sv%_w7OU zq4?*VNmJX{1L}m=!Oid>ECao<#_MOm{*m#;o~zomd64;#pR*6Lo0+yY?2|bO)a7ax z)GWA@9nD4H-?dlt9;lz>U@bUTuKsCHMJ-yNp_-6-!Y-)K4tjM1HH8_Vw^Chv1wL;* zed>kY6ZW$7_1kZ?AKjl_jMnYyvyF0%a-OeNJ6SvVKlmOxr8}i3a=wN4^xNzeJC^hI ze2Htu}yC7^iZT%9_TGuL&YHn^*KKHL?(i|$#i=!eYW z)rIEpWBA8lcifBYx3O-m2VL>@+oye(^J?^_)r3#*r}>^$hD@1E&>y~-S&cC0A@n}9 zcJ-V9YY@FVWx%|_oWR`Y6L1#T9K_d1?NtrOTJTsrsCu8QclAlGVAj|iMa{-oGlIQv z_J8zXt7EMqpZN>a^VIRo$Nckk*+n)K&qP~zG4f*M)9|OkocaCi0#ZZpx*kN&SUpy~ zdJ9YkbLdAvui(Oe@%=V0bmx}ww-NYn^aJxj^?&mx^D=cccfgoC#@M}Y?LH9Rhsn%& zpTRsr9?Ye_1NGw*z-vsOXCE+^^4~m%^M5l(Gl5^xdfHiqOW-x|+E)Wrlbn^GmA{c4 z-Ul)VG7HiR(i2k?Q+Flr3eF=qCwWeCQ^}^1OW+Fd%%}MJG*! zYrYAY37KZuX4&!ZCv3)#@NWLyd>e>!e$&TL74+X5`+YAwf5u*jvpn~))7tw}-@0?D zFN3-E6U?%z5x)p(&}uFV;57DK{DD8fp8j}HhgP3HpBk^; zT6$_QGh@FILpo$xxegwHh8uQ=Csw7tPiadK~=zx!ntz!zlL1`1*VgYAC0I56yAR{TeT=S9*Z4&*#^3@HIO#jbBMP z75>|!X%1zM`3-X?J}1;TUw|1<7tC{vSEJCd7RDC3_9}Kd?2YV=KAN*x)0%Ux46O{6<6Nif*x~IQ+`RZa9FxiT-HE#cKc&4!eF5_m^Ak&<2@H%6 zr29BN{%Gvc7}klH{ks9ch<0=gzYdrJ&CA20Ql5xz7i6ShW$K z@AlgUgFUy4nejKys^hC=N8n_z-*2zY_@HKV4U_}(9DOk6M3b4JRW~wcQ8Q9cGCx`j zRXJy1YU$KqZg(zc46NfU+AB-13}&}d%$)djTfpz^66wgkvu--8PaYGrF>-vIqV*5%vbcl@4y5AI-5uW_#BeP#!&{q8mJ>}hQ^`B!FjsYS#6lVH8;92c44f0 zx$fl}!LP-?7FPi0ukwj}q7HbrtKPhaq7OyiiM$h>v2kwX+~CZg{^9=NY$zK%Lr)By zh(m94Xef+@+AtEmT-~ZQI3w2w)S0aPo&tM<_T{Y4>=mlP2i_?5x#%M^Ci;8clRm$k z|DO)t8~VUYz}T@Byy1KeCV_fFOHh02&i(>p$@9z{sWJKf>Ra+z_$E9H)^6v*1oTK} z+`R9cb2Beek2;ZwIP>jKneA2Q^cm(eK#%T!&jNcWY68~Q`nhX@vn}@3DzYO^PmcAm znt^rNWk)Uxw#iwOtEsAAc&$DKe$IIm>mIcjb1-$PQ`pU;hEtzeZR=ihqmG>SZCtAa zlbA2L1JtkWlU69KQ1~ln@m1jLci)pAVL#Lk*AD*zYDo<^CwzQ(eBkwN8g3e{4sD=0 z=ZpQTsUYDE3r^!TPQc?qH|kabO?a*GrFp z_umcd6EkNV59Sm0uQq_*A8S~(l}Yds=qXV5(N|$F?L{y~n3wq4sM)M#Z_GTfcl|c_ zZ@7nIG<*)`U)Gebg1rRuGG~WsLk}>Y_4nU}H2C-RdFX}oUca1OiydPfaea-5t&6UU zz7lyQ(hhc0`?i2PLw5!-Tn~#q%J;c;)d-qG--5ou*;eM>OE}ZWhwIs(kLQ=8zYv9v z9KF2EjWsD*!7@}-uo61DNEkcRV9=cjgn`<=Ml z(m%rUnddXDv#qm#!Pwl`++OIA?~s2HK7*d6J%jnwG5BVEFaN*;q7LEvxtm&~F*}2O zCR>AAkDBwS)99Bj0rQBtc!?38tT*R2R9_(@Hb5tjKgn77Tu#;JTJ>R`S zU0gl%CAf|KO2#9<_N$yFXZ(4OJ(DN0D}oe&?5b@(%utuT6>F3`@b;+p=@B))`fTuh zcpJ=L>_yxR?rysb{oC45P3bf6|7J`xulfKsfWksEd|Adf^)K@!W7cpqcylVX;)$R? z&}V<3laO6ChHhZq?tMHK_T!o7r763Ba|j;+Yt12Gt~m?ru~h_Xe|zNq-s_-lXFO~T zUMtp+J;8pt@l4HpF_^cvf@bh4sGXbN8}CNJ`XlR)cpsbhzQK7&Q^34`M%fu<7jVA8 zwAi#*`)K>lf6lrj{ zL9h>H3VY+MZ+p?lx5uZJq)r}z8ZaL8d7l94P;J3pUu(|fwLhmHQ*VBK7>z$b-Ohft znz6fOj7QdA?uB!olb(&L|I(1zMSpES&N!xa_8nAUpF|W!!c2G_^tD;vIfG*2WZilp zSl^jnttnlDJs?n;^4#gdctCg=-{_b*jm+Qfq2Q`ao7L87f4zyKg9`q{? zf-Uq8+rt$0ksS+a6h4RbRxT=B6r2lnJ$kwQ!ZX0QW?gAt&pmfOhwW2;21DUXP}@5X z)V$O5<|e>;Fb?YF@XuL`*;|d2jRc;vZFrtW;<3~xsgJD#`@q$_YqO7`2AF>t$9MnB zZFv8`Ko7YGybeA<=P>SDDcJk~V`9g|Zi?I#`GnawHA?j@eaT)&d%zk(4`~b* zLpjcovG-x0a|M(wC>z9Ry)<5LYBBy9>)^3q{@$Bi`c0q?w1#?MPI(g41#8+%VLsT$ zGgmS;lOiAe1;2!`*?ZeOQ!Pmy+26M>W3KfD{1+#T;pR%-59Xxmul`%j!GG^oXaTG7 zOD4g1v4C?ntv_~icC!DLdaZh(pYv<%#ILLlb{NBwIgMX$0GLSlI++99iudDc&<~=av7w>@i zyt;s2zXzzd{tClDjX{k>KcCmKx`FZNGj@krTYH^VD6LRxESb%|H`)rpUK97}E=(?D z8&kRDP4G_1J3-FWF4-=*u4G-wJIQyF-#|1KO-0g?;P0qUS?A?pgWv<-!8v>nK}F_) zYLwOpJotS}`v%_o+wpkWm-qy%QCqWfdK%Dr3A}>lh8ghLKLf&L!@-=m_w^<41DGqB zoB!tr@_E<_%um)qDYR#XMZNO_P-FGyRoEM#&*^OVrSO-+2VoEBFEHNR19}dgf-mt_ z>MiPyZ~S>sSGP9MBXAyP)0pcT18&aWoNvL|p9kQJ{1^E%InSyodnnX7?Ws6}v<}Yg)ZX=1k^8#<;8DU04nWI3K}yr|xd9ZLatR*kd$Sw+3IAw+h}0 zVwKlY9N>e=_#_|Mz}bz4xE9oAHgV$(!IkauKM7Fk%tt=jK&w%B(5#HM@nc2wxHGjJq>-XKYY>Q2eRH zQ=EYQSt496TrN>LQTg=aPCxF4%0E=D1jWY`A2YS$)QWdkxVysc^1I8=C^w^A+v2vx zor*dYou4>AaZ~)Jc)eJ?SZSm*(hKUqS>dz7Y5-$l0;mz1uc{N+&oH;OzSiGleW4EN z_vQDbc5Uo7_i)zyV{q=@@247bvAsA0T%BkGb3JM!V__PYFEuD_5a>)Mtj>t2AL)1c z6V!8@wY>uTJLchEg1_F*4g&8D^QCjaXG9dd@!B!d(gkh-pY8s<516lA{V&~_i?_F@ zmNWsbg!f=8`~ue8>e%W_=7HAg>P>nAQk-cp5sYuvgXV{Sv46lAYVByOm;=7gW5H{{ zKVyDuU3*cPi^_QK8due|jn_UarowNBe>?nU{>}U+nNM&$o|*X!rZL;rFxN0wlk-8= z!tr3P^=$Up?A@H@w2d>suZ53OAEyo`4<_|*y`OwPc`N8;8U~|a3D}!^80^VSN>57H z&D0IfSYMl6n{AqFnyZzsmG2GqAAR4pfUk>Mow=m`hbrvd_!8{NdLQV^(ARCuya$$p z+P3wS*N^Ekvc?8(k`x<=Kp8}M^fxqb|ytMkBoHMk4Gyz(I z&%jmqzi$G41LjuhPrly%S!;W1ey=P0P0xaP{G0F~3dH_!vV2Yunc!FF(7#rn;&oIL+dpJs<>hiFBp8mSuWJ=q)H%a+U=gZ*UoDAf6k z=|1BIGJEhg-m3p)|CfCj?uQF<7vMViIM@^I=lXEY&*T3RDh-t$&L7SWuYdOtm+f@P2)qQ&2s!^*gL5J(v$J6? z`udXmlKgu147AO(&A7khqtr(!&%N}FaA)NXlpH9@LHlI;&^8#IhJz()JW7y^d?0LB7q;=_@wqY4t`?4m;EU7=4E&i z^!TbfJ_PFM)9Ed%om<0r9jhz(e)#XUfbGnauY}EDPBj^Pmg=AD1^>l3zsHHp|K0@Z z-}aBKN7O>}?x_u1FB-4>8ukd9upeSzcwl%NJJ)wdcSozltHgUJdRy8hX2Z)xFBe@2 z*53mY0~2~J?d$a~-@p84IGhN2Bcza@T4%!<#7 zZ;Wk>y%T*WdNs^q&z#S?8=*Ec;c9}Xvd_Z&QjJiZP0e#F=P}$2#%pu>OF(_b9D_&0 zkzt%EC)T?=+1pW%eRA2-Y_RWA52gCkLgpQ=0CTCPa0V>TFV8OmA98w!^!b@9sYC6D zuIM@T=d6F#V%1x|V-L6|T8|F}>yvlE z-#5ql64rtFm9@F|pc zV)WBmPwNl35_~q;S6B_|nM*m7pce7KhV(B@FqynavKJNB0!;!I36;0xJbX@6Y( z#`|AASp8cq+<0*+PzD8ibM39^Niuip#Tf)&z(4Q@+z(g7DbO0e{g+?aFIOpCDf}e6 z;JijR!8%w0Qy~oR!7ecFe+RFDU#||VVaDZlFz%I)m5(hiUS2#H78NZjst?XnxZC6D z*weAGoYnXY%#O^Ctl;daQDENJ0-W`&4hfiozkCJU2bIAb!{-OW+NS!?|Lcj3& z?%o1(eEr0CLVM8PXPyu~5)QmMzNdO9KZSxL1xLI${Jg$Df9wfAa%PAcZXOy!doYhy zY_?tYE%I6Pv*^6oyjZ<>y5oH*inW>iFuo`!L-#<{9D-!MX5t z^y}#Fk>AP0#?Xa*C-NodK`w;8;Crm+Qa{N(oHgU?sP~KH8Y~o;jSpENkxvU^eJYQ8z_|mgm`7VOZ*M|5m{TVv#3#hh1NSC(i*}3di|mV> z23^Bl!`3o-KGaa0b+D#>pB)M>u-onD%+Hzm>G|oi;fmB1sg=o<$yTXWsSU{u$x5I% z{C%jIteG4E)_i(QUr)Urcn-#<$EKs1Xr?jjg~8du!C7=S;+N`~?@7h^X8tP}!`_W5 z>{9o+;u#aZUg}NO2Wo+8civOpXVy1$VJ*J!I-Iv=4rLFj2u_AR%zNoe);qKf=D{TB z59Ux87hW99`!3}?#Dg#!I>L4EF&Gn!f1R20_jCL3Q(H&cEBgi12J3_UKzo31gZY>~ zs_!_1$^1x7(0H;6^lR?n3jo3nz_>5V19NIbOie+YA^?n9t?C-^Ci70*5T@b>dVXVZR%g~d1_5)KKC-* z4qoRA;Y#+}cLMcRJzhU?zWN%@p$W4r%N+ryCQeQC1aqX5icSj72z)p3E*l2s1ZQJ< z7Uo~^zv6$wQ*bfp{dUjWEY66k3XNf4WFT9g>T!ZvjmY5e;IMW7IiQB9wzWUJKg=q{ zqVdo?(L8Z5b}-fj21W-)_k{NZo+x$4XTfViPl36p9zdU=YHKr4%$@+}cJw^y2~gA5 zOJwa<2dqcTm3{@a#-pW21Ao&jYZ}p;`j!XKnF) z4gu#^)aqw}@y~kmDzM+7*GvECkKpImfVE#|FrT!B)OT_Vm`im7|E}KN`plA72d^t< z$-Q3m9r)q(q5o@petZ7$+~Ya*C@(hS&xF*3)bZecEBUqL*OFoI^P!&)y>;-dgPmZ{ zfjtMV-gouBWiVy`l>Jz#|DONP{D0C1(+594^!cIHC96w}V}6{JIVrP0yFWWVH$L|d z>}9X<1)Mwg27HTWZ819))iLa890uzOZ^XwyUyn7Az1(v+Yi%8<6{u-FSHlo*Re)h z3ZKK*Fa`ARy#>xYxOeVbFlHs$jadsXy1Klzg)Yts*}S7*!7ErF)1Psp6Z+~EPHotnd5 zJOIzJ|H%ISG`xFH!{OZF+%jmIX_~QL^ai{LEmAE~ZPRVj+hGR#;e6hYV7F^gt|+%3 z8s;13XTr&)Czsv|i{X#_A9;K1YTqY-|E`*cx}APT--8|CO!0Cs)=Y-6U_7xF@navH z4p-Cv{F^f-%!_s~Q~5DG0-u0h7wfeqoLgXAQM^+?U=19)hnirYl*l%$r&HC;<&hAz-cnoHMUM1s)9s*;R{(}3#`+PF=hi5ER86 zwFPSff57+bpYh(*Ti&gp8>dn(4E9l{*&S!ieFHlJdV=qj@5^gojx`_jQ25?|0oSo} z&iuvP+Usuxtk18{pOHBu6U|1mKV*K$#2M_kjoophp+7s>w}Ls=2cR}#&);j`I?e0) zaZo$m&#v%?!DnU<(7RQ_%#>bPJ$&Z$UYA~D_Gi?U?9q(|b0}*=HK+eETWVe6k7~Z& z|Mqm$6)#}tnEuh5@oBea#^}Asdy$J`7sZBg7EO;tk6<5D#o~&^Z@}}g8(P4piBAKM zc>kjQMgM(ROzchUO;iMPsWaguaK@z`w8L9C9zSLR`r{FQ3EpFtNv%LHjj`VM%iLA( zz;^UBeH&AwQ=?7dP2$_xHNGXfCF)$db?3S4f4An)7pH&aWzK8eg72UQOu_qQ?%?Za z9?_E7S#=!yd+OurL~2TEy|>V7Q*-?uR+X*_&Ryw8?qz&mP`aRW1(;8~2|K`COI@lh zsB77$GjQz(YaYE(<)IaLzkS5nPv%X}gL$>j3ccii!W&QmqaY2|eAepkfL;dYboF`~ z_gaBE{c2Dkm^v?81I1BDg-J7yUcMYs4Sy8eUwt>3Tbm*1r zrIeJcovIzornsNi`SZ69y>)2N--DEB|E_Sb!ogKw4e0rGzo&jrd4|pu&VYI^`(7}Q z-j6-VYJ~PV?QPnt)w^NtrxvS6!n#9`iC*fv@m+TX>n7vQT38OJhfWWbGH+`>brTGN z7-ysGVh@Qi${eUY^n^1&ZR#iZ8Pt(ZhCxsvTp{S|tqrXWWuZ*COxQn%)E{~fDnVIj z2}f&H=4+K= znT>Us8o)bX-DaQMfbj(M1od5G&+*JX<&NZnnR-1A)`-TbS71ML>*oIMbgBqmvyH*~ z&zju6om!L6xI?fL)JoKDPr(Cj?cn{Oer)~FhB-gI-tEHe!rw%`iA-T1c%OKm_!;mp zI5+nUsC(a)xGPbMvmQJfb4q+l{5`l5%(c?dbo6=97nO`8BhSM&=8$g&_bXq)d0#$* zUWR^PE`B5Y7gMZpSAfs;o%nn{2X*`D?DF(AaYn`O$=9ME^nfeCy4laIz#C#-a~C+< zVti;*+9uGp)w^GUTI}z>Fn?kG)a@0|J_`8$HWmew8*v4bvrI2_DHpM^Kfe9Di{!PxQ;SabO-Q48>Sp;yHi(~=!% zH-Z{aS+LGZg72}Kl6tqkCw;^AS!!|em%5Snp|Qdm-ag&eV9w)fWpBk?UGJ`%c5V9X z>!2O@e69(H${Z@Qn5VCPUw4n)0Y0BkrRSh-@+$sjy}~{p>~X2vbYPZKADpjUW9E{p zGjp;ivnVqP%tZ&K2Bq|Sw@bB4t>EN1dxz==>S%hmtAp2JYkaCtL2Wpz^sHdVUIVj}oEMeM27_oZLlIgv0jy3A*^d7>JTG2saGz^i#ISjVYp z>k+mVGk@Y%4}6s7W$H_6)y5V7jDN>}!Td@+Y9YJso!b9MDH4^l){>8psYm$R75!BkOJBNX~xG~$D)O^q0RR1IWj~v8D z>i6xu?lkz7EfalXePbJ=8>4L^ZGxS@@6kVbnzN(z!>M2DNi^sE70Sa|oKx~Vc&&ec zC-xGU0(vlv+@?aeLFo3zNc!!Y61S=)n-C0 zA5)7omKpPEa<+!EELFh0E#}zo{>yu1-V3~~UYlM!*8ib=DE}~ij+X3({xbb#+TEU> zx9bk|LnVhwc;qA>2R#Fyz#p(Ixh&Z{)jaTncTROqT@LrB?@vDiH$neQ|4bsA$nJ#q zbMNPd<=A>$FdYg>#li|M~%a@ifJuiD+c6NGp`q|90nRV<{jOL@kEK8%( zMx`B@Z&Z6Te!X?{t>B!P51Bqym--HjL7UhQaum+woD*Zm8F;eIlZHBT0+)b!()q9t z?gG70d*LlmU$Wn3Z>~NxE^Hj+UH{{}@=L)QaUslvr{G5z4UfZ+fA>KR$9qs8wt=;z zo^(A5)1VR<=MKS>uoEti{A)CV?$#DnE&{KnT?C#XY#`@m^bu(@&E7w`=r(s ztOhJE3NMW;4ZKaOqpPF#-0qFv8+ZcLm)gN#=m-9MOKeN5 zA@qy(i=GQt!s(IIBaek23ub#ahBlHx?g_O6-=E9CKJK$+pDpVw!JE(>j6wDr+@n*RR_D&aW*83*fRsJ>xmvV!l&{Ni?EF;6 zc((LeDz;Un9pFarbGJb^xCWj9zfNhsG(Qo_K@qytovAxhhxn+ItYdpF`BmzxRG)O8 z^a+_0GW*~{c45tBKbjvip*}OQy$o>kZv=JR$H|XzU>;=K z?#?6Ba>5HK#QG051UXT&)XLTSi*`%N&H zt_xesZVk>uv7RxHFegzvx)y$NR}rZ5EQb`7DJ)ZHe(?l64qk7@iVNT!Fn{r0Hx8KR zG>0mnCS@+AhVHX^30PZ&!Q4l^`XA0hvF`K#H5595xzMLz-)$`13I0FTocurfp|)iH zb1VGKj^p*v82`4ubbCnqWsXt*LbJ7zDZLQVRJ>)>Z_ zw!0qaM|_n1f%dJu$BkKaLA_i()%UkMe!LOP(jAE&iB^tRj@MxpdosLN^j^`Qumt)S z_b+|{+Q6`)VMUc;Rbo}5KIqN-J@$Jn4epU!$Ly+}@H){t!P%GnBmE#7mpNKv*kGs$r^0l& z6x?;<=e}VF@lRl$bv&4#Ok!^Pfye`qh|Z2J|~n%3CrN#;K%fO*%;px2`a9^xzjYn^SN zp1u{#|E#qaF!$mPCi6FEVf1U7C+VrxZ{Y9SKko$AXi&bm1# z3)Bo|LJfMwlfm3c{anp71Nx!79(}FN@AdTdDeY6*GT$=)a`xq{Jp^<6L@JSLoNS!@ zyX5bZpJ6xDX1`7YxCER{`5p9I{tE3=?NjDY?u|2+cY~RrCVpM+x?qm(^!(|8=R@r- z&T>_sspe1Z!Pi62MK#WNwdXvB`O0i+lZY%KCtfK9MrGa z$*!L92tMU|*;{send5`^(H_CsU|)V%*%>&7?0fvxj()?J__2!+QrUbhxU}n zl*owih_Lx(b+G?wPG~NvF5tyD3-ltYg&Xg@=F~So0P~KG?EBFhrLV@?-TGu1XUEP2 zd+ygUBk6l`edzj7CC+z?#3C^d)fx$&<1`5tKpKXDXUw@Lm6wOEM;TOYcpeM#Wu^RM;mY|o(8qMGL`qy({ZEcKE z7m0z|v*=mM9?k}_r8PS#t;PKJ7Q$ArmU9=2H$sM?uq)t9&OQG;`8gTI$H}>=xv4AD zSEhSsdb2HVM`k=biJIh^m=fjIG85vn<4V{FzBd!tY2M{%m*BlL?iRxLpa!r4{sHr+ zFG0QkEYRnxZ^`+l#>^|I5gFt4;;B*8V-DSG)Lj1o&V{fB@ELENqdzfL7%QAyc5(j6uj3JZhbG{Da*bQ|N*l%kQYY}5q zDzQ1fIc@{xuJ~Q?{;~eCTcWo_e~J7OnFp=mcsK{L?W0m@~amgG{AMyq~^y=C*z|Z-7ReQ1r{URJLd$??)!bX91 z;GCY`Pc`}P!Thg$Vfn!0Wctj+X>-+*3Z+%Ug-7Om)lvKOFK{SkPk?9=(I{Gi~2 zVD^76bJx}!YKh-~eIor&zUOLcK1YoY#+v1L1pkIT5W)BD{nY`y_pRmC>g=O=&n;jF zfN|Tr%%1R>&Sa@JxB%&cNGazd3s(8))Ks z{L8`poO|lII_}dM2JVV~GxKKVx9o3O{g#vQefzx`(ASGjGyd!V}rQ+s9CsK_>#ya zk?G;-;f?a zy1slpOL`B?xvcYyyXJh(dm6Lu1@%MoCcnlo@bBr#Js+$Iw}ZKX-pmWAjTKp(sWFGz zj3%|4eIkp&zU9ks9(c`}PyVm;f2Gy()$+r$!?VT|`~US}QF2l8my%zY)?HV!0G2@^ z*oW&11HkQo$o>IpsFm}T^IhQpJW~2dun)o< z(wtHMjIYy~&<|FD@B8`8Z`hma4C>wH*SCRM_YdqDm;>eLb=k8whp+(ZO<(>FFh?*) znheK-Go`oXZ_5vb6>v=HF{MlJmg&hcKU3e-Us#>9SN$*sn5*ccY7fSf8K8dkFdW3A zX^prM&J3LyI=~6y?!D{<`-YXC*Y4?fi-CzG@ake{vOna?)SYPtY^D|jS`WRtsdGIk78}Gw`?uyYk7O<_RyOVh`t$ZA8Q{=f!<)f!upun zfU|SvNv&aFd|~`k_&WAAlXLHKg68!x^u>3#R;yTSLYw!51hw%w0(5Bibz{QH7A&78w?f_W-?VI5#T zJPqb9J;CSid7$`VKd22G3VW>|9lGfR( z3DdzG>KurJy0F*i6>t!ICbR|n0#m`~_kOqn)Ffswucxj*DL*OSoAVLpWanh>%iNb) zm0p#0cGnv1lJq6%1E~Y4qI6NZ0t`qENI8o#0rWK4-{}ZyOgn+cXSQm-YT!d#lV6iB zL=(IZ)C29&`7Chu{J)s=3}Ec^=Q{eB;B7rtF+Ue&BzvvRK$ zzgAomZYa8;s0&mC7c91jw}}55{WZD_o`Z>ziNX0AotW{BLr=I0hJ)I-@x%CXAB+HV zBDGm_pVe$bvKQxb)?CzB(FF7^sClV{`FcJB9bqu&VN#3I=Q4}^NB-Hxpnh!*Wev8H zvpxT-GwX4d-rZn-&3>%$UWz0m%)uN9K7F*%XOJ| zQ^)r6mElA7G+zh$<*KpA;Tp~WH-}Q|9Ko*p_AnBBZ!V*M+zL(vJ!W-4?a92#oM18N z$8mm4O-0?pSzaDZhrJhQcj7E)8=Ui7?nt>{Hp0B127Ms!%Rlpf=Jh@Q0M;T8Ghg{h z=_jT3c>KPW;?=juur0JLR5?;PvId$&n?(D3+KG>Gmw zpkHZSZ)|E)rcD{InJ%Cc73SJM+4?8D! zPHu8$a>hQ}iK!D)p8wqgJR9S9P;Z)*oE7XI@XWc(QkMni`mRf@3w+(Kk zG@S{YmgDz_o95kTTBWp#w2Me(t0ZMfLP#ksRCWmwsVGZGmXJ_XD2XU7h!#{TNlDTo zAqj0W^R6@fuj~2yz1QcXG5fsl^W672-}61^E`rJF$>}DUCYfcxR!ih^V>S&w1~NZR zKY_1}@ssPXI)u-G{ekZ3PXN~Sqw2ffn@#8qv3BL2_W^VQ?|oyMr7#`Ts`XjM!T6*j z@yq!z3S!U|^leXvk5S(%gKI`}_?()=vAJV&owA+CYCp}E%azM{?^zEvzVbd+e^f_N zUvYi7AJi${0OL9HgGbg@VT_tR(U zJu?yPmp=sRJjRa$KwrTGuy)rQjHO(|jG1nOlR$mRy-L5Pz7loD@1Y|7V)N0|ZwLO= zV79UGs(Fj?k~-g8oNeLj;X0-+SsPrpT*J)k^v3om>k)W9LPtYKy+>!m0Wema8J!vZ ziy6GfM2`vj*`|c2ghzx%1bu?WowqOt;u+3nsur&nKQ(bGr_3EpbSvmacS@atE8uB( z4(3A@_$=`mCp=x5&?DXhPJnM>-^4n>`_cDnTie%`vJbpuT)$72P0pZhH655`)rgWqo#zRLaJ_w)1BTapYZ zS`O;ipMkXmwI=;Ju20@i#(LJ3y#CXLsOg!h{ZRnWp7|i^i$2lYg%y;_^et@s3`%PsAr?mpF6a8^s zQ|^Q61_@^2|4Of-d$F;r!Dt)2$KKQ9U_IwWxEK2Sn`=3%yEt8(KA1X~O7hqOp0E2O zdpB6}gZiGi zmRh5=qG-7&k^kgCCwY~AZ(|MXTFt;1x{_`~b7y8h8w5!*QYGLNCzo)Rc2r z_4r;4AH_b3{ayHX;jjwBD%6CYg*^-JDY&QLmBcHFcjE8Fe~JAP^PCWKiQ&=V(Pp3* zr3GvbZ>IC=o?ssDXwHor4$C-;cNe(6jfQEUC&}M$H+%{v*RGY$J=g=rt}EdKFt_>; z_JM1|{b1hH7hFq>pIl?=fH9T1nzI3nf%Qt*V^W1#yVmTCk2g_|b)UB;t0!jwTmds- z5Hy4;V2#(D>|=ZY>X~oC&w!04*xwXIXTe5T2-a@ZJl*%6fonkTO^&3(`jRn`T7$8J z9!sx%ecoyheyj&)7ySW$ffvJcIES9rM$ELI&3R+`D!PQbgf~VuM%G8y2lcoqoN1}X zsL_8%Vn^b#g3E%}$-Zdk4LI|pe6)Pj*w#Ki*OBYM=Rhsnb@z(AD}otj?l*sc>+xK0 zjlTi(d|A_c3e<7c-qc#%2d@G1I`@0mWBcjdkL=^I7H9p*YgRvxvC%$g$h2a0esfgy zH#G|Nm7nk(sK;2lTLvxAES`cbWm|%^Z7rTn;~wji_k(j%n!tR#swdJLp(f>;=)R4- zA3V2eF~&_3z}_|EsAoXE=mmHH{#R#kuh+M>5Yz<6(if|*U(d%|U@WNqV~u-FbWLITg2nnp|%%{x-hyets9GGWXQ$ zNR7bQsY1C5L4DZIT?s$I45)`s+`L$gvRS5C=2y;|oR*xH{H)}&VD9(U;;n&)$yq1c zinkRzUw1Ot$D1xn7kM`C93XYGH0M;rekoH(~|6x zU@nw#x@*%GaBbHs){Qd>tbY!I$H05ZztMW4wIgwTdL7ha_B*cxtV0!ZcD&D#`IdUN z@sV|-MQ}3Q1)Z2Fu$i;ETA__Q6X00zn!XnNxV>=hrA2Tz^oI9APl0digE;~G*{Qq~ z(mK4Y zrnc()^wUj%`@nnH_-POQS?5s8avk$+bgo7hV-v6>$x+ zS-jUVy^g5{NSrW1oubokEjt_KYb$fL{M9N8PC?!U|elH>7y4>qB9m;k6eFTQ@n50t=|D-h$KB5 z#vaBf%i(4?4;p~}Vb>O~X=`!D3%x;o-x%mlxD>vJgU}fsfvNB=ShqVC`sDiL)M2d= z4Fo++?MvGS-Y4}X>-xr9ejnHP#+>!!zv@n|Yid<~PkrHPS!z#esg?2Pe}OOEx333( zraczZz#f#1;K$XZjGy#7sgoNUJ_)X0`XJQUyoTL>E`$AGOr=jk>?=G8j3?FheV+8V z71JD2DOD-e7;Judn>u|VXH(t+HJB5}5|cHiTt}T#J>YtL<5b350gCM8Yi*uALaL%1k;QSu{b$E@91&>`I+{VTM|v1NjR$pY>z-88*U17y`rK8F&Haz{605KH1IqD*c!q0oSz%k4^=h z3f32{FPsA}6}(h1JuyAe4cf=s$Ln$~Y|UuRK*xAG@^s`X_?WY)`{Tvgo4+^zPWrJb zfa~CMu#2!CbjM7!w#5eNC^pdwCSpj@*CM zkE$^@!~NCQ$@|mm(tq8{jqlY}t><_xJLAV#*!bOg_h@DnSugJhYO~%y<`0j+=YER+6r7uR z3SMx}{JJuBW$a?mH}GBfyKp185-+VfzxmH(xD3>ry|0lHgSkg)*KL_Q;# z%!C!-bLPEy1k_;f1!IT)@Gtl?{oS$*uyfwYw_uIS7-a zi=7ldDZVbcE~@^gj=MO#IQ%r+%lT?wFqO#bU+<*Xz1{)$Rcp=0w$>5dC(i} zIPi)0D(+=CskB%8ammLeo;hBT98WRSys%}uWjd4z1!wpkj}Pw_xPX2lP2g%xXK{vB z2Yh2&nayc)g7=kivNdXBZ8fw$@Hki#R~tS|4}rSB@q@8KT|8;VHQwjDz<5f%e>s>> z>3g(Z{5kvvYM=I}=xe%&bC!ld5kAj;%%uJX)WM&ChEN&WfJw?1px%8Do`(c;GR)yV zf9VD4U2uBhA?<~iAWryjKy)WaTt?aUwW z8X1M3)7Z%C!kW49s=gF+LUX^t;B)^dbb|Ns4ycP(hr6LEwC3#A2dM$8!Kn$GuN-sq zm>_0S6E^4A1^V{P`I>@0zQz!tZ_iw~5vSMa-)oE-*vrv28^H7wSAv)&Uvtp83M0^HLinTj5LX;5z5}rN(Z2V?OC~V~xc1@O5|rUIzC- z<7VUPr@?C@4eH%JdR=N=s$a5S(sQP) z!#P)1-?uvWwxVrCdgCuGy0mB}yalz2YZX5UZA;pg9EK~BS0vwp&8f|)%hQ*qhr<)h zTGvG%RUl_`)uM0V! z#`VM8_GU6>h~8FCN5w!*c+IS0=BS(I3WN)k@AiMNRpE(Z0Y zdzr(Vilic2!dt>?nXj@EKm2AqX5;h62i|n+jjQ2qaIHHZu7zgcT2hg7B+S>`Tl6lO zw;5m60Bi)d*av;O>i55cxzg=NZ$GLZpb*Tpc7R&Zt?&}`g)`uKQ0GHSqJ^*Vl!{w;GJ*B#>r?+fn(XLcBq+yUx}dVsC} zSPQeSwr!+sq+PUK^c-jrZxLrKLOhfRC7i!hKT$vN5{!wDK@EH-eg@cUqo>K*>!jGE zST>sFG{}ddO(IPK|I(oFpm1rZG<0A1zOd`h888hU@ODuDYYINBC;SE0g4Ges-HNEC zZN~*XI5{|357c^x!fmPBI1T9k&jYHKsfOEcAYHaYgS_B1X2dOrljtclKX?gVhFf6i ze_Vlw_~!pm$9N3PcZ`c%GadrhgP&n5xNdCXY&q+D&%r@vNLafze=-2D@a^Zj{yYxG zx`d>`ytohXD4m7Z%J|7O)&2bv<|91{r+}}yF_CM;Zm=G1Z2bt_3G=`?0PceyfdS@8 z%%pU0+Qw|p1F(RegLh#lG{GnD^|%HuqkngFxzXiLrvF55oilhUMk+>HCR!%i!)WG5 zc;@r#^lNv71P7XS3wH~*h41m1c^{ZxtKGY1t9k!Io!^>V|78Ec$U+baBRu3C4Jy`7?K=9r`zo0)tq7fCDcsUWa{`E=?7stjLD42bk26h zHSuM(ZLTdHLoWn%itWVm)-_sEL-l?z2eAfpKNQ31%;wZns!#AwFea!E>ZU82`qS2ey6QnNr}F>R#>as(meh=n(6{Ega1x#P=5M!xeJaLG)>D51*QKt^ zcygUumA@*Ot)yqtwb1WpZt2^`OWW`xsdbYY1n1EC{jCA|KKo+){eFOT&<^f{Pr#VV zn9X>16Lliv*SWaXU2lv#I#C}yJ$-t*Ql?TS0u!S~AW1D(tyfLUc(WmWb=IP4z(7#L^kZu5|A6y!y$1E8s9*Y8RHb*swM1>q zb!ZdHOFthFt#vO zBT*x<1*#WRFL(ro!EAT}?uLt?DfEP!6E`RHR6Pz`Vq0R7cqG0%wmbGBEMs2Nb&=~L z-Qb7t55a7!Oe_;?T%mD=7KJSeyBBmXaE3~kc$fISv3p}bM}CfM3~ywr$*JK?ekPc+ zd@Fs7{pqQ*c619g1J`Sn%lR?& zqjm5DG=O8keR~g#2ID7nD>ch{@Gz(q9myRD;;-fzY@51`Fgel*RpnC{-w8~D)_m^NybpFduk3|kLS`SZEonbW&E#B@i3eX zKGbw#oB?J$IwLb9^Hch#^eWCXc(mkEPHwuVi<}jA?}2*{y!rQ=e|Pw&!#{Ij z&A)5@t#Giy!PnrH!?zr6e5CP_1@Ia3P1Y5!EA|{sJ>tK?j?|9Si|H5B6Pe*qnR8QS z!1&zw+#u!=8+V%9yGOe&tCN^RtcDiM&%Ya{g1+ZrV64<1dcg~@3G~l(fCs?3ocV2& zaFg(>p;to&F26D#mlTq2(OIDtaD4dq@N4v%hj~0rEc7D`WiH!7JmSxTJ)nNRUw;%X zhaWk2V=Mh9b>J!Z7Ak@o)^E@p)ZAZz-C%sCrhZT8p3r!Bof&hkcX|ZQikubbyyhZ5 zz^ufq#P9LngE<}@VjW^XMt_VRjU0`1f#Ps+_;UCq^h=;yy_o-Ea6Vq!{I>Z|qW|{> z{fzGYZ-X(_xnS<@e)Shv@Aw`{!T%o)KGdP+9G!D?Hux~c@_JJ<`3=-p^aWUh@*eEW z85s6RsaxCuJ30GR=}67;6fmwb25>IV{qQ2Fhgf^kv!kwLY^4wSf4YadvVLPV829sO zoKW0TjiZgDC&x~X)sEK=e3i~;y%&Cn{}6AHXc3(8)GW~~SYOu1*2j*3IpFzl zEYyzHj!xnnyL31m-T?i;=hL;SH?wXwQy1w5dQ8msAEtlt1+X?c2d|AY94y3HuT+rkid64Vp(%jK7IM#4p$b7k&60}rF|kAKq`7y-sib-@_YYs9*(-cw_7 zb26U`bqVVu6`>}$M|qufgahzc-ea5)*^~c17Wi27=vl*g1iU_%Lj|}5hQf!ip!|aJ z)`Hlo!VL-<6l{Qwup+)9?xtLwdHiaSUaPLFmr_&Mp4px`6>6nxr5mLhrPR9*l^hDr zy~~zlOICt$FLn@Ho05xQKx#m$8Ptb+z&vp!?1c{W<-HI3BEDeuz*|t?`B?B7s2Q#T z*JL$U_tz%$%lUj*UpHqvk9c_)3nRd_trd7rpN7Zo z7SOXj5BxggFFncXO0Gi>(z9|r{0ZvWUdzrG=nU5EMuT~y|Gx*V!uZUZ;8f`77IR}Z_m{KbJ6>rKwb^#0Hn;aa>G{JUIh^jiH)|E@8P8c+y)vh~~C z47JN@m%WA`&)Gc}r!Gzn1@DKy(toArX8xaz%#mx7YoZiEb#z5g^RcFHy=5G@N7zSU zjPJFq_I)b2&ou?T1Ll9?BK^Ypywnif6J2xMhkaYm zr`Nc#(~V%vQ9w__h0F*$7f=1+(BaSo&NZtRs}_4T{%U+(VqIbis4LmKt7fzizJZ4! zl}H7Bbf+awOLz@m3Z7+i1?X+Em-pZ3ztNGAk+?LEiOgdbcpF$8T8yKlY3Qo_tAhQa zYJS!H9(e85CfDSx$uqyVKW`BDy&h)<-QAo$_)O%P$gRv0pAni7QiD7TykE>`>^Ddq zO%eJ3f9$UY_bc;|e#3XV5?tTAmv#@%vK+yTN;U4@V13Vx*?4Or81qa3W1LT6BB%w0 z;Vovoy$J1KH)pn7TY7Ea<$jP^O?p+`fEt5q+Q;w-YzFlr*D&L1{jZ(Cn%qaAUZlSM zBy0os8fVrF1a&2I!Vc)a*MqOud}vKCiTUCQ|DAoL-_rZjb*@smN`WuTeb4z%>cijt zhkju7h0o!AFc$3%#^BbujqPWHHL$JBpVs$je4>tZKJ(JM=DOy}XUbtwKgV9nXTSHGV*h+e^a z!28x(`s>W^-vIg+?Mqn+t|Qli*W7kykhGw0BShwDcAc%A~+GG`K~Wt)fH4PGy5QTljY-<*r4$JZdSZ&}|! zmwt_&M)Pd7UUfkC3w?Pj;4bF$cs+Z4d%x&2oCn@Z1HqcyiLfNMM7v4QpYb(w%Io0y z)+bmG*5UmzPx3j~%{-R5k-3otun51t^DK>hoN+V@)Rpv8+OuMjvJYsY-5=W@dkNl) zz87r*&qbc&B$Qb}j8rvTHSqbXF)hts8uSObKe=b^!t?PoGz9M(Jp((LU1^p6Ge3s?=e=Wb^Tz>wTspvUe^7zUSv>%V;x?)}!k-KWh1 z{8x=%zl`gtdFR)l_eQ_Z46yEQU%k2Bz2HOb=_2}VwuAMv18_6*!Ft2r%s+8Gu&2#E zk~A=gmsXZvSw5T}4({vY@{bF=Wa>q(E7s%u9-H6_I15}0#eS69%+J_IFRt}JAJ4#K zFc!Lj9y;T%>tH8Gz+&+K)qc$5t*c!R#^gi6INx50i8j~uYE+1%u zf6!;UB(o%#ooHRim{w2DUKmXOm3y%FrXHCA;QcxlT))18@8CJO5juc+xwUmQ*gwJj z#`~ZF=h}{iXPF^pobqqz-_RADCB81UF4ipGEa=s3SkSOwDzt)5g`Em-gm((wDcA+$ zp#q!=eG`2X#!3U>gV+bL?ob16jNZt};Vq*VM=lP|Dj3G>lYV$i^pJFeB=Z9YfO7}# zp_ix|Sj#ovu)nY^=(i~1LYOC%O)vK>yu0 z_{g6E^{K01E^L7oU~S9ysZSk-H^I7}>!;e(T+UDM`=1TdK~4TL_yMfb{Q>&g)u!}< z=<7F^)H7iY>0GytU|znHeEx4(N&oH~uom(b{AUjdYOwx|Y6Ne9I(rEWp)Xqf(pY*p z*#D%*x;CE$)hDilzc@4Mb@1oa zrPf!3Pjd{s0Vm^`jl&oCIUWRaKK+FDYMBEXKV1jip%{GsaCii^a=yzDxDQP8wvHk1wi z-na7KVya&A`~mpsi|`ew@43gRO}ZCYb8$wFn!`9So-ShkcVFsxuhJvtOcQH#?lHxn z#xx4dBdjkK&_CCUbH;B0_aJkX446y0&aDRZlt^hLm^W{3<8`XmFd=_J{{7+m!=Fb! zk31HAEUG`LSG*Tpl0R~4%HKG_e~bSEo}c1bPs2bhY5@4e*NfGQEsrjb_KEa~yb^vT zJPZ23cg(Y~muv>y1g;y_AI^qVob9eg;vUg1uU&9n=1ueUHq$TNFKyDYIJr340GwsN6*$ zD!5)hm-k%YG4kgwh9^KxQN83NFkZI)w4HN*UIKMAy$`EFAJ_5VI%IEGb>G9&81*fg8);7{o-zOUuBRNnetA-iM&hWE^t|SYz{fGQK%G|LmY&_b=wb z^rf$J6u6emgat4WUIORPl`yx?I^JDiP45_(25Z2&U^Q4uJGdKfeJ2iK&A?xPWp6uni18xHEQ}<^zE;SVI3u6g2{ZZjj z;j<%WM~>rMrjueP#V(0o5_p*&OFWjiyx{VJ8eq>{W7wS7%qawaCGG}2mUH5Ba2vFU z?~Cn=-2*e}(>oM76gee&N_2Q+c;uJxFX6jk1vQZMFb9{({a_tVugPrs+&jU!@HaEB zo}y>P`*9Db75|G5*!amBq|bS$|7g$b9_u&8iLTp}E&_ep_p3>(mmY=+_WkD%qzA#Z zumU~7>a*W~e$1-W+SRa{gWjbd>G^F0ai|J6fa_#!s0Oct-Z^uZgOGx^otp)Ep!~kI zn8$lL=n=UY^pe<1r^ogLW=2?p`yBmg3F!6mZ#NI}wRJ!H3arf;JDDe1uQPty0eXbh z*{=cp2wWY?`m>EUZ=mk2A5YEDK6Pt9*2S;ST%Wlzb!F-g=$r1FzA$?s zRrCp2dn464)cN!Pnjb$w|I_baO}wytVK9HY0dp!}V>T73OZgu8J#a!c4$cuUrf-DD z&)DiKX2u!oUk&YG2Xk)<89;4J^arRz9mziu^t9B*^Yk1Z*WF+|@4EI1EP=n_(a@tI zQr^J#1@klQ)cab2Ey-8tm=YLCvLs7D^GFQ60sDQb{)(DywT$=S8eG8r2k z8$BCdV{Y~{%*_5M^ijw-Z!mnt#1`WUzuzq8#61kZ(u1!)qmCVizsmj!W;j|yY5{#q z`<70pN6y^+EvN(L5Wdc*Qdeq79rhseBZKcB{wlnhIVyxtk#l0_#A?QC#P32;dVreMPEe=o#_VEqJJ*aY;CfLP4|=FH zRQfpQr|g4QIQL*wYE;Tzv3bSwiq9)KucT_KYN`;#b0@ikRq4~K_4}@jR-Ow{*e~`7wNG=l8-(KeI%O2?->3+8$H>O|{AKa6}BsRnAjU7<3(M$KOhI|66H&9ISK zaOQ36;hfMpR2Zv=jB|{aJ_Xl~55U^KF^;na^md;Ft`Fv6mxB7SnvyzpJvhY76Z0sq zX?3OHpwGKLXUWZBPTW3lzhA}t-p@cy-q_3aqzl{+Y8O8+r~DiE6V$fNLEWd%17A1y z(Jl1Cxvp4)`-(XyXW`Ah8tQ^MYzbJem<)M5tY5gNp9DSNSa5Gwdvxuv*XIW41nof$ zQm^%;^d`Iu6QL{2h2HQ7{s8ws{U~aqdQwX8pZovD3FmaE6P>`8iaf2F6Nxs zt93V?WP1jua^{EU>==xhi_A>U4CYSEOU+Atnf@|;2u|jF9`8Zx@akpyK-!1fhm9ld zVpjRU*ua=IHrFD1QXWh^m>31uf#=3JD{dX=N4fxfzqNviv5B#kFeEx8Iyy2sav*#l zyaNWqDEgPYR;qw&mFuprsrSd5=zHq7>Pu>0>K(7Zdw6wxj@;j00iP%9m)7pvfw9s{ z|MlytDXTrJlQ#u5S@mf1KXY625e;DGz{@y`Hv={CSF6dnuIWp2%`*nFr?)4kqBP=s zn+4$o;ftAXUcxMs?$A2iI&8jcoUL|gzq`M;aYu7--8i0{!~NZw=(FJZqF-Plb&HST zYtXZQ7Wgw~fHB?oa0#Bwi|GUY0rW@c^=yZy+#2u~VEp2B;5z2(FRo`^7xvQm_xPMW z4{FEeg`+@?=@x2nE74`l3H4K|H5yNvFX^v$zq3B)b!RQ^Ud|BcpXs0JmhP4w&*ZmL zVNc1Pl7aA2@k_xI;Ry*9cwIuwe+ zMd4|n$NGKxp9g|Z-ak2NZ_os2y2K=_h zxcWV&Fn`oFrE0WlRL`(=xFPW&!MqbSCal8=&vCj99Kv24D`t0F61xbtGeeHFD)Izu zqNn#^XbaX=%ks;DT;12yJ;OS0w0yL@dGfE+3hx8+U41GWnYZBI-vFvTcf_H^rB!^ zukn)a_j_2Uvfr>S9?CuVFeidJ$7#3*tVtPTn478fnMY5CpTN9tKlrnoz;b#Amy)k+ zPj64#x8Zpt&ZZp&bvU=y9LJBf%CyS7O?KWT*Cn@unxH@XNATyE-|0_N7gr0fOn>41 z;C-v6FoU|L*Ux6K4m=3V(cDKn=5-8eqQ+ZZBVL>88s2+e?-xRQ&Zu_(J|E0y_0m03 z`baQ;rCX+3CX7Mt{nY!Zy0ARCJcy4zE%~(MrQ}P=S6~X93(jb<7P<=bFnt0;(nC1; zMrJxT+ZK;%+-9*s$bOD%`xkmUk*59hZoV+;L6;21WylT)2)N{R7E`+9Vgnk5TqSL{B?FFzV>K<$UKN#FA+;@$e ztRY!*b}ezg{1lD_WBy4{3ICb(C3RN)lV^jyP~J!C7{1ne22KaHaQg(UyQGupWSvZ% z%*Xhg-Lv(YUqpS?I>Ng!Cp;&7di3<@E0BZ7Vvoh%1APT2!eH?1@CTv~L?^%q_zG@@ zdm{G)vpgORKN{{1=}V=QdQ-;lpEvNLins9{|dzA8L6G&Z=-$Ksh# zGccds&ny@PZLb&C3+rVeaL!m8u$FcexaJ)H9~W^ZgRzj>k-ki0MtvsMN6dl!T=gY2 z^i`k^>f2sVYGi&)&t^R^&bPL(o^uPVS1twjOXJq<^m3}VZ-CD9g*FAhmwLTxe4T8a z?7z%c%BHfZZ<606Z-lEr4b=X)(O?754A>4sN`{oo0DF1$UN%cMOMV7VrJhO|ixqGt z%`P}Gdt&xUNWyWs<8lvy*Xm5LR;eFM|Hvm`UaL3jH$2Jq@_5beg>|5Aaz3nvm*9CQ z0rOXLDs!=UoE2kkX6~g=pccFeYTl!njcFXB{;aR``P}olj@gdc%b98FzNZ%AwV~#x zZlxEk2FZ61)uLRZ{rMv}lWr7DhO2;IF~|vTWhUbX z@Eg1VC&0^~2loPS4g7>TPHL;hHB;bn&@0y;j1|0A?}59)`A7EMjbl?CY^tyHbl8R;|9%iu=NeXf$NlAR4> za$|5pcFk2Otx|d#p3YX#6WqJZ&(!bKz}+j&+ssw8Y$Nu{Q>8J`P&!iFE|bA z{NQ|)=Go@i9`F>jqz3B#XgsQJcxKs|fu{Bky@qq4AKf|T#%Gl~D>&OlAJ#XZ_sYD? z7{vQ*A#+#j;#G`+vu~T_Hw$WH`gqlg)C@}UOY+s2_LEx`#0p}c6n;{;7Mx>Z{}t~l zuvb(KV|HwIEEP=!=N@#Uzp4(*!z0`qykDMxyFd-=1(*%yEI-ko=i0Ly%sXa)8g^ay zo4QW*^3^#l;+P<(RKHjW=AGBTrQkknZM-);2-aMiz}wVa{hRgwJ&1qHI@@u~g);~9 z!nbZ_u5~N@xEk?XFWQ28-b3J{4xA7A;q+v?rhDTaz?*A5$@jT8+W%#(WIH|7UNcSc zd6)69p0b0pp#R@>w}r`+GlOgOeP(|cBRv3WEAHdwV``&Ufc*kFFfUhk_!gYuqh_)K z)NI#-*PFSUKf_v~YxO&v?{z}xgiz&36u_14*}rFz|%yO|$E!1aC)7$4mTz9wn~>T^E#?&&_i z>P#2Fmv|>;!c=$^8o@GV!0GQZhE!KFzfqHkf^pJQ@Hp6)rq^)>=&w*??SRkgr_!I8 z5czqarQgc@$(8URzNlZQ<5&;1POu5QSMFgZxL<3|_!y{!xs8I|6y*0 zd!EIMM0y%wO;g=aBuD`z@!&H3_PN z>$4tw*VyHFPR;4OF4WBQx%mJ8(J=_UbLp!rr8Ifd9Hcx z9T-8ab`R)r@wz=s-_mBVr^&gdPB_9 zjdzwnBQPgZ4>ITTdzllemkkGFbaOoae-`-pRlt~2zmmV3_uqanW-vZ7AN0944pJ+y zW?l#i*~d|H`329f_owl@*xz{#c%Q1RP6Fe7-?x+5&E5~LZ?0$Nf?l8Mr1rfS4;%ZN zzZ?6$&e>6(BV{elLDk*iMR*q;tMFKbrf|6MaA6J_Lw~rj;KqUji317!mY%UgeW#>RKOzIi7E~#}By^@1tvy zIimlng}Eo_3oxhjcXkeh`udmX+I~$xP_y>q#!Dk%E4cqP2XjR8hE3q#F4n)T{htQb zGmU@DU)7*oQ@_c4lWCf2npy(CLu<~rRnu{X^~GRK)4l@pU$3RUpf=_GqW<8uYyHQX zjeVSDrDdgEU^Tw&QaQzv}8ADHl$;}P09?nMx zo0&H=&|=JM^z51^8MAa`j@)8s2fs6OTaTrhkulRJpl@XjJOy1i>uneFajpGl;q=hy zA+@I+_yX*QI=S%V!ZRwIQQ_>uvkONQj3`)^SeB>^72*}*Lt;Z>tD>u-6X@yM4jX`5 zDEtrSu*Jf$aB-+Om`8Vj87b@F2j&Xs|8z~f0?gmkp!6%b2dOo=SBIb#_^&y(8j&?M z*9Nt<=RkdECb-5JH`RtSz}&+e{#7vlay_>mvIa(i^#k{&UF2HsWA1O=Kt0L&oY$4t zUPo{ZabMMoVoj$rcug1=Sj!0t^GBn>y=lL$_rhe(p8gH=34Z{_z~%$$Aog1sJLw-Z zX0o4SFsNgiQ#=Fa??b?Q=sbGxj5DpHUL3wS+%nQKa(wi7qNMrJ7>`4sceDoB$961y z8vB%tZc)%1*E8BP&=tdxaOCyy>*1e5KZUGEyY~IctPuAM<2~0%*F^X3JO0D_LhaVN zq-(2du=j~MygjaWfib=Fh1Qp?51x-Yc)(qAeg19(b@7wIyv2A>|Bv^nwYgznJma-) z?aJ5VZSZ+hyRe4m^Qrg9&r?TOOCPkkn-AkK*Dar0KjylmS7|)Hc&1zdSfl$MzJq!t^-6|={)ua# zak4R!;zm%Rdp78?UY%NeY# zyhj@1c`-J40rad}C+`n>ay|urf9ve0bM}(4`64jBc>!FvegkvAJ@ne@o$d#;0pVs# z1U)EY(FE^=rtmQghS6Yu-CWRTa5eZf*3--#NGF1sfI6xECwo-%KUl9^ zkMD6zWK86;=w;D|V-LqJk6#}61U$cKJ=hfHypmc_v#@4i=PI46I9zLDm5Eh0R^C{7 za;3?Yc30S4VQk^p!Yc4a;*CV#c;EPSFey4I`fcRf$N(71JP9>$b942rkzj4kYsbJv zolc$mN6_2n`fvQ_@BRpSXLWeE?BO8pqr4aNLaW6LfI~0{%;6ftWuR7My=O0E;UQ4_ z(fh6r^#K?ksmV0UHOpDE{*qohb*IKq9#&;nWqag$1iq#>@QZH;W3d?cy>|TPi82P! zQ*QpziC)I1z;(%3M^B*p#D(Ddrh~6VaJ^B3dIW1k z3tLlLQ)ed6Os*|iTk-=G!t2Ga2mU36TYFGi7q_N!ZgBBjSOyhKDwfm%&vVlA-471I zk<^jYj`WUnpG=?3e6S8@V%#a$DVUr!kUmfMt|yoY`aXEwdYxMXa@|q;QirL4&&L|# z296pDo@CIyxTH#vZHK8@3Zp^nD!pvS$%-0DS!Ktcctl;-M#9R-%18(J1<&_`Fdlr~&xcmbfp>q= zV{2X29Cr})Y#-*CA7nqso|ri?GbueOoqsPOa*ePizXQ(T-0vQ6 z0o)74K!{Xktm9tr8swloel_<8(zRgS@V+;Wb1m^2u&!uKt;T3hucoHHVBN#~UfrZO zs0G{sUN3r2jb*Z+A6xCm*xip?!}DJ~RIT9zK(YzyQ{KD27EKdP6TVKJW1VBSK#ORL zXzfUC9Qnf|kHXUMQXH{O!ad==(0f5ImvwUU8nqSs8rqX@*20VWN%oWMMCK?hOfL*( zTOLRrNX~51&b|O0m|^oOOaW^c z#-umEJI)UT*J$-v<7MN7P31O~n}TQQMVRp)uX2Wp8i4z`@rd=ed+5Pbi(UzTLr>0i zXbsK5xYGMQ8j6N)08-gtjroN+M|w3^hgJuDaOQV5Bi`pg!3IktiK2FrOl<0;ofW0Brq4W^8Tnyj(=&Gbt3Vt&Kq5u9wD_w);}gznpo)?Xj-vp z#flXwR@1*^<>PvcczW`r*16^x_& zxYvbxgX^FAruwC?_m}_q!Oex#_s*r4+G}kWSEhYgu8IEKb4$-H?VjzP?U3q_8d)^5 z=#0Z>96tHb$%no;_{G6ChuR#P54*rQCx_taBTpaM0P~9G6+K$~XfYPml9@0$IXO8j zH7s=irlzL``%jl_m+VN+CkVlCXuzxjbH}=P>`w&uR&yA26!Qbu^Bbv~9D*9v0XioX(i4C2V8X?w4Tg?}E?;%0eOat2hm$-!mh$8(14U2P%L*OMT^j&7tU_ z=$8dw7JLq#QRFO>3*#5YZ;ag-yBKfpzR14FHQ?{Fky&*9T)k8JDb?_oKp)8A37iM^ zB3=#Lo_W8N`z6q>KcW{=KZQEDeyGlHEDXZ~<(}wTWgnvJ#2B~^rojSm?=^$9MA^s72|6_TEq@aXqy!-&*_E@GTfa zc)y)qc6yoXm3gPna|5)$`#JYyUvyv8IViN}#YV+P#aqE~a5D@9^S+L-I<`8t5iW&m zIX7iEsC%CYZNS&J4NMMA4m_~6@QxUp)`YcqL#M-8P!HPU@l)q~0`yg?_o+kq_o?Au z3GTDYQ_EBKqA!FyU}kD&YC6*zra`?-z0BiKDO)K!7&b%ST;IS$FfTVRr|zw;eVADQ zL(tjA;92syF-KGb^Ys}7UciC=gP+s=N6q;}&_ksT=xekI{Cwl!55d<_UCgz>uhDDs zBYX#EGcU3Y7+32>pmJ{J7rWaj+`9Dy*NsFj1J;5#K@9Q9WKiRzEfZ zU)mgMhP|nkn@5(oHi~R1bPSbH0dKy7ry|0D*378*yORv z2SMLlw^X-OW%v!QNnewG3+~L^nP~{ca7FG4CW|%*W{z5qco)nQ+=I;()D_hijs0(7 zHow}7dW(Kg^&9_YpP%ty4fzskEBc6Dhf$!fTKzeiAI;y%xh1o~e9%~a7^o#(0xh8t zm?NqoEuxO6eslt;sb2ip$FkF7>CZ@1m0t&{;RMMR=`$J`#Xj{Up-95a>fDg z{)fNE1W=R8vOvuR>2GC;I2#h->mI=J*%DTe>3i{ zPXFqa;C1VBZ%x=Z=~pmz`X1kjdx`qHJ{9-ZTv@KnSZE_N$%cb5#aw(L>Kf`a_CuJz zxUX7!^mTA8jz*%9a5Nk>Nn?aiY;JsRd^v1}k%^JYf{7~d0h|SU;(Oxvf}Voruq3)9 z+8bV{#y1}JhWCa)hYnCFR4M3TGQM?9stDFmtgFo8tT3Nf*Y$qPM^W3AH==JuACEj9 zaXq^wbW7mL^xDyL@4D|jYK-dhmk*CIZRSkUWa{NoyI+~eGz3a}YJQzQIFZ!(wU zIL=?n@#qG|!&kz+Fdn+XgJ2ztQe-Y4T0uK-PyYq{I%~q-NA})50NzLHO|?P4lJ&vU zz<;fQKMR>$CO3_C6is3tHB-U8Q8ubEnqIhr|oTe;f;e~UW1TB7uLRBa(DlWRU_*PC#X$;03pH8wpq?Orl4J1~1n?v$MVF?}8D(JS1K zlkhPfo)YN7Icd&GxDAdge_Y^A(L2)Y0s{r~!*`eYcrf_|$X={wQuaW}jS z`Z-?#-&YsZ%g==s@I1K2nY*0~{(ghtJ}~F>Z)nF%@Qa{3s8bu`4UG?t_e=CkjE#?t zo6kH9Uq-)-{u}u>@@)9o@W-52btjDHYy;OxHGjYUQ7}Ku=4At4rCPUfmAO?tP;>A) znFX#572tSi0v|Hd-s{fS!J1sUEFD~%)|sw=+Thyu1RMmfXZezWO71qGF zpr`3JD2^6KAAt*D9_)?mjr#Q$mpg##Z26<*kG8=F;(hrjc+W=QK|C%M={GZXGWYrz|GMjup2qdL^})>U zsoAO8wX*K#R}^1S{27cZ8CTLI*(CWpoRT^vrT(!7_JMnL!)(LsIB1w_81!$s7X1$T z$EJts{`0_^zj4>nvZcX!m+FM({H`(PWyW0H!S|^{sX^*_ z`wWJ|Y%uRuJ91WqGfG`M(qN2bY+#K*J=1&D9A^&{#h?RL)6TxnU`e# zY7csjJ_2hj?gzf#*rF!ql^d@Pg$Cfgel0XY161oVx80N7lP$^=W&TY6nZ6-=Lsm~; zFHq0Wqh%ey9-p7GKLzK@e3$($yM>v?DHsDcL%nRh?8?l_%%7moyK=5_?gnsQ$fxOE z|LI)t^_yBYHPAxOL-(5r*5cfQZZ3Co5F2>S=+m(eqf%a_Kyli@92b2>kApq3vGTF< zKXW#u_vFu@pTL}IDyWScx3mD`qbuPCF!!qiBVZ_~rK_p?G4r$G&<2d7u7^!{$o)BY zf?C!*cpS_h^(43^{%>6}*IWh0Yu4)?hFze}Ypu}D-(0U}`JP0!&4{?(3pDbo)yHdg)#d>!=&o=AP*FXp${>oScwbWg!L(35JuZd|>E{PE&;ew`Ykdc*&6Me{|yF|)vY(Cbfqyd_j*ma?zMCRD*~k!=y@ z2yBgQjrETAj_-x{68}%Nf@%dT5-So9fU{6apeIa>PYnFx=6S%VP>z{GFwb^5sv};~D z1N36n1$9ts?CSHbdo4jdQqS0nP&u!1FcVSz(>z)&!t36>!upJ!-oWEd|Ldyss^HA0 z9;qIwrOBnqSHYQ8SHfQcKexkAxlxT?3ba?>`%?(M4!*}%R+PkhcwF6&N3+DSaf;td} zfq2GU1OMf0I(<#9q2`;HgL$Zbhc)YMU_HXUVg8EWZW}vt}T?VIt`_U5h zr)Zz3eXZ}r-ih@B>mWU%J)+yf+rpPZRi?!GoZJCLoP%XP`T~3p`Y5dPy$i1W?gOqH zOTqO_A;DbF9MEg^S?C4UpFRcer>Uh=IZDARIFb(vK=$qV- z-H@FLzd=oCk#3RJxPEEzrNy2@`(pCNq>Wt0U0u>$f*vo@p`iACN%oTLEV!J0stdvW z=?r@aHInW4x;%xWPU=HctI|$TH-CwN@)Ccc}!*C6CNb}ND(H@@!>ydh)yK7-QHQQkA|qdox#aW}8~iGSKhn{re9XKN-7R2j)}8Mruxe&NVocR)RU# zZ+M{o1a*bMU@mYLbLc+@^Dp;9|FtgY_d5w{f}gKWXRPG@n}eI+F1P@mfDK?gv?Fgv z-Vo+ieggU;d_CNU^-S~y<636|{0PRt<{rzT4(It6fce@AI1CTKGO$NeUGf&@>3Kc) znj2&PidSGQSSvFgb+59I-aY(L@O9INX-(hj*8TJtd^qkcC&6y0kgkxfm8liXqt5W? zo9&xD_CFnDHU1p$f!Ck`ezcxo&y=sRnuMB`_kwHN&+rfESJ0p4YjZDW-PE9OZW5dl zJ0KSKe1#O_CGMgG0U1Lps(&Bi-w@M=NEL>oYlwECm#m3x`@vuj)*a1B>C zcF!?(DyEmfhh6|{wytxJz~?X-zJkTn3iVn98Y%Hfk4%q@8q><))W4NDCL0skv@mr@ zIt$L)!`0wyfv3QaKMZQzr@~68k*>jN-y+Bn?nLXZo~<6t{EX#dITtZ|cSph)n8Mlc zmy}%+cw+5c)@xyXdoZ*I<3KeL>mcRH(|cxma#H7z;7lkr!Mosp&!aiRKj50y48Nc` zZC|w2OPTe5F0^HK($`QgR4=H>E&tE2^dWP1)A{NAS&)x;@*^-_stZ%W*vP(Z{Y%FD zZ^7;08fEOi6TX2rKyB**aJ{<|E(EnE<2Lg|*ET%{H-VbFIi%hM^T%KCh+Eh5^UWRK z1GOX9I%7aTt`_qcm{;cWFy=D<8vuF**MYN7)c?&TFN52_JlC8z4R1r71KHG%)s`QD zrLmf8TZ0b;f+wTDx8%_2H|bJ={n?$85ar`W{zWZ! zmSvNfWTro7L!JT8!1ZuZ>Y`LjI0)X83Fcf6%MJ_tJKj6qk1gQ|P&;=|QR`I`G#+-{ z8wloa&%^8RC3K^A!28S^;3_DB%H=ATGmp0>GLBwv>%O(nxX%acD8^B0Q^ry4sd?%T zKFpcg#-f*ialiYhv4(kq`|k`G2G`T!t3IyhVM1;~?)vQY*&X;LPlxZ4-v#G0J)V3# zsRx`}K6y5n!*xz}PAaB2^SdeiF}K3#^yu_D_#QsWe3WShwX(IcBfg!x)0aNlkY zTk%HkhsQxLkslij=fPNfNqxb7U-Q~K!S&%4F!u3L4fNdT$Nd-d_N(c*-x-JI@a4G= zx(CnTjIet^eMs+~y67BGLp67{#$t_a222NQFtwm2{pB`h|4cOxsLHsGqH$-3^3wL9NLeR8R08TgZH(Oj)L^H9C&9($mAI2Q$E3 zr;1`lu?OQ1#$N$rraj=SUE?XwoO3YA`uO_zAaD(Hm}MjuiA{-4iH?TO@MGjh<&DVV z@ZxZ77{v^^A0bPRl8f0h%tQ9|bwB&x>tO9$KkFx;hGvcaVPNSF?knQ}W6vb#Iz9w% z(U-3;_IMf7 zrRiYS?$u~buEoYqgP{tjUzu;~qf!&@3g)pNf$R5d(5I?yd@EQ(v7T;?!ykN8Jy|`N1Ac4r)@1Wkb0!$h3;Oxmr`xA1 zXDSCCk7KjP2J>;N=BfsJ%Ja+~IfL`y^>SPQwV9=8Joy1khD%^CoX8nw&a^HoS61$J z`cZm8Tl(xff%)JNIK*tL?wRhH%d(dRGZ~Btt1|mopO%_oOV|d+q9>O-nabsDfxoaL zv#ivtF2Q@CX01P&fIj3G#~QkJ_V&^r9mEKFWFb1hN_QeJX}|H zU7)+VE?$v$MV|5CAE7@&q{)%XU^(XuSeyJAPK%!wp9IeQws-D$(AU%rM#n}6_5QPC zXUC3#Wf2H33onGh@C0)sikO$IHfa27OsNKN4_Mz&=k__h4i0kG&_pm6G^SUh_rCV} z)Z1+>(tGwkFn<;6jjQOBn*-)f=33S$D}u3+F;M}W0LCiy!FWi$`sduw!MSmjm|b-t z=%G0tjFJ3*p1xAofa#od;?FSVGX6TN^sL}()vUaS%)@VB&bM)zy(`O^5ohdm6TFyx zF}pFfG1b1LeaSL#ezrd97O57g$6-6O;_@)EY=^n@PpyX)^dp-es-M3KuCJ}}eVCW~ zOIg=2cQeO12VaTn_NQbk7uT_Uy z1>Te1^RD|1@n`D;vv&D^Je>)g&gJ*N&CIjTj4Wv(*-~lIN=ij3p+zaXLMS4%QA(Dm zw5JlHED32*v`CgLC8a`($WEwapJyNb*Y)}J{Xf_16*4oP<@34kbKd8D&b^gW8Sa3m z&>LP&zM5^ZjQSY>L8)`jQA<^^YuwT-on{T=-~x)rW~C6Ogs zOCpT62+p&g$vM2g!`EQVzfP!5Q0sTk(Klf3r3Q6g!FjgN7QD^;66D4p=d1VMc?0TB z=1R|kU;75Qjx>OF;QRsqPGPV%oCNN-ZD2hbwR(~9lyQ`Mn>ExJd;ys>)@WIKB%@)n|TQjfib;aVXrYgzcF~0 zbDh*J{2DbywPABP^`>F)6g~6aJ8HDMIsc2NpXrwDmV74tOu9a2(|TX4e;Kb>kN5+o zgr|hf*Vb`f@w=e!PVYbyxEM}?FQZ=u^Pk2<$8gf+zUY|9m`K@Z+32T{PXlkI*F;-- zg2so&2f2Dvrl*-pugPD7L+u?-=eQu~alDTHAL}T7c0WQxs0V}a*yz_H3=QU0eZ`q- z=B&mW`lpM*Si~Gw&z3QhF@>+^JTUe+KqO*aNgc|bo&Hb*;-DYZSY;8YZCno46O5}| z=S~0@fL}l@$QZ_WqcU^^f3-jHHO@#J8yOpE2QxV%W+i=8#)P#%znHz`6T#ZbGx-13 zQS+|~-e2zPt`Y7bYP-H3ual8r4CeKrH?0eEiu9IvEvOOd`#;LV^{Fc};abAK=!f>i z8Cz^)F0*|!WAQgl1D|IH@N4zKy#)nj3d;C*=7+_2!rd#^z)$$oH_}UIZQzN_6Pf<0 z{;A!`-9aDRZHe0w=Yg}FC%_E&0ltARp>GdJHg#u#0V)Bdy3V1CsQ>_2mlSI;{KubO$L&ubj$ z70HxlO08M!1n04%ifH@_eyMo?8p?Ry@6*z?Xm@P+`QIZvl@X~cO}kHQSUac zuy&{i>r>E+X$eb6J8U{ZaY?RtY8PY-ly_Xd5!ZM2Q^CbC}Xf6 zp+mGoaQ3C=CD@D7iJ9K&VY}kH;x87yNQds^!up^`_zrq?J)>Y`Y-G%T>lqjbzoIu? z4vpcJ@GHR_$HzjCg<8Xkf)zo{*6YLf@Ko5Aw=HzKcwm-pIn)kdx_opxc)S9eAyM|Z~^>GL6rk}+1KwaqwSf?=d zajm!%Du6MQeh+K1FLD;v8T1j{2x_j-~y_Q^r;SFZ=JTRlduJ?7Qj!P@yN;J()wDuP;p_pe{CX5xKpZr%c3 z0PEAO!5qc-VLf`Qy2TLiez&%@5x=zB=|lL3`p}QFvtVaI5Be0Jg2VWNQuOb+&RSo! zJ~0(?um{v*Zi7rX6Mi=GY-D|SeYkd{cI40SpW(fbhFLHO=7;8ox`w-kZwcKJ_`;vZ zf21$}C|t~$@~)r8ysg1pVq=+&WsG;N4I4*!Jz6{d5sXW{b}Mrpnfkf;a1U5aFRl5o zIgdG*uk%u{F5vrNY_R}(gI}Z8tS?A!Qgv{)p7k{~cP?47-A+N@&##&c&G{tPsOv*;POZnuv9mwsSPP7Tu-{7&%NF+Q`-sAhBz z7;hPS3EL-P^PobaLgI38eq3en?71{p!@DRp@mS9~ z6`gw+ya2aBd$j>s*?yq_ujho8iN6}+y&fXqg;N1C_ zza1uMgyYx!^3%=K0Px=c^hQF9!;q|Al#F=5%(bcBBzSPyN9h=L|0r$oX zGzG6!>o|IK)i-~}Us-{<;>M5G0-p!hl^W3+LCoZg-9d$e3Lh$ZsOW;?3yM#Kr7#}$ z744&Y_h8XrXb4*iw-$DT1@Q&JtR{0k>v`*=>!Uj&JA$>UI8q$x748-Of*Fn7U_Z07 zMu4BOJt|%+)*r40uPNV~YT){ z{gd1$O0+?&G(9&x_dcA?4CnduWq${?ILqL7&TTRt$mB9iKUp5s%UUp3&9B#&?9ciM zDse8{0s4Rad1_DAAI5S9!Dpa1%-UT~&^!4kybe#p51@zXUwRjB$HV>z7#F!ly3QHj zZ3gp9Jz4(#R_fvE_9uez!{y|d#t`OV=IDAY-DmWj>r>O8&@b07mrLbR_Nsm5%t=_z z89BEzcVsH)<^3EV*A?i!zkzw4J`%4BJ?3f*dRTnF^$B?me)b<{GxNYbPya(*YLcs% z6)-P7FFh+YE0yH21sDU2D{^<@{N(w`IC$Q|BQO_E=FHGy=BreO<6%9dz!{d4K|fee zCP?TZcTZRh`Y>FNE@pm_dWL)TW@fp3iFd0hj0X3s_F#PR26!)DhL_!(s4I96UxHuz zb+Cr0j&G?2G^rLa3c(-55hAQ&niBvSd);#%;$xl7kZA+zp;N~ zePMcZdi0OTACX^RB2e-{nJtLa2-gVfudD(mf%=7>slNCM)TUz0gwofDq!`3{dbZ8` z^p~9n?mzZM)&S$8)4@8OYntnbx}ST;b@b?%d(}o?_PrQJ9oBWj_(=Uo{m{MpTUbpm zrtz}z*CpV3qtiFtl{)xGrXV7`hoEM-Tf|}8q(Im!})#26Q&+&B6rY9Kr zBZwJ3Bc4z@QEPh|sxy4Dd1~Vm-lCH2k&#^uobWa)cefm>QnbpFLbZB9%5V-18aA(=-8s*vsX7X zmsQUe`z1HJte<`!~YML94={@XqnhkvZrKlVldOne@}Ezc2E8R_FOMbElrI~k4*cx znmX}J@X8P}z{}thaP9SZ=+#o6e-b7@UvS+#kv?W~obL4RS~n}nD+%HS zJpss@`9DG}{EZ`-Rk0J)wcElJmno4cWjs0>)Ks;2g*c<%JZS&IH#i z^EY!u_tuNRx|*^65V#V8AQ$g|I=S_o9n6$gFB*hqx|9BcZS>l1%52Is$Tq+=Q6)PU zx|DVadYx`QdUN16RO>gt8iO}~J)FQ?fHT0j+5FWyg)yPEJmV;}OXD~-uDd|Lvaypf z)YtG9=N!0ZUxl~eB5>X7OyBT&xD9?mpLz<~fwexr?>8tWN7e)GpIr~lO~QHMJiP>J z0%}uUJHw#`tN_EP>+-k1xEf=(eJIh4l*87q2f~QgKPena9sOzIw˘y3Q=v!s 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 I|2hKy1@EjJX8-^I literal 0 HcmV?d00001 diff --git a/essential/sound/003-buzz.wav b/essential/sound/003-buzz.wav new file mode 100644 index 0000000000000000000000000000000000000000..428916fd7ce56135d39f57761e01acefdf0040eb GIT binary patch literal 1311208 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�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 z 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

  • oe?*0h7 zC)>i6@D=<4pF=aS-lFED4n7lpfzxwO5Bx29@I5!KW$x>v%)7b}ZUTEgRzf;E9n2%~ z?65wk7X1^P#tz^SfW#8$TAnp(7tg>5@JxIV6dLk#@^g&8UV*c6&dO1PwH7rGz6Sr^ zG4R)|;1|#<=xdn|C&9U}m!8xeU{A6$aP$}Gr+5>3fj$FcV}Jf4{UUl&KLxKJpWXAo zAC1A)%e{WqfclZOVB=bL9QFXUFK!>~Qt+Al zaLL2L4jS(RHH;ZxAE$n5^NNQ-&B6NXNz72Wi)je$v)gBX$$qho%+0dC?_A-Qv6eCO zH0PSU0Bhi7XabkR=J@7dF7jk%C3gVlSbByz=lGfEGttA5!+~GGnCsr~y@5BjB~zZ~ z)4zBo{aV&T)S1){|6%W!wO4h$6J<`6ajt~-k>}JsVBVsx@+zo{T@S6`uhPGQ8O2@k z2I}>?g1vicclx({9rO;I$6g-e3Ts$uN`sn)lO_`WIXW^}za@p5>3hcy&7H zU9$FOeAEKW$^B97X+9XcOaZ@7Ut8<%d%*L~@B2Qmer+!beC0CYsW{=H`&9qFnOdn4k zPd)_p`8oq-QsJb+@sNRk;q1iOi3?#{;kLkE>G`xgxjfhx_+s+KVDHIj<_c6zR}J=; zzrbFm%JkdqfIpx+ecIOMjxfhXuZyp<2bnb_4=Z0^>kvLmPD-DYe*M4MybaieUZto? zQEPl-Q|WEiRM@r^b8FIYwS@o)4=*-REJ@!}1Y$<`_$LfyY2?)V|kF zXb?T%O=u8m5Zc3Br`Gh~9?v}<#7*Diev=ysMM4!|QSPGLrEn+Q41TT}&|+q9tb}kV z95SZbN|#&T+`df1&d;5gGcji=Sm#s2?+5n6jsefE8DK8y`Q(RrwzUhjTAwiq<`7=M z{So_iw`cn2w*&U-DqtC^ki%)_;*OR}bg{uY-MC<`{hW!8`)B7qyMG&;YD!UP-@xO~?mpUdEH=uoLOE zGGD67JRfx->zaP=#x|ZQo?%(=4y=Xd@ELpSnz8%W&pR6)f_88hoCI6(dg`MxXS<1c zD-GCvZ7qCj;nuH#kk>C(EFyAa0zg{2Q_l@mFw77uis=kSkqJ&ssQ?TjE7zZXJ~po8v8ee5E!5M zd&Uw^fSR5fhu5{wJGP=|=Zn)!*j-t2fX5w^wnm;(A5(ir&w>AMDoa zobH^~pHwzgHnlFfF1Zt|*PR0YLJou2*1<%08H&GAB-`v#Un$D)o!KQrsXGkOvG zD*I9|=^XAH9u9Nh5SVuy$vqNi(Du=L2KZ~NzoFL560-@p9s7Da!zwrlmcUi8KYM>r zyT6M$bk^z2nT(y(q<@EX&<4s=rF#*U!KGjfbsl&wd5(0a_w`hE0PO~!bGN|>%xLCz z&x3_2pTF&(3RCMmmy%EdP2msFM|mLUK=ALFqDxNUnRd9yb5|;hX5^<+W+&_j%U>JI~8ESv|{t@NH52dTB)44=RO z@Xvis)vhncXYvGdn`hCB+$+*6vWJvQTyz6PJbZ*WSPQ|RbDIhZ5n!@%=RuYh@#EQTk+&$|jd^KOR0U?0~OmzvIUg;4wAec3PxctHFWLT*fysf%&56x)_1>0f1NXoPcp1Jf{JJm==ELf% z-@*#;yqd&p-pTBGLORauWUuAC%)HF`Md#C<*SF{$oM;`HO<-P5Yg!O{s-3EZK7r@h zdqqD}4LlNF8$PqujYk6|+CXPf(|;b!Va_UZR+*dWz56=zb!H7UT60vj0H4q14;7h} z=l!`IyjP8>THtlGAAcjvf)%hGjQPjHAuzUj5{#RE1akvprR6XV{s!YE<1U}`YFu(0 zI)K;N8g_+vR;6JM9EK6_4;VxJ1^)aGYIyfjbM(ypkQof$fI3sPoN7El?hd>O=99)h zGePgclQ0R4Z=MIe&fJP@-#oB0?46lHhL-RxpltG4c_KGqCAqaV?D&e?k&nrc=pL0`U^cZn)52T`Eew@omxBMtE74b?6Jir$uYol;cPl*$%fY#o`YGKhG(9>!sy5XP zJa?XCukZPw=l*oKm>oXGr+VIuPpxkprzYa-V?D&&;#n}Cu#WB5c{Av5XjR&Z&Y-J; z_+2gfZqTQw=jc^9AO2>xkNyn(ly8E0$9G^4&h6lJel1w<`JLX|B5*EKRpa3tRmEb#^6j#&%H;X3ycHLYhP#Y^ACW>eW3SP*HPn} zOn>?>>^~k;G^R*j%<1qZeO*^DUBFqERp7_M9}CCA+=96UkHQzQ7WP2-!t#Yf!LzAu zqHf|N*aSBxZ%$@W06Pl`;hM}f!Th};%pfiR`*`$`H7#ix^yDDH2fm6As9ER>RU0*D z?Fq&!UW?nH349a%CTdNjJs4EYrUT?$Sj9Y21Hr@0+cD?52#nW9p(&WddB4BL+}qE< zXN~o`AHcltPUr~Vfco+sa5{KitCtyH7*BoZLe%J%kK>f`)nZ;H6#DP31^=C2>9;pOwqB-w z@*}%V)KTqI*-8JsTEr>z;~M9vVf+At!2DzcJWC&NHJAbm;AFU@=#rv`=uq05-kUa_ ze!cMZLWe>>0(wzerCOy1v47d;qF(sNnaQ2W$>gYu7ln#K71)im94?Js8f^xT!+Eju zVi&>o=yp!0>Crq;$N2%TWhXchIuYszn{zh@yD>f?Kh*cXguc^vvfeRm&9d%hU$xJx zi@|5UaiRIB-|q}~7WA2_@!Sq=!CJs3yo&=t{bm$wqnF`gI0qU*OVDGgU&;HcGaSeq z$e4$Cb~OWQ;CchLz<$^Z%i$Z)o22%kmZwf`pX*nkrf1IgAXsO!SJdybL%2iuw$N?C zjD=BnBd&x!^jK|T*MuL#=`^Se=3;6Tqbp5BBH z!1w+RXaVMf)8TipUS|#0d|e&JdWf%={Wr#I#)`&;UYkCrjJfWFZlHJZQ0XDmfPYG_ zVpdGk|N0D&Z%+(nhH*1Ix|Q(gEln*=otr#2d93hQ;co@M75u=y?;cPewjbMm?0wh? z4;_E#_+HopWeds{ybgMox)gRPJOuU!AB1O;&jfuc$bRV+>}Z||uQ9jNJg+x?Gkq@u ziw72a4&Mn=!0#&zY7_QcsIM8%HOE(?hGs0K-eO*|7lxAKPJ|~w4cKS52fH;Fe@~Bq zzxM^ciZkI3(5rYo`##IDV`?t+%=FBh#s2o{^cEX4UWAAFGf*%16Rc4sK%bR=|0sAi z8E-rX&Mh(iuy@|t^K9_fY8C^S%&X37exM$tr=TequbFH4Yd=p9sa|A#-Dfk)+Zu=U zjYiY}yspgCJoo&wsbFuN=bo>H_t`t_=rOT59~LqD+t}E%&p5vosCi!kS+M%V>cG2V z3~s%1CVgXGt9o2~y^Z5NtGrHrqIXOGi@tIDz9xV^@m|m$yibjlDupWr`(^gyW+PhX?=q)Vtvs51PJ`$KL?P6=v2 zyPTR}ZL}`vpHVB(bMtPQcZ0cZ*Ra#gS*3akJ>O%X7TSlMRMyIk`K-VF3qFY6D1Ia8 zrQ40q{Ta9)iuf>|$_8U3y~YVx3D)CgfL^5<;LOq9;2C5N@iSDS|5@MtC1CtC9P~)( zvuO;JV2i`>GyT2lPo9hZeiyhG{5N-kxry=BF!0a(JkLG7=ne3dd8VF9uaj|}=fDAG zpxB$dE43?S4eTz^k9bY;n&i>c(bUE1i-Vpi=d&c?OXjA04+oe@v9M%e@cOi-cjZa& z8FxR-gI*_k1)eCZ&q0h@zD)T*GwsWs;DcojmhpY~8m#&F<1SE(TF9K|W%T6f-!h(T zoN1itknWHkL9KFCVpXCCG=$#@e=FPv`o-!o>H8YcFQERm1GXf$B)7qa)CR}w24~TT z^oXEu?p<8^M?hb~8O3J=eL=;1d{Od6Neg;Oz3w9?B0>DGu3^vCOt5BRt_=z;TiMUznWJv1rq={6 z24k-p%m%kMU6fT6Q&KrgRn^KH-_PKUF>^XXG) zji*^%pg#EXy-aejW~!Hp&^6GTtTTNNY9+73eJ~OH{gp5umckCu-*Oumd+lL{#EQ}t zrRI0WMmIrou!d*dPM^>y{P8X6x7HV#6VAaI-ZZQ(_!2WD55n7Y=RC`1h(~iDrK0y` z?rWjfLY2dn!>_}1cn`KiJ~V+Fp%xfZpN7w}BHRzJF?Zl8XbV&5Tlp9s0=2ynpr^w8 z_%!hSSp<3TR++Z~|JbE?#q96$8a2*62h@*@v5a|*Y1Ll*(Ky!{(;zU*T%cYib?A*w(oCEoRLb*N%X#P@6t%pB={6uhQqQhs@VLOrP3I zU|mViqkeyNkzd#u>`vKM;8KlOnRhscy)~D^N9`HXRi+Yde&on##>if`5)#E z2jG5q9qNMl*a-0FPl3-yV*&koUQ@>Y6Y*r~O;KAK0+pD}L3>W%88fC(!)pmkUrnW#B9Q5J(?9|6L2=0I`%x^G`Fn>1BvM#7@=X3W}@LoED z`KIQM*4eBtcwcRYuFMFuPCpvT6ZE_EBv+p*bWiNZH!FQ9Iu?sYqS4hP|7 z@SN0>pjW}~)BE*Pm;qi_YVOz#bFPLbz}Mvf`{(s0STA^ve(q<%vvnP)!5CXw$1evJ zKs|3V+{|pfXd}6m#Yt*;E%F@lzkQch95zb=IXrF zc?+OC{2BW*_7504jf(z1izADJ{acOMzEd4OXU6Wq+=GFB*d(_}ZXf(j8<-hrOlzI< zeY{PSB!hdMtY|1$19*eJPp2| zx6(tP2mE2s1N9@QEtub)&92%y)B@+T+jd}jVEW3;mBIYAsYO$ZMlg5Ye772Y+%@1C z>N%+gxHCJmK7!?7++pmxAAEj)M(wvNz6^a?JBxM(Gtke=oR_iZ?a$Posl~~~$pNVW zsmGI#Cr^iFsb;CU$+^j4|8X#RFd0t$KeJM^QXj(vcJa<+%fj77cL%de@?Y*)-V6I`#aVh;3gR=(*K5KIwJxoR5{ahWc1-0Ts;8{|a**@oh zb@|nBI=bgG;Q2ofnueMNd!MZDb$~OOZ|k28X1?~eylr{q`Dj(HRk^#$-c@#G{>uEz zpkZFaJZtOj{&t7=W$bZR$JofOsdjLE`1){vX1?A9H-etN8{txT6&B|#4zzFUpzFc& zMiET!N^AI;S=z=~#(Vu?7JLlWT8*)ipjYdetY-q9-aPL%s0Cg>zrzIPJhz2`@ErJl zs-Jj<8y^`PbpfAEg<#(2YwLS&E!=wVkpHMjO=(G)B|Mc51-%AECyIjSo6o)_^e6JfJi0lyId*USUN$-P(efDo6IdUa|7G5ndCok-L{1ZUDhHXnZrYBJVe zobC7cf4=;a@Z(T#ayv$GD2B37{9;avEDx#fR=*KZfF{^E7)GvFuCgJS*dJuqi8 z4yX>+8-IjT;WB1Cq)XBzw-nz}Z10Y>-i4`!DQj%QVNPOB;zn3jxU8@RRDuRz;p^ta z&B1Qty@|bva>;UR8hbw3J=Hxm9`?h+^ul1)&5F#5%y9PJs4qPSYJ)w2%PHsqQoB&E zSI6}_eh2!N=^OYb%v-!qjqm)LUjw}oYT1{;L9kY3Ez6j}TuUv%x?3B3-k+dpPvG^LkqYIt^wwWkO%q2eu z|9{UX&pUktUU1ez+ru*ONAK?>7}uL4diH$@?ZNxj+IbQ+;WBi6ukmZZXRzndNbvd7 zAJjm7uYE1lTdm)C9~<-E!;Z~P_{zGlCv;zAU*u@nqh)(m?pgT-m;^6Zdb!f`a2@Qg zu)o6Na8db-f*l6S%Puc_F>KA>nr{MTUtJ}zKeqyW9QioXKioh3Z|L99a@di(BezAU zMQ94WkLR+3VKVb_yvB}|ITrMgtB;@cA73*U#{0yc)F_xknXjs;cz&2iS@Z7+=C^9Y zYNz@iJHor{w0Rz`Wv5#s$OH3)Gr*Wio!RGhYZw6&VHy~RCBXQ>*y&l&U$B>Xkj7W5 z!Sl_Z`}^kDO~5nBnBMEr_|E5qdhHN6fF7-e>+hSJc$OI>slOUyy#p68yUAzGS?nS3 zEc5*JtgFt8@~j=JL#JP%m?ig4(nBzW=^4YXOumEnoUIb3?6_7?aIQ%?oByew6$usb`>GvR<-X zqFtgRWS|jDgm^NJBYYAaDBF{t!HcOEnI88?YH)gRdL(m-ABOkfo&RRXQ9dmiPmkgQ z)O7ymLsL`rn$;)n*E5G1_hX?Vb14UaXVV5yBU7Mk0(XKs!4`<;#)Ejp+^jL|rFO5s z@d5DK^T$J=e)J01KXoU(3pJn}`1|w0I4r?D|LyE6sm-pFp0S=WcXqI{v+S0gA~IisT{yAj@tyhkOeLZoK6X828}nyi2qp*lQGmFQT`u^{gT7y;>^Hd_{P_wn7PaP8 z$UZuA{@=+_eAACW3-*23*K{tt32%U}z5c<&>_Ao@*-*M6ct+of56>8B2Gj>*AD{hu zLH(mXcz@Q0;b7lm9q0(&uTd}`vA@MSP7J@X=aRXM-f-)adbJ*B?@gU>o$xJ@Tj+fI zHBu#3CAJ?r$2-R#hB@GF-kI^4fd{;1ye8XOs>BnqMC_FKDRDgp8mgV~)C)h*P0%$A zp{}9*?9K66;%l!)Hi`a@o9Hn%LA5?^&R&OpWzQ1pAb!p3=oziTY*p_^HL(Qz0RDaN zeKjV(*G}*!eoE__Gr;(0EqH$Eh4~b|0DqhXYQ*{yJeT``I-IqZGr`y14|_`N|2OY4 zkMxZ2{`WQa_b5RIv8c6I-@kdFwq@*UzVrvcex5+%sXGaFA;B|i*FO=eBBzRw$B5f~e82J`qEU=*lhpAVnH8Q^_%D0(RRQtYLmCgJ?Pb6^vFLyN+Tf<5g^ zLQ6vGgSSF&n1g?2Fsy^W;0(Bl-mD#B%X~!5L9E*njzL!M8!LkF~jeiGB%t=gPw(q~Cg7J2o-iX!ou^Ky>M?MYek9sGJoy__C(LNacM`}r)llmysEYAdcP0B&) zMC!yy`Zc{zE&=Os<~imTdRRQ?jG_FP2vymm@+ltDMtGXO4}Bl16sZ*K_Gm3{GAndRy3YkS7BX+ zedYI+f4$u6#BcX0(jm&gm?QUr~wbcdibvRyI@9@_ts)) zMIWs`q-rJA*n-a4n!Eaan;V}- zZ?m!QUT91e(>z}9xbLlT%{gVx3H0s1@XOU>PW1xz%De*V32Nq#u$yW&m;*Hh{j1iv zLtwtAp6M(CpHb&Ci+nou!)nQD$!5oz9ou(g-;t#-7N)~JNAEd066V0nV>6GnJl^v7 z4Fxw8oK|?6Yn$1U**fqtB@@X+zhpnQBTNr`TMg3<)8D~HW`4f~ZJ1H-domB+EqOQS z-!aGW`Ee?K)E?B6r-NU=_l+7dM`YIhIB`FOHu$%P!woPMCV_cX6ST~MV2$|(_#DQ9 zF_ZC+d78g>J~MV!!)Q1e?9Vkv{*rlZ{+V&T@%?eIR(A?i1?xoCb&Rvj>6$Q)Yy)0g zy_VmB9(Cg}XQJ$aiqJIDG}0iyLH_k+uP@snze9eHydHTQ;v3=vV*`2mR|)3DZ3=G+ zH>U@FRCrXlZK!R?uhH}HJg{cuzhe&C3kGHn40Z$C=X)WH1@$O>l-4ZEgJ*@cw$Y#- zt)A$gz0BMJYi~7}NAcHxb9g_eAIs;b&(j~kv%*-vC+HVYBk?Tk4tkXJ601jez4%^L z1E1?FsT--w&H`S};5ltvZ$M@Y@B(xJ-{(b8mwr5JQ3se6sBY{te-=HG)-^A{H@}ho zxuxNy;c@KyzCL<=bQhc)KRM{-RVVKs?;pPsj=_!K4vC)ep7CC>Ua_k|O{8(Oar8js z08=rS_^1dp@XMH|e{tyIVBU?-r7`6A=KN=Z`Mh(x|%ua%?%;(l? zuoLts6@W3C{>ZmsIv$~>;QTWC4;5p}OX5ZVX^!=!1t7r8F{bp)Z#--{7=YsFa zci`EnM`I^DF7y-iVE5i>Q@X z18nzY^p^PdYT`LD9=B$25Y#}e-T6HHg?h5rrSGxzOrL#fn(8VGqYI;?IPvDO=CK9Q z1<^ui0eaG|fac-m;pw62p=3@n=W9F!AJLEJ8GQr$Qsc~6f191hr>0I#-IKg0`BLJg z1nEGb`&wQqd@0!5)UB{vFgv_YVV}Y)Um@J3VEp)_K^<35ku_Zdcs&tS zv#SOkX*K36>F?c4KSwcKO`WPXj0ANleRr?JsqiGsgu7ra*w13TrJk+kw1`;+#y!@; z#t9{)bGm+i&H6R?+WdOjLJRQu{2BZM#(vAe zbEq>|$4gN!JDWLqevcvQvc5i7r>|z~^ylfZ^f>l|VeA(w1oM!)=&v#$_qz0&RLjxl zX77W#T@k3Ah#HaiVk6j3-P0J!y7CnIE!B!Y1~u>*@D-?utpn@Cel1?B#`|hY<{;K- z)KPu*8t>X4p%1(hTn!EA*);AmhFS>b5mUgg%X83N(LCO>&zg;K{i*Z`4G9kkUl6?@ z+BMcSc2WEyI(a9@Kgs(f?+xa!vywh>o*Ti0r zz8>uk7s1x>)^Mk2r|9Cci_50UrOMq`_P(;K@>k`*n)hm6CYFgg!}?e9$jRZ!;R&G$ zK@BB{r@5XMWG~2m0-xM(Wqu3lN)It}&v`}a#y5gFoSJn@(2wdlV*L9N=uv$D)QvoI zj)Ae(GoWAb^Z#}xO)H*OtdGfl!X4}si2paQps={Gco4qUW?-M!21vmO=mW3)hZ@$E zP!pVYFdU4_P65x_i%KslT|#f(napccmsbPb#f}N%ueRt@-h=Ax=Ail?X}<_|Q4agh zpKGpZ?r5y!`{gsr8mzIExuVyFe(4Xv^G(zayk^$JQMiJhW%EI`i0rKFEbF}H0K-5X z(`%3vyNvqhbWn?MhC+FEc}&kt5B98|n>si3HaiT=<31?(pkVgV*+(ZIoP2O3v_I7T z&{Al6r0J1`aFmZ7$95d+fj@H}JH(xtGAc1D@mTV)Wb;(>R5%@GQt9&aJ(+uWx(v;% zD_U3deew6jJ?W#G%k)Lhd7s(lab@`M4EFq0k8Q-P-Fsjab34sVUWDH88l=JVV;0N< ztzixrD@7oYn+R%so=r7EHA2&w!>cC#AsF8v zzlY41t^d6aJzzGdxBGYO@iR|Uuc`v(l*T~jiuwcYrq{%CaW^<)e{KHSd`)zBLY;V> zc>h@cSnFu(=--jQBQL?3kR8qr8>fwd@i-hF1Y^l^P=~#E)}`Kt+rcy1JZufK1Uf(dmh!}rH`>YM5d>eRl!Q$Zirx&Q4DH#f8Iq8mH_ z)8S4~H&?^pNYm6`c96QIbP-zW`C=tT01poY7FX*7e_CSHqL9D_hanGSdU1L$feZ4?Xmb1 zubtPG58MUp*Lx@ZPP#HoOHNB3O&m>BPgYOr_jYf}*u>bt*EF3y12n?rS$wDiA7O9kb#&I*bFv-O(LBRWg16yoxC%BxcPIxR!4gn^Q^&duthps&9+*Sb zVAsjR>^?BwnF#7K*5vkq{viLJG0t)tat+%ygj-|CXJ(9iQeen0+ z0%Jk-BWq%J!)2hp=KHB8ZhwohqFRw&HZ`5vV4UrH{~*0zYS;Sm)G%tXdvsZHS+ZZM zU+OhDoIaeM!d{`{aBlIr#U0>DxSLnpSnFiwg{4c3V`WcLmteMr1)Q=Rw z_tEd8&Ew7E#y>xSv*OOnKaWZ3bMk9Iue@G)v*WYlA454Xmvb-OqY(HGBAX-6!!&lM zEMrd9&9F9iZEg`%g_rS#oetJCH-dVX{YrZ6eO4O>8K)b!duFNul#7;&`t_-Y{mZ;m z^ZbI`g4`TFhGq}VPM1js_iICZnEEO-Ja~TT6KD_mj`S#*uWc{hUW_HZIZq8jz!k@{9ACB+$M1IWXTbXEaZ|u;jv$ zW9+k73Vx_lJ;8n|{os4xI_9PL-h2M3U-{fIo-@8PezGoM+@}8Z3bVGVQ@{9yezyM+ zDUAfZP*a(o_9nazda8_@)a^%udB1Vwc<`D~!&lD=;ttL-|J+!_YsQPvd{H6iO*+?( zuwSo;V%hKM-_!L{^^`VKy%W6?4GSBxap04}sRdIDTEaQtK3@A$>Z_gJ7Jb|Myccj#1aS7Rtc_Fc$d;)Qlbh^{c(q_jW=*xDV7x^%-0Y#$-2xH9TXb ztKda2m-Ec)pVL3^H*RBJfoI_qFo!f}vk zf=9$yw_dnjcvyTG(|E_ln}I#_kHGZE^vE6IJHj7_J`VhZGjeC-TCY69F5=(ur2Yge z!E<{%Jb>S9tHHd(T1N$TIn8Hhqxq>Zh&~r*FFemYhbqk8RwEh%mqah& zwD~D|RqU$RUC;@vy*Yok8d!gGUx9JeQ%u;c2`j@Z!)3v`=<9G6SeNy^o}4o|M~|G( z;w#~NeD?a1)eF9$u6;UMo$*l{u;<>_KyA!Ei+-TiV{WF_{UVr?&1UYT_qly3-!k*C zesTR^Hm)(0XU7UKH+bj2y0q8&U9gJ1oEzwss8d*{@U`Qw9j{wZx8Tt6L&v8UPW9Ff z=9-L4j!WJIWz%KTl{1wy#p&Yo?#yn-5oMYbH3@oNLI|U;z&Pj&=aig7x8sjNPpUtz zf$zZjqA{)YB|QO8ls*ycihBy}qz&{2b2#IzmruMLJa2a6ff_}<+}dpp=qE2OEiSFh zPAKE6YrtpH3(%-cqo8)@xvVCjwrQ=y>r3C-251Jx@7CS@9Pep0=4W6F7$<#5FW^03 z+*JoX+oqGMPo8!GV{{&(*LCXN&TAmHJCBr9B>Z=V^gnD(xj4F@Idhc z#fO;j?AiSw^Dc5=DzhmcgyZSsY}o!gO}Jdt6y9g9iVv z2U!4BlU0*@U>7`+dL*?H2E#ID$32&MF4#@2PPiP5rAHT!4t%uV6n_)+9NNpPZs<8> zd|-}YADGYH-7pJ}j_JL!#(kP z;;(_TF3sde?vdz{zUb*TJTI# zXMCMLf(JnV*Lr4ss@>iX*TDk%UiDR|`Fc-#e?CdQ-}us8R$a!NRGmm~_e;!`+(OOa zSnjdhfuVt+`e04t3ufH>MgM}=g7K~%FzKIcSjo!bm27Eg6U0aF&`;M3 z=D>S!EAwosz)^bbeQv0^Ukk=weqY|3|Lf)J%RZLnpzl16MsoCmYObN@1YV#d^JlE(e^3g~GZ3Z3BxF#c4JGtNJaxl`j( z<5Kp*jZTbCcrLwB@J7LR$Gq|RZ7fW0U0GwpUQd-x2H zt^2E4k7j1Z7w`*o0(Eoi{~mPe+iKqaz8a6uUw`ipW|s^DbA#_;2>hY{j z?6ZjehcS39u#S8?s0lp+Tk!_!CG^*Cm%JV9F&{?%h1ce%u$A4^v)~i>7<`sB0I#ny z`0cE<=s)y+nFNn8kC*Va%%53*W*ufu%s-)jLe}ADa62;17C!`2pxvM!0*@h*!srBP#f;RGxH|iFzeXr0zSt*kMzQN zHtBz`pTqk`|AujfwXmaTWuxFO@IFnltHJN%B0NyWP{uKDfS$ntFcmHXV;VK2kHDIr zzxHgl4%8mZ!!{OeEV{4wzM%hhDNd5l;B%(y)(6d06$>gB`~gd$Q(>oI-Ylz-l66vb zQYXPH=~t9{(wAl~4d(8TVb+1q9%Ht%iq9hQm`Qf>UGe$U<<0es|2$vz;@zykJkEh& z&F)L^MkjpZF56wI9~g%b-V7St-NRd^}PFPL9oZBC!KJ0k4wJqJ3bI;MIcnz$He*yZH^?s?Vy#d}+)|YlLcgGlJ0;mJ&kFUrK zNcHlX&<^Ygwy(`I!gE7S$ZONS|3Be+=miEDx5CHJ44#5na15-?89Tke41xQ=ny7k~ zc~g}A2=!qA{?JXJ&qyzXahG#c%*)iL_u>uuUp!|%XHS6V%=OH3Q*+XHeIa<(_?+DZ z#!TKrW1&AdQ^1}HXf-3BORvD!U=5`Y`tsrO;q8&_kyE0lMBN$g>`MIs8dd%Q zeFOR}?OE9cYh!C;UqKfzX8JVxX;53cof!q^gwF||3MWHf<`oWtJm|x$xX#QVw02_L zq$k7oN6kt7&;0UR`c%BfE&w&(x?mmBGfH2(x{8{<9!Wjn#tnX7>)|p`zfqt07>qfL zCDeQ7f@d44S+RafV>llSr?BS*>tOB?=I~mt{Tcd!dhn;PmYzfFT-NQaW%{h}9Qm5v zl*VwzCDs;(Q;U0q*-h8LCU_qHfL3^@%%!hpHoGyZXX!o&m4t#k-5e+zdcgqj^CyFG zPeuCk%=^@Ot$ln8-JmR}1)B@L2R)z;828xU*A8BS&q2Mh1Wn1@P>s^-@h(ua)az+| z&p5Ioc)bPtb?B9AlWvnXKC&m*nF5pGV>lnmfpgQ_7Pc*{0w))oT;Q&O{ct~2N>oDq z9-DB$<0C*jQ?g5{OX{ZdO+jqbnAru(!5sM(_PlR^#>{M}%RZ+e;P>y>zXq%a+4E=3 z$TRmo_!Z1YTfr4zj(Zk6Nxc`ULG?^^CT9Mexf)+cLuRyxN<+B$y9RO9G-iRABY8e} zE>>gzn>G3>Fc)URXK5yQ-y7`jT?19wHPjINd-cF` z@l5y*-;J@&p{zrJUTgko-gz-I4nDv)X{_jZ_%}Whb@W%@7Vs=v57X$&tqX5all6>i zgXhT_zI`X&zs6TD!q&*v$VqSpyU#yihgCMzqc7Navp>Cl`Y}CAd`|f9dIr{^U#}jX z=vVLoc@0|2Gv4si|9Y_StwnKH2N2p-v4=4P6qsB=B51 z8=^+6MyvojK>2w2_=m9%W2e9fcsKek6@KgLD zX!lI_%&qV^dpV=U(O^D`XO-WVx#=_X0DA7VhCN_>@iVBQs59vk_xZL2{sm*9E5TUE zbG<(J^Z8&Lew5ik$Djf8{a*lUJ{3XTcpTWDXuPr-yx_dvtwp3tQ>EFU@2gHxouZ-X zp=o_&*Cnq@4onP8IJ4vl4c~`S`yp7FP^jTYIs6j(C0kPM^_Qy!=lwpQ1^$36;W&qu)io3+m6~n`cM?DC}y~f4!;7`zi;<=$-b%;LQufcky=X^ErdQk_rMn4X`Cj33)=<~r} zd!Nn#^(mimrJz3C7>}OumDi)%=yousZwA(Y>21H68Kdfn3zG|z+Y;Ln_BM5c z2htCux2CqHI?)sG6GSu7%($X)!SkvKJzt;Uaraz)FZ5n$1M|D@kKP~ElXph^jQB>l zIq&AYzWIIgZ-m-V51PV+ya{>##{Z2s$ZL={JU%==CpITIXU}8KTuXLD?TqZC`}g-q zS5S9q3v)wrLz~!9sORG+_7_H=CwM(r$GshD!?)}V+W>cg9%r9-JJ|>6MOGD_r6z9; z!MxAhXDZAGYo&L9{)xk&7sFU_BzPtd1@pt@@G%%GWKo+^^EK!7^{5WtGKav|_C@AG zUm5v-^jkd_dMY?=at{9v3mxL-K|gRN3nkVJ@X0l zsTkiI+b_k3py$BrZZ|x}oW>DgysBoaE~A#J=T6 z>e`g&jq^@s;?uYVG6k7}#)XXwuZAq}_nc8U1L`E|BTeb%MJ=kD&Vp{hoX#e*$`%^_S>#x|3OyLqQ$JoT@J5fO^um zFb0g#Z>7(yEFQo|nF;rO=KIV)>}EWv_#`6fba8!py*`ER)U)@28oFnD3XkI;=GNW| zUqi>7j)C|5JUrTUpj%Ei+^NZ&F6=m1^xw`X&%~R+^U->qG5H^$M^itOG1;eJuh2!{ z=S3(&dG_gV_YD0S{sMgmo_pPyOWqak0ewE6Q=hI<;gI zxRHz!R8txS8#PqH{p>4U_azCce@?NM6J}(}D*XR-N0cs8%z;j*A?j|tDFyHWe zIZB_6HE^Gy4?zhZ4^rW332&pdna9{OqJI1os70yAS=ZZEvaRG?u&?B7urB!qbcGLK zGuU@$yuZCO=85X!ufqW_XY}XgO3MXjp68wMsAu4>csz~k27_PU zA~5za=hUnAGW|7vT^F*qQ=fn_SiN+;w7$hXFeo`Fd4KBu)KKD+cqX3t1g6s~ashq@ z^+Mx8zc>95_5_%lJpnzyGsowZuiZ&tuJb&c0iKV(uEtEp-D<(+EH&Xe=nDETj1Ro{ zHZcpx`(OgQ(R@Bz7t*()7j$y*{VnrgH z3NLnhryg~KxP0P!dGT`!LFiRMYW4-6UiP6W*w_d9#Ylmxx-^hC-Z%Y1@U}pW~yvc#b<+k{3@h-3?wkGyc^rdKf zxB}06O?aQli@QR*LI=U;%``X@=CD8Rve0F?Dr5R$D z4c=iN)GzE{^8VWm##ugVUxAOPEpZ8CpPh4dj?cXS3(Z{owaxZ?CbF z=g0xDuUDOGC$j-Ok33tRf!pv|J&EVWpPQqqC+Vj&r@9nh&~fzfonQ?}Jy9Lk*U~;* z^J43@kAZsQ+0Yn9f!ENrFai8~>cEBQjq01CCQt|bcTNSLvHA;qUcLcp2 z&$lP_El`&*zt(rz2YfDj4_S*dNB3Iw``72F-$jjQ6m?CX3;I2lLI-BbZUN7m!Qk0* zTlBW*JkZm_6~1^ZMYr4c3^RpZnO1-gy@uG)^? zWOXhiz|uy{L0Ce6usYbo^d1{m=QBK}ceHnOa%3`2tonhs#9YH1;|%cm*Z|CJKPFDM zrtC9LjniCxEZhag%WB$f*uC^2-tK3>_{g}*|IZISDA&Vnpx*rxyTZ)*{QMulJb4Ao zhG#)vrCO`ks5N!{VCHwm?9NoxSJjL;n}28i&WufuO;2L4fctj!OX^j+4(7owP*bW5 ziwYJMbcWqvjO5I4HSepESFw3~bn;szR@!cb|{n6G0mn9ct<^P=@Znq$3`^HNR)Ft1V* z@(h^{OW`fh$e;&%89P%JfgYy*_>ES9*XeU;KegZvYBjz;USD_NIqA&|R5bu~L^Tuj zy)pEedEa%Xp5Kn1T>JlhFSkR7><-!IKn5P9e%B0);nu;`)cK5oPG{F$9?YSSh6>`O{cSeg#B<6d+)Mg8g<2GuoezNC3>0Pqc8XyFs}2HoSXL;Sl_d@^*7u?x1D*& zE<6wFYn#CMadny1K|XITcP9O~el!8=elOs^FkjSX(hK|^*W#oP3!k07HiyCIv)Z|O#9Vx$w})>JKNWo{Iw&$I@^$#@u+N2E^ch|hx+s(t$%>4H zR?Jx(9~&R55w8(H3XSp_fqUjeo72H;`7mmN>9MqiD7fY-Y{>`}LF@G|_uytRDx zH5tFFBQ*kJo0*`Vq|T$JlqyaI`sN7cmsEs1;50Y`MuHdp9GC@a&iW_x2DAbFGS=$! zUhW4qsa&+^GT{Gd9CZbFMs)^#80RxT&N`aD4CAOj*^y@c?AKL=a1Y#V>Dz)` zBo&G(;5vG`NPof(&QlZiYJrck@QLY(X-(?JN1eg=$e9C!K|jFrFa#`ub%Yz>V<^k+r`B*u`jT|5 zOf9y=HOP#DvzWDQ9ke?0w$<^HP???K`t6M?^(=Tj+|HgnpZnQa*@4HX7CVf*?|Osh z(4Exet&bUpgmc2dtfXG_zRrU0;1bXm>G{x35mc=$jH$~r#yc-!59u&R>rqfe67XF07+``-tAD6Myw=&!V^O?lkg1$QS z;m4V+;s58?Y5mTaNzJ%Nc8@@#@Vxo~)!KaeCD;LKOf{IVTar~0XoALpec^J*z%lS_ zHrFtAy6Hd4qaTI9xX2uQ2AGFClc9We`Rv8aBUfjfLJi#f%k!rjb=SsVJnhe|>6uS? z?z|7iPd!0l^(fo|#yr;T-ljJ95%_ca6~t$W*Q~WQ^Whu79DE`S12vW*a1bA{eOj&H zF=jQY5!>HlZqux^89zIv^sC~pf;zUkiuZ@Qmi0+<+vaTiz9xK4xNEelp?P#MJPYo< z{674BSnbgB_ye%8w4R=mq0E$+42!|tHl9hwxSzsNxG;2K=uLJCcBWr@I(3cC@D?1; zJ|5I!J=g2d?}Pjj3HCwwckPMxd_0-GF4pm%gqmP}=<~BV7{6Xj zKcaEd$J7D!$^Hz!FWX=Z+(b?3A~4oEpLq%9rh13km1!63ob1CS;kE4O{EEJwFQIC* zYIJ#cd6*C_G!ACv&dQy}{8VSeT?y8Y^x>JS8^b4Up91h;&=0EzRjXSJ)&4EEVgMv7!FuO4Of}9JOZkxxp-25Elms@gf3Hs}dsrJEN zXxgorH~B4irac7KZMQ&U_L4I)IrtnuZ!y#d|8HME{Vpxpl~IGewr6F|3g%GVM2~^~ zl%F8UJVKv8=BU4e{*AX`9Vl{oPSt{mU_Y<%q5e+uI&}}98=rwX5tgwapVgb-GsSqx zT+jSN{anrc-v9g)=7OH-YH)XfF_Y(&`I51d|F8AD9r!G|XLZk7MZdWBopJVi?6~~j zwbTi3lktQxQvrC6eF18z{@QwtdEK3G0a%yo4xU@PK+W_x^9J5w9+~&bTg;!$D$Odj zR_Ak6EyeTAoY8Z7M{Gx|cKO=n(=fEc&6S5y5Hzzk| zFf&xux;^(j=ig*!v9XiixA~hNY8!eR%*o8fZUZ%%U_TGmkvf`%sO= z`B3$l%ViICd+_~NC-l7YjGhe*=+$@)Exa~N1>b*t3VTy~Q%jRelh37|OT7WNWp2yN zhh9a!iaN9VygWT=XV6!0-iZ`ggko?X9#HJEdf=LDMfY3b9_9bqZFmU)edC>t}UGb3U!dhFsP8X=X7B`XN#^?J>dod<*72{RzeH{6WqPXYdpKP7aM=sNor^2-R^)AqZ;SVX zd~k1vT1O4|fn7oyLK{Nsp(FTw_L=-7_-`9q-48y`eSXj5R5TZ>1k1CQXRQIf0eiCc z1ZV9(c%wY0^f-CWc>e8!D(p1y8Db62nAf;MJ+UkJV|ijJpdZ?6%4f+d z;8|?U;GbJ(uRco_}+v z-`V^2CcEL9K?&Sgd?Q;>wiMgH-wBNGB4CWCE@tjytTPQpm5vJHL3L$gqf0?AkMX4O z%bWC$c@Nvu@)W4A+3ztOJ_q9;Jw5|qBR#pE(blDXO*?`;&^y_krDkB>^8$Fj>r?W+ zHP12zHHr4?R0H=+5?}uXVE#1)^f=hFmj|n10_ZKWZg?{@D9pF#LN2v8YY_S))r8Ey zt-Y27bu#O3##s8d)U&PzpDQit|NJKWO?ZA}exz-*ZS)rA{5>0fHarg6gxZAq<@U=h z#>0F8sKa{is%6hn|0crZ9eqa|2>xD?8PwHISJbx8dt^NQvb)y>q+%udZteUbbk zSsSiRT$|WjxVdm4oD9i=WP!R;Lpt~)P1Tkhh`ExI6Ob>chD26hN!RQh4c$S zjq=>gxtUQ#ql#W-w_;m#gx^5_nmMiUt@)Mlu&>D`u->8mrZ%kRX5Vseme}4&&g0Hz}nKA!K%rY!e$r=vbvei^VZ56hd(c>zOW zLt@t59tFLX{qy?gRnM=Uetm!N>1 zi}T@jc32umT@H0YT}IZz0T=|NXT@q&#z?=zDyUsjJE&uu`%MRHfSKYb(qq8-fn^!eg7@BuS>okcev-@LlyCNSRAC*U<~JY^iZ3yjU{(5I#UWeF#jeP7pk{?Gq;UR}ZU<~QgL75j?r5;q^&7P03~v1|3qhTGEmY2_9L!*=&5X$k@EUZ7L7?_J z2GqVUrr)y)lmoVp;N#vS740pDrZ9>*xq0}8uYxC`4J_lFMstFjI5S}t=W-w`FY$@-}Pz?kUdc7>#FC&zd={evtj}I7I0WwBFsBIxQuqU_Df48U-8a z9kAGE9O}LHCYT?qQ@Bs6IX#K5P(Pi%mD!vJr*`4qn}LVOMW^A>DM`Um{ksI{)jt91 z73vz+gZzGL>t3@f!E4!lT>Z&9ud7tQOeh1>tD>)aR1mt{&X^Vl4{U|LI?+n_OX0tP{k;vT`efs`2Z?!Sx%ZEp1#OogLhZCbrs z?c6v@oymA-Hs`50>tqJ#4>12SwmTaJ!FF&~^-c7n`C45C&T()JQDgRfV>NX_H9vc6 zESCt#P6qcAW2u_pI^+Fl%xBzWt;9I}4)Ff8w?vPU+QbPkr?Uq) zAF6}B8Gem*UiUO(g@ciUky)`>K|j$xW?%iURuSdQ=Lefp)%?UGQ2*)}oy4t)(=>zxDY zbK`SW5%hHVSj|a(0CN}h;bs5j;*u8!ULHMhv68Xitfap=L(IJCPWlk0zs$6R4k#K>baCq9)H_fvT`qlI28zxr znvt0ioGES3<)>h+#(2{;WD@wCt%O*Ffybdo1f4((2>&UNx`JmUe8oII6YUa|K#~BCu_Zdf-1DShR3%U;6 zcdhNI)iEuTAglkP+|f`TxO9T^#V?Ir z8nZ`*OCa`5^cyBTRf~=cj|?A+9E;Q|Rj<^d(u+!eR_e1-E#Skv5Az<$eI&P4tW~T^ zv`X|E&c+!Y8XmfaneckejJbXNwnHnaDP9tIjDBK% z$Uv|!))?nT&K%zgt}7qo<+k=_J?;{C23mj~?D|j+>~rn|UEwWg2OGgP$(o+I=PH;8 zKf_ws0p>kFQc38{xd-oovDHX0N7bi(0_-<6pWMQ1OyhIosd1cbumQ{!%Y(1W2vA$` zHE~}tf3-e|eXF|3)HT;oTR>VVo^+cJl0G*MhDEi;gZjI_=1` zBa5K}?1HMtsw!b0t8%=`@f%Lu;GcJ*`^oM^R2xq|TJUJWn8Go^jFbyK5h{5h-70q_ zm!y`Y%wZdKT@;y@|OO)u0mG3qNQ7oZTmepGvxCdInOwij`jybxUW1C|=^Lys+&fA?g z6`VU-DOM@wrhk9r{>Vj8of-WzLNh|2ppCh&e-CFtAL`wDeAP{?i~{B2P?t;lfR%JXLqQ*`aG!%n?nu27j7P9PKk7in<4*nJ$m+CYleWjyn0m> z)cIUDZ-M&Y+CP>VChFDdU}{NzZV*_{SO|Lg`@t}v^TrZ-!ql*5F?ZMJ)tpYP;C)aZ)${uoUKew_*Eu`V zIatn>(5r84R&VkRSvO>`uGH~nt7kVdqC(DED%%AZ;)B zxmH{U`VGE<6c{g!0JZZsz|Wf-`h46D{opHbol4D{7An&65i}HKHcd#2;fivW+$6b=VdYjhA*2j)Uk46VW7Z}Gp&z`ZaV^p56-wNWkD*Vy>UHB5c9Jm?qj{bGD_mSR5PD1Nrt&i?2RN6y zvRbp((+A9&JOygn#!l+ZTj3M>Mf5ePI~gZkMxSjfxDuuV5=_qBa7*Zx!2hl8^d+bz z-3_(icY5urhN=cylR5B7P=8vTvl_Sf>_DS3FJ1?m;7PavmVm#{YkoTngCXEGyadnv zL-a)$zqMr!OGDTRbHTcuah|ziZ*U#+akXaVF5yIeoxD1EEpl7r&X3KHZHR7&)`X^! zrjf4Uu7PjS$D$545vJr!3118NP{)V+Vz;amsI@zmw?Z5?Okk=}r>GGAp% zrAwuMiT@HuMlYCKIJfYD_yckG`m2*yCl%W3r0S%y)7j}hpsB4FG|M#0R4b|$%uzZA zAEoP)TCI7;&!F$qILRJdb1eNC{vF+kt<;&iQD+E&`jdOb|6VU+DRXYmu9y#c*`u7- z(6$dUO=y2 zSMp3R!shS==YWrgaiCc8Z~EW#HT1KD;QRFVfmgu)7eh1?&6I+nVBDl0e#L+JyXfyC z_muwN_3PhYjH>U>-)TPL8mzwST5I0o-nIvP9G`*r^FjCy)`7Z`7mMqF_xu!mD{8Cy zv0Xd9h6A9EeKmXt`k$PSV(c;*)R6RZsx^EAu7R`QVrDSD3hGC$k7{-L82tG&pg&ZD z+Hei%gK}Rs7xU*drgtuZhy6LY7W{oaj`46Ad_$crDA4lXVbB%yEIkM%dD9EO5}%W^ zoXT=uQ)w`+^4c+%x0hGH!I^jsjH}hSdolY~Kdtx5<>|}QU6Wnuy1q0y5?ZBNr5;N^ zmhPPC9Go3dgL=_w@IJVRGaml~=4tu@)UvEO9{}TjW2tIj{-cJVx5ayQAK2fp5Bfp} zP)A+C?7ttNE&fIIs|lwk1oKy_FyGG}#WA5Vp_?N&N1UDeR_v|VoZLCNdAwP#Q(rom zcQ9`|l*uoX-vq|yjpbygQF)D_a&F~Z^W`_8I_N=I99bO91AjU4a&Z1x!*Ii($4}qo zQ_vZ{%l?k2`mXG9@K4r1LI021l7D+y=2e@Y=)LFzK9{cF`fl_?l*}%feS)*1Ix-vK zaQJXI8A^suFgxykaNj8bCz)%|30{GICHe(1g&K^{nRNrT!EaA}%T<3_aOULze5sS+ zV$Py8uj>isbTh!u855lcY3gz&Uk&kw-vix1eZ2|14nv_H=x3@5&Mt5-&@b-BuGaJr zEW+=6KP18ayMIvZ)uLEJi*G!2BV9D>f_2WgOVrcVUR)E6h5rO|Ona2v!^{JXrH!ks zr?`(92dOu@4!RFk1@}eo=QUu>OAmpyVz2XE^!l1-=Yo5t>#JJy+Vt8qA$M|aVs4@j ztc$OUe_r@`;aPAaI4872L5G49u&i)dA@-KSyW)4np9SZkSnE3oyP$rue)2Abg^E3IGwV*%Ey2f?rrN)nipk|f< z*VOCj3o$=xg7&1A?RsLo&>_1+Fe_j)vuCeC*SrgiZLEO}g0Gl!@+W)-+0@!@k}@y?tn(n2Zn+=Rud@BE)HhTsY%@k>Q{cf z@2gMs1oMGkm?8HkJPj?fTLitp>gGF{k+K_HW8cTSwGYf8KL<6nTyPzJ3O0u}hs z&3iY`Tz`g5Xs!=T=HF6V!$o&7;CjQdn2a33S&31S5A z#krss@D&`SuUehu6|g?%wblXt#)G&VmVz2oGceZo|N3Q&ovsJ#Odo-3+y(FiJU|c2 z%Xnrd(?j%n==G3)<8)>RPmWEFEz4aN^rBF9$t{~#Hkc!zpYn64m{&2cLT-hi_L<9@ zanbbX^yo}5&P+$rk(OW%_ecVC_qjK(_qjU=ZgBJUOeJG}|J?)3pRFhT2znx2JJgWwh3mlmcnw&$ zKf*kxC19PeWu|4O2~=j*VxPi3!QAU9g;NT>_$nnU1!o=XO6>~f{}?;`0v~2R%nW75 zw>>QWu3=zImCIZ>H7fm7BcU=qj`mxad#Np{=enO*7xBI_czXapk-a18+iFAp`+0Cp zwvM8%nhnYz_MH z?LRlps7igv{ngyD92(|fW((ZJNm&EZ1JW<2UQYF)mUcHRNGza3=1L}f|3BN~+vA_Z z1&Iq1t-yKS>%qOZJ6ww2wQm= z&%l#V6U-IVukVKpxL)Yh%!f^|5!9Vakr}y0`~l{N&QkJsSZ8~XnM>+aeryYrN8?s& za*Z)YGl#R*=g)MlG>&@!x`DBg^AKDY)H#NO{?Q&_oTabb^X1GX)VtNb4NBW`CX~-z z6?)?8gW6#^X5-yWJWQHO#j;G`U$d_90{C}c&ipyom>SF&NHBwVD7|9+ftIzbttGYw zTBUoJ^^dAqRkPm2Q()~u&x&&z`=|S-4wxx1lAdt(ZqmgIUl7tjGKK zUBB%IaQ~kio*eWgUlO?_(vhCRZJ}+UeL4GbPH={^TEMT&lBfr2^RAO>%*LU&QkU+8 zzuw>b2B^iW3ppDk58h!Ofj%*7ft#QVeZlHaZBDfb@?_(o+c=k7jZuu3^dYI6&jP)% z?jQO)hJu>9YnoqEAB>%v;xAQ4KL%T&CrpK(!F<KjuMZJ}!sG;2!AOJ%gI`aQfVOaL$RnC0Bs`z0QVnUgde)7;}63p;CkhG9Zfke2 z&`zV=1*P>vU^!*5v#EYDqW23V0kof*(1b$vA3D_7+t2RB-me1bhg8!*Nh^x{Z3_ zG^Vepm3;$kp+5enx3k|4JfZ%~HejCUnrBXF&C)#5d&+u&dH=KUGq`uTU!6q_B$6G; zHs9HwyFYhlY-fx#JBT$B3~n_a84ha2zh(cHZJejxe~fXo&Q84%W9 zT7&ngwF*55u0h67D?rbHBI27+7Y;CoOKo5$jDhW-M(fABF-P^);#Z6H^30*X|3~KJ zRmPXrH{3TkA9H+kd{j@2vm{;y&lgp5a$b}E{IM_yjJJaM!qMZ=VNe_?j@$!3hkp*= z1;)j`zP@IsNkH`FJ5Qo4{LYNxJHfTzdXTyBAo{HrrN;q%<;@oxFLN*TEEWG!lO(onpwCH8YUVhX2I{t-;>^lkES0@H_tTB z{0-fTx-k)XYmq%d=6~iR<3R0OubMHh{gHap9-|My^+j#_F0ei_of%K-;T2|lnTv@! zwtAEz-BSAF)Dvpc6Xi8m7rYkD*H(ckx-;-!>sMA;eM={yy}5sC2k=_=V65K`!OBWByeK!tfrb zCmVwszZ91&E;%530FLepg8TD)=B65-)PRBDJOTGVW1btqn%X~LEayU93j7|mqBFtI zd(XOOO@&x?Ebw`mOI-%)KQX=^1qP zwb(Z|1ipxT5!oN!A8sCL9hPFZP0O zKIhhuo`CtFMxyV%kU80|L%l&?=?HiR)K|QRjujsZ{1ml{Yw_N(pa)A2lIybT%U@L4 z?%&1(E3%USf`k?kZy)~k$I7u!#9V$U*_b@31YdI%;2gNt`r^{8q4XXPlT4{EDgM8p0WFH z_P>D_#9B#E2cfS(t=lzRpY!jq8gGwlv!b%~$k7m|x8`{;@0?CwhuX(UdXz_iy0mMF zy&c9gt}*J;YDnL5j_$eOIRyTHBzyq&sp#SGrWnrIPm|#(_zb3j-={XUo3o;tf-_On zqx_oRp$z@6`#3Ml`=tUsD5E$#Y76-FKY+7OW)#if6qTETbLZO7FVnNAXW-quk=fwA zGQBdjIPbt-SNk_w##_e!16OiZt@rxRFg-OrRX1HXeINV|KXY!v4tT!k`5?|pqr0zW z&ZFMP*Wm%M*RRCs5`hM;_g3$ZwGsU#`s#lLbD^uiJnuXF1b>2Bo_nS-RuZn@4572Z z+^Ht#uO#Trc^W_VR(jkPCl@C@xBdJ0_whz>u<&5etI`Um_uFt7UVy7P?Wqs+1LMZ2 z;94{&IVh-qK9G7K^(XuYTbR>5B{L=SAiP1J*w3&5`WE*swpQ$8bM3Z%WWC4hSuM^U zn-9Q!%6p*;v+84cvAn&xdviUz)p>@CqKl%xa`vG*uX)J2(7Mo2_!it7KY#?{;d~eZ z_Pd!UnHSv!=2ZF$^ctugSv!6Q{F+MeJf7~V)ZRK!OI90lJ!lBmK?5-UHy*Vv>V0qS zv=*KKHNRw5GSCKHA6T-p&Sn<5wKQvRUsJ_@2JEkMozUB4zO4r9+IcSh@7}jXC5nQ1 zRm1R5bcAQXdawEV8(`0y9x(G?>tOEb#zqyO3aBUTLC^USjJb`=y+-`J*GUYIlJ}uH zuUbL@GalUc_fbn$Gx{1H1a+sH;Po<;x{v+2<{m4cEHi`j(_9XZfcNT?aFX+7)jJ4r zi&s&TEr-{+a;9?T7iR6&PS#E?O)O2^pT0kx&lv{hNv)~7u4QIi6KV+OF(vbn@FU^Q zoX@%g27&XwJu_uzWM{;gaTUNkG!zX*Z=w(7bog|5A{^n|lw;61+&DZOZ}-{Y9(`PwP3r#Yx4vEtK|M~r&06_dW?ieJ7#FDL>$U$6y@2MY_Mqu=RMXe{ zZJuV1W-rU;9J)6;YYST7p{9Y9}&@rysF zC8)dH4(7r;!I)KVNbhj(@M<_Oa$dw-WEE#h8-KdLeSpvAPtG+{!}^0W$s5s3K~H@xE`K{cVTkj#MyW=@`AuJ>zDO-hFHGN%xgqE+ zs>}JK8QzXT9L5%nE%N%ezuSEGPHG2F!Eq=C*WA7IqV~jxxUs~>z{6$kW4^Nh)b)*< zTu1H)uQzr7&df+!4z1xYP@jGj^i8WHcptydc@{%B&)g?xX=Z7rLs17#`G*bmVK}k^atoQFlJG|Q?tGT%=4zh-C&-ezUuX(W^)0k2|WS7FxTWv z`T^U3o-K247rDCN_wLHtl@+Cz#W(93>!A^-C#h#o1J}Ya@FlpG9id0p=c_Az1M_L;p&dAgg*$&2ozVKJ0uSR!Ac1NbdqVOV4 zTKIo%4c{8B271`;1H${DPN8NO&x!}NgYTHRejoVwr-1u;ZRWh33(j;=Px=D_J%+m6 zc5od+&aymRY`p(;@zYB3fi`5kb(jj)>ThBOw{L7~sln;N={WSr z^vL*la*J~VzruU;$*BALe93Xx zhxJs{DXLTS1+(iaq$;G2C5{DimYOA+B|5}A#H+$(VBY3Abe>(%BHki6qriUP)$ncN z+eF!9*`ywT8p#^T51=yVSyRqU-w6KfFFD7r38yx!hO3!TVGo!!PWu3s!r$OM(}Q^& z{{8xNtYy#4ni=%fpF^#;DU1NMvn62NZ6fE&?FjD(_s{R2zYjjh`yekD_T}yi=4sgT zxs&tDwnVl>PD4?+D0~~73w=XccW0b?X%svm41a*@ z&698o80WME>$mQCF09r+%zgFLd5;@UF9!9@&hS0BhNvs)6}%U!fw@ataGfDNI;~!! zXT`NyPt6W+|C<8(*}N~GfU%(NFqeJ}Yv$?{?k~H*UIO*i-Jl2gdwjflq7>`BUz&hk z8+BptizCdVHTE0BOsT#(eW?=s7_3Wm!gaz|fqHc_=85ay@_8JL@8Wj)ejf#O?ODt> zt3rRawTfvl8_tKeu#x`hZs2T=5ji9HuG@3k;n(nW>q-xGcPM0_y)_eKTi0=Wwv5%C zZ|2%*&B@&J4f_5*2DLYHJ!jr}%^o{-ELgLQJ13*tYzAvHYA`=Q6=(rxfj%MEG_QGM zPW{`)n8rh{Gp;EI!RNLfe8o;lhJ&8g zKH%$UZ=AZk@!cfO&iNwzMRKj30e z|8`w*FH*tfC<9!ouz8j&6m#7|2yOEQPx?4q-aZU$=)dh+#|^*Pli zxCWdN-XAbgtnG&6&|UahP$ zb4y8=yifIFP6oB5+4Qhjd-a-9KePYkHmC+ZH(_v3a=rTk)Z&e?^1$oWn8`O| z{7SHpo~n=FHkb`t!2Rx8P%rYe(F13!?zP$ueq)wm)zei2U-;L|ZR!b&(UsaUSHfQU zvq8U&vDanH?5>(uHBUeHvixQF4NEmF)ueQj($7K*;Ar^L2TC0%bsuca-ws{Vew)_$2m8tTpV7?v1{~e1R^oj`=~|L)}B$bGG9Q7#H~TKh6F$@Z6q9O~X2a zc}*Ue!&%S2gnk_BP!~XVXbBnmkkz_<96y6=k!yf;H?;`&RP(UyMcV^SNUd};eYfgO z#vW=G=Ckg>>P;6y&rHuu0@Og&Lmz-Qz}k?SPSv8S!5oy!I1|A5y$xIkPrybn-ZFM_ z&6&$N?2};-RD)|^5*Wi77gcB8S~kpMp7;}>N3$_=PV{ZM_UR3H2fWwDz;3ii>@@+|X;u7($2H?#utIs1f-sa85v%WS8V$Fqc_K-$7@5 zycLTo1~W{p33yGI-&xQ62CTy$2DPb4U@we+XH8otuXVLE^Coi+bB_#O%EovaT#v5jT#Myk{$qX4_(=An3t!1xrF%f% zl=ZfEVF_4^e-9ergRBmvAQ#_^p1T*pTAdz0i+Zz4%_>zHs)GFv!=PJkw_rx%(&*CY zIq+iS#mIs1f$)9cp8OTu0CPE4Cj|TPLB7M>IK984KporM%UX(lCG)uv;QIrifH{@( zI5Wz4OHJx)aIZ2qB{WCDo*T?pn!!w6*OC=r9makBAfAs~APSxF##3Gj`gr#<7sWkJ zom<`8JAchPPt9kl&by~7Q>zQZ9q7cvz|VUR+w<$*eH3m5{fNd4zv4k&1J=T)GV9Fs+t=;{ z-s!pFx#3-rU6C)NUq;)++QeQ5XChb2tClw*cS3Fxmrv!k=4{o(e=?U6e`U295cO5m%phG86A z4&3wa0=QheW+fj)y9ILFTCVLJ0Z&(EBn zNvG1OHpw>0PKi#5&GF6g^WeL}@0haNC^!rA{KE4K-zs>kz;iJNLlgKBhQ)`)Hv%J! zqP2{#n5pI(;5}fDrVd^wt4=UOpcB0fJHUFR z?>`AAIV;8I;AwE*e-?~=mNEZKADin|1MoU92i9Mre?TvR35(amgU|uIH?7aPPJN0u zSbaPM<}kUH`WP)om^b3)u-t#Pb{mEg^% zC*1YQ9I-5zH>x|U4R+$Z(N)a8x;1iZutvECbt}`Y%!cwC%Krr2p!XTQ&p1@>P`TFd zT-oQ!9w>dFbhT2|N~Q8s`Imuf*|V`{WAi!j$-3g(k+&nafos>Zp=XuMLs=M97iBLB z{9;}^8>wIRfESrN>~-gBVD8~s>;A4!;0UNcc7fT3h?w!T50(xLzC6t>lalz}VdD=2^{{WrfC|6cs+saH=KJ8g!8;C+#REuhw7UNi*ET`ppdnrriq@GsQjyrd~G z0v(|eyp;V?&`;Z)Gu{07li-|5G+CwCv*22VhJI1BU^ z+qd;Qd;xdo-krN8wuPx>!-GDpI?+1O90vSYAJU&Sl5=!g!s9uQGl}Dc;A~&>_%bjP z&x7lzHNT6&-0TdPj?c-w-pB5q@*5a4tp;;_V;{>OE>+ z(*l}-y2yi28w{d4GdrjkGqUdluelv?1~sUEm^-BBP@j*QNmtHoaSi@9``hfQ^i>bT zx4nTmx&<&HIw5*R?26cv&>PgeN5O|s5hh0`2VMiuQ*k!RgUsHY7oHd11-EnV+((ei zNe1;+(FfTJNIHyys!Mw?QY9{;+zHbfRUKDFc zli_o4&Y1V$4d8XH-^sYee8{?%&*7tRGniBT39b#U6RtDvS!bL&gUMSBPR#`Un(ElD z<*x6oLC=xD(;A_E`p=j*qqkdq%XQPQKLPIZ{w`zOTCkBhDDEA`UN@e;G04Bw8jZ6Q zUR`It0(-aZ`PExwF7NeHg*xw1`s{s;b}?Va>#siif$wNJGX)s^9^56ZXJ6(7LcS?(mNaKZFX2 z3JETQ<-4c1381xx~1{= zVNi=xGid@tnVGX4&Zqxdui6waZu0qZ-LpUGL3kVnzgE_*kcdg+Ea=nLODwt21&zR>J54oN>55)V^*Vr7Zr7k{nd~2%K z?skNBgyP|N*gm*Pu}QIAa7*qjxl@1^@Z5oU1M?O_EwDc4nFI%72dLOx6+093Sl-CF z1nw98%JeHU66TkhuRW?1V_EY$=61~O5bF^8Bl1UNTX_dRS3r8#$?_{ zdJ^o<)1R{(o}upcD7a_b0zabmYy^A<3G|3wjgAF>m**%vqVK;05+49HoY!4xkUB zIrH%Jy1UQc&%Ehh!TiMaqy`Lty7=hNI#uEO7p>TOd@*^e#8fr z1zo{)>nHGcUkukUZ^O8%da3HAuF1b9e@xz(;B0IAK`w_A^r)AG%fgq17ljsu9)-K` zy+4gBur#PSS%-3s)fadOM#FpH`g07Qs2*AOGW8^NB;%&%!S&?B(;o(Xw`xb$OVkYB z1M@C*g<0VL^%zQYC9#g+qzu3X(!RV35k;u^K(CD_vwnzx_pnSMIC#IYq{xS4p=%1W_ z=-&P+&>GFzjhD^`{bjDx8T8DRptfn9+I-hKrN20gB}_6 zj=A)`*G<+<_J>NG%`p#tfdouVPYtg9zd6%!DV`K(B_gY5%-05hy7tB3+T=R(1?SJH zRgVF4Lg#P%2YhaQ?pA>B8(;c5xHhUcnGd^msL%U68;4E6sh{dcIR~r_=*hKiau(<}c>t{O-^AIf z-pgtRu039#STTd1;Cfm0vOb~TN8jtj=)|aV-Hm(igkPh-Mu$d*MvRrWhPH;xFGezN zr8mCoiTJjzW?p)`bi1_v?PZB&iIwq{@&2%+a7p0=urFmt!H$Bmg=GszfPFfT#UG2m zSNL9Gt9YyUjKqw@c<6#YZw|Q|ilAGnTk6mBpXrV8Xy(z3`L(qS_aEb=C7^DqURQ;l zQuEdenOA1QWgO|g{Wa(zNP-&5f51AFdP^ba`Fj7VF}(oR_t!z7$>FOs9$E+ALqB*E z)X2@(`hfL3W2aW|6m)>H9MGWz-tf7q)^iikgn=i<*Gy`7qPMuB#o&?uCW2<|>JybnS z{mq>5HTa(fYdrEjbL_^K7+*qt-+2s)P$D!qGC1;d^y%ot*u>cK+~v7Hz&_}i*E4Se z41pJ*kn=G+!C!DFb|{#GvJ!vDchT>nkHPB5>PRE_C;U%%4d>jv2G#I3_2%rrC-95g zgZCBZ8Z^mklJ`XJ6S)_}E{HiJ(|u!iXm@CA&e$C5wp*D2HUzSvTZwK=d#w2XbFIja zt!o<}s!dzdI!;~bSNI3If_a)6w{zT1reRv6?#nIwT%sey3DuZwQY`7YJ;jA%rti|B_ z`kA_eag+C+Ynu1}-(b%82mO2c3-yW^8@kS23!}itYW{c?=oi@me}W5;o&YsRuhsGJ zIE(|YKl4KCzg{<9UytEux*60Xd_V9e5YOKV?iu;aH1L|USISz-n#`KaP3fD`kER|? z&5O^AmjcgFae+PvlTJ)J@yyX@j@JCA=09Cw@V|rq-2kb2Bd&Yc>a8BOK=(~Pg1+JyV4ny9q~^IRW?eG>nG z`mOPwfAd~YkN6#2GtA3ehwSUOCRR45Y|eGesC4~!jQ+gMa6OpMHqCBICrI63POdSI zan~YHkGhxHZe_r=`qrFVgSg2$pL?x8^E+nws8_9pvEa|NPu-tq4)-}TN{plQ9H?!* z3cX+$xX!7iPsfvBPG{efMYWcAkyEfHx+eNi-a~oAa)$-88efUM68j_iM|6K=e{lBs z#o>#?wU});ioTc2!5X0JW;f;+7*kbY2El&j6r2sl#j`;j%2>*ns0lqv#@27a5;zZh zU%kO=O#Q>W#kV&>?a3OOTE$8*mN!P4PM^kG5W=Ta5!9c|GoNQZTpKWFa9_7>bvIap zy9v}~uBCrMZRTUBK!1hziT9fKs{6j{q&+uZ=X@RX&V3g7EE0)EnC8+XN^4=PKdgW` z;5>r2V{gZ{Mz=;Ei9Hg;Pp(C^p>?D+&hgGcFYleft&|&%*CA( zXFhIR>Yi{ZSZA@m;9NaphLPZYV9v4#(%|*!rExTkCdV=2GZz08l_3!i~8_%V0`j33uS>+@sy6^d`>-*I?uBTc|^Ig!4+CS26^o zo>|u2Z>Img6I=uL(Qme+jRKN!=vZx&GZ{}z_O$IRP&7+Qcjmg|qdTaS^xs1aZvyB^DXpiId!CD&xF$$A@h z!fRm9$_zXLgTOe-*X%xU9bOJCpe)$G`8RN@2Kk5och4~&(VsbtysZXYNnhrtRC4+- z*Jf2>RpPqTb*V$iL&=|0Kc}urU&X8WNBZN;#~J&qeg}IVz5%re*BYNh_fKP*TbSG3 z6U+^a|Md~rzp0*N9`HGHKqi11lxy5@ut(S2!Tn_f*zaJ>^a(RJ?t@Rz=*?B_9WcZ($x>3w>jKZC#43V1~-i zk)K`8B9p?C!u4TlXlf`7A2TmPU&q}rjsBwx!9Afn_Zb$@Tm> zP%C+gd2?-|ZKBsey-2;t_R#jAPp=|p?o7*>ma{&4eYW?`o#4;9D(D2dDwt*R1?STl zYp6%N2iyY_@Q}X?Yv4}M>(d3S^SP$?0qcL}c=pt}p5F|9-uUJ=aLsbAW~M@Ibhp8UMHzo97!NO@^1ict|g9UFN{6 z16Zqay&4X8zyQ$8Hy2#1eC?m02imxQ6d0H5`_+SCeQOU~&N&yZMPAG5Obwtn?BqN* zJred}w9mB9)M1W#I2BHPl=uksx_xlc?^Ox}l>nm2#Y&78BQztSFSYjkSX#ze+D#xc7=y~ushdfPMLwX_pf z!$)v)=;n~`zXq*CtwWXIo1AZ`>Wv8InW#HixAWfvzAhV|gr9iSGWe<}q-=->1Eb_Nr7cLtt=#&{dd5$AyaR|}aBdZP7X zwg+P)*RKB1lzF?(mVG1ljodF{UwB)^)UF0b21fL>zY%&P^cLr6Z>PrS-#-Sfg6Ei{ zX-=u{()H4u|86|D{lT1VB&-MHYdtM{ncwW(0d)uWE&Vgrb*eM}!#KkA%l@e^!Pm=s zAQx@}uYc?5#uVz^e(jv%IYAxj6YAggR5WL1k2Q%-*`2cMh3bW#=iHQc@JsfH_J|&a zr(;jYM#B%_ytwUS*K$K@+$Xb7 z2G4`BQZ*=5vQ){Rm}%xdvL*bZ)oWdU%_EGJypPp#j63um4F`RU z3&5JZ`p#;w-uN|`C%J}n1=kAK4r`L@nayxNxEDW}c`~y$xi;CWuvcNnf{q0%U@xpL zTwQ2g{F>x7OcrVy%&3m1;=wuB?{KE)FVMfJe{de%7W#T!n_h=(yp@j^KOX4wrO}o) z(FbRZ&(}!3=qqqfe+gV;d{dWf4EjUdbgao)TQSbL2-Gusf_@WgDRFS!QA_f=Sqz;y z)3O8jTzY-Eug(Fr7Exze0rmj7pWA<`hFk}Z(@*w3=mYXPH-04?$-1n>WhLq}AIjL< z*)3;h&dywux+ZlcJ;?T4o)5d?yW*Y?@o4-}x>P#EmodvSCzF$Tfx66Y=nGfl4^`W+ zC)?M|dc|@$3huw9;VaHtHm5cAPl7SBF{km-RrpPKw!8)2g>$%XJTG=BxkL2hFHfJyoYXV#0f}9I- zK4N~7Yls^A```>b|NjF#1K!{2Q`f>nunhd(R$!iHze6*yhsFC%Ux2<)dsh4#jHS|9 z=^*cNjZlMfzitJ_W)Fe+sq4@GaM3XMM|=<8#3Jq;aCc`!%qOxuo{Wo5NLy zl5i&YzW%1A^l=w~*H%e53TjNxK^HKFKL+L})@y2|YNh^;{~iA;@mJynSejg#d^PoI z>JYTfwC2>*4>HHW>*NTSo4MYYC$s{+d}<99L2r0H&T=v*G)H)lb6MPT)l^rK9~yfZ z4|~tMN1Gq1RW-h^~ika66+Fk21?Vsrg@9NI@_)Jx8~2uo0B&K+UB>- zUy!#Th^vgRJXm80sGBzhwWf1nc4T%i-xCQbJTo*iICH=~OHar7&<)hM9xVA_;CJ=j zF=qV)>@gTk_3~EO2R^6jZN~7%gyz5>gLTszz~^&t$-yN@G0SBn{2Bf;yg#%*q<16& z#_j6x_A(fs)c|V&|LZ;KNN=ob$-|(|GZNH%%%RPd)r4LJ^BLD9>v67)#!s&M;>UAN z<(x9tyqtNPZ9p%P_o4nKUoY>^Qq0a(M=~Y~aun`WV_x;%*FatHOh{0F+Y0Va=60{b zZ1Bz3(O6I~%G*$h9s<`s{hc4f`(Pi%3FySk6E(<@um!vx2ZHzeoA6lHV@v_Mk&e<| zf@@sQsJf|j&B^J>>Gx9arQT1zALIe$66F##<2B>XV`>m@5MNrjv~V8W4cEX`@vGu( z;8UoFJN;>Blx&o|3`(a;2j_Vl!4F<8Q!cZd^XBy7>rLng>UHW3+hHtN16iF~ovOlF z!3~-7^fgpZSJwiX9+(-Jv5u;@-Ck1b18QvjsBv4X8bDv5_pwSa4xrAPK*7`Ov zAM-!VPEl{yr>RzMKd*JgZtwsU!)S0_`;&fS-|q~i;T+J9;96&{_$(}dWzZMY(9Kgz zQTwRCc~|P}?nnADo5BOok=X>fc($Cq`v&L-Y94JKZ5U}7*%#gyUKm;!%qqGn=c-_4 zu+NLnnYpfgFmGkO#ZK5csGm<@hMKX&RBAfL+s07pf#%uj>(=1R2aK7FDR#kL&?8_i zS}nwUWEcDdjlh`&f%k@d@H6_XyWqhvCcO`zeXmHbh@O}jZyL|c-PS>cyb5{h;cDT} zLv3gW>T>oH&*fa}C*g9)hO6ki8yy-Q`WhY<&XteT_&FY|VQi*iaS%`aK)3?b`Hck{ zL0K?nHjp4ZG%qzL^RcV9od>sr_q(y;Lg)+b(=l+ZP*Z)j=vhlbLI11q zllMV)cpJWhnVdaP3Yx=*(66Xp&^w{#ePiav%;4nUq%*I*_vXWk@fYJ|=~dM~*df({ zNhZ@%)za0{O_=@w~gpXOfXL36-+eR!FHOkANI($v-@-SSKbx|;HL9Or*KBivGNBD`JVe>a@nBI3)!MNVI zw>cD3$5T^Li*(Ps8k{j;T;C4u(ih75+Haf-GM*Y>EFDXai;oMu|DPv5Pn5xztDe{u zra~{y|LB+LmpKd<(le%Km zyl~ztkOt2W-vZyk0oVif-8nmMDC~*tiM<4j1&-!Gh8$0C#vO15j0=wo-_030n{ze? zXAPR$S-UlNeiZDjG;US*bI(2(^m!cs{jTOQ*1^qdT0&c}R&LzXo*ruN?fRTcatk<{ zLM_d_z_@2LJ!_jFpL1e&PfOL z4mFE!s51MS`x-i1YB5;5R;&4u-dFX$`%d3?S}m|VGuzCshrzq}CXJ6~fpMw(hCMIV z*whd84o-y6Kpo7u$+gND$bJ{&+ne!y>sK@8RRee5aeY>6nhvfV`c$mN8Z-R~=3>^> z)VYoIXM#Pb>feObIOk53aE-F2^)IuGy(ikh2k<1l>lZLTZxv^MZc1;W!>wcbF?wz{ zB{n5Kh0!QTJqmjS=Ms39z_;*R;d4xn>&D46a|;L z!u0Oc?$nj(E7QF*y@T`rUMPB@=qRY;9Rl-5y&3vj^~|*3yhb&(@4+?sK^T`cjyp3G z_$QqwG98b!9tZ#bDEOT1V73(&hfJrUPJxzt5O1yZ&B^pSU5}4T&DeNi5d9;@Qr5-P zKkLC!XwP}l6F`mhTv!An;RYxhDjRA6>PBV2zJ``?HM{`ER`-PN3B3!Gb0!BGmGv{{ z&DqD|I@}9BgxBG5xE<8M)TPdXDKjY`!_{>Ap4_=DA6fq82 z6k8N)oZC2ePION6BF^X>9UdK?%-NDJaaUi%Ts!NW{w?|;{GGMHpVgh&)qS8kc>jLK z93J&}^EGu;a}#5$3-K^|pDmz2h*p?T9G;3i75JF$jolloms>CQb!eW~Jg+(ww-}>br_#*WyJpkroRpBRm1WlO1U|wbq(>nT6>T>?BYua$;%-L`HD1J%T zHT9As%x7?>L#0!dg8ARIPSpzP_~w!NO8&$*I0FtaOZLn7m%&WzSR$6#8{ZpOyE->@ zZmLY-GFu@0w~bsu<5z6r)1<^Yd_x@uYGACJZNdK>-dT~BvC{V*QZwnc4= zlIdi60kZ}+BsV0T2j{${N1!ZR3LnQmj(-aW;Rf)1eVW$eIwU(J=R?a>%b*rlI$b)w z58Bc%r^mv0OubHgO^qjK!cZ_*wLeEs%mmIc{51AyYz+JZA<*kSCo(7UGx_HyMQ|+pSm00c8XW*vzzFySZUeQb@;T*m^lci0 zU7CGqQ1h>tQ!(dNJODR>d4Rrgbp*8nJvhdL=2jixa<~iZ;hhEgq0Et7E7X^)1Nu2* zLe~zpZfkm1fVp#EfzVO_2qb5r_34NzBG53j%)@OADE#$?{-AA!2#<={T_5&Q?- z*Y%6M0@iEC!w;aB;1@iu>YuLRY8{`0Z~ByWfiaWUqx;}Ppx)pfavr!38x!n-_3%8H zGj(R_;`GIw;CxBCF0LK- zZU6SRbhNqN$MJtQ$Cn|H4zxxBY?-wtN+x|Y@fwR2}W>BV>$ z-llJ^DU^Wy%;2pEHJG3BH|ONo^Q|w$HOt&zjdB8K7@h?c!RNCR%t7bVS7;xG^(FUD zpO>C649BSvxTIwKlf{ z%zxhn*9kqC>ba{qhgH9ovDGyAg>zz#tm}77Wypwn*ac}(Ixbp_Sho<0}PQKZ%;@sU;P>z!`CxC0%bkINWFRWr7UF}qD zx>G((RY_MNin=oWdggUpQ)@EinLm09b?W+{r_~trN6zj|L8OS{KaWo}vz zxCrb)DPOXDuttoh@53C<{7N6T>y9FvvAVT&a})Qj*YGN|0b{w|ocW-#6NPoTVi6ln44O|`+iunm|;nserWaglmidCqBR3hpo7N8&nX&FLU#?hOUk z%-Uf7_y(NGY`QVbmNWh|*7O=J&-sO8;SShMyrd`LceHeKyt&}DTSPzpQ2Jb~iyBkx zq1J1?V<5P0d0$@_y)HQ8Kp)XJoXxa~UR*-2&?V&Q-apnLzT#YD^#tp~?xPK;59>$q z9`>Fv|FHkay;JYmgP{jQd|6~8=mke&h%u-q$ivTp9((&|AhVtbfyD22ZHk{yoWyrYZ>~>+)EB;9S&ybH=q~#ZDwTI zw`g48x^9l5rtkZ%^@He9T@Ks9n96+2Ye-#sJy?r>iSyl-f^m+X0CgjE9(|Sep7?)c ziD0H~4QA|EQ*%wSpHPq2zhF$|z2O>VoaFagbFeQlUKB4HNKc7c-8kq4#ytLB{b8NJ zUJL#BWx)T(X}VWG_it4rGyXE>Q*TMrQ`02bB>8Im)gTA@E%94oSZbK^a!P;WfXsl* zX?T>`<$J)GP3_#?z-{3A<9e*W$F=)D&R_e~Io@C{?E5q6D;o`7cf&b1s6JE!?@?oV z^J(|xcHp&c3}w!w#$fDOles7tWiHAzNjFKW8MIEePTrrmKRA2tK;eNx|MoKyXC!vU zcg7uRr}lJS;=IH+umK)QK9ro8nwTO@P9IGjO&y0Xm>KspbA2BK{ZX^vJZ9NgYqm$u zy>Jt93K$McToT?e1S-C&QDv6knN4Tuhi z?uqOPG~XWK9^sbocT0<)*?E*iMbz{u66(4}<+E`oy0G^@xdZ0*rsuqFZuq z)M3^p*NGqD?UHW?{dwxq`lP%k^EqhO_3Ss!Cs5CO9;_c4KdF~(&e|NDdp-yc)4T8^ zczh)`#r!UygqR+{_BF0$|_b@LVIVt=CxUT)oStp%2qw*a5@%9}WkIu}QnKLOg ziRpfQLoLEB!k5BvW?t3`*9y;ur(iJDgRg=KHD3ki-`K~yj`NiDGx-|pdtD0V!^6OR zt0tI_e$D)2`=X39p9R-w*B8^&a=@y4=#%;(wH<2f(}ToYLnxgmN(bOZg-OTtUS_rk-h)Cp!$_lD_s+@FWu zoO^#0yqfiDmbLI!%sw;T^6~eEX5j1pDSQhqROV_1qsG+kUB-{t)&sA!wKvzQKfry? z=hAu6-rwp|YUo~X>X^5J`;$Lk|JAI_tjs6rPtr&5AN7V7i53axf2(oZ4_6nugXe}% z0_QX7Z5>}YzA!JI7k>yEBpNUsZf)Yu7TXNY#C5-$2iKxs zH-yH}1I$&u?yP}50bYxBVI{QVECF?#2z4}TbhUH-AGN2&_$iIW%!iD-T}zk1TF{Hq z2h`iCZ7jGG%r(?)%@f7%pNlU-{mj2zKZSooKll@jsgC0r zc?x2fpVWAJfWDM7(9d1#)Z*OR_JTU)t6)842R%=ITrJr9vN9e9H3Z|>Vz6eV{-7UI zJ+u|92K}&2nPq59VNPHScZ$Z|{m=j&3_lp|8|fSId^r6{HS%iYG5#X&;rxg57r;uW zS*m8KE8*V!d-JQq`S5t&<9X}BzTU@jAIp6|_I{AJHI6loeH;Cj%474WdezC$Nt|mp z2j|3B2vrEF=iNn*l6%YTV2)!w@N#nR+MGY+9_Tvme&~JlB$$7gyZi!QIj07;Gmla~ z<3i>IZUAGRZg4#q2R#X1<7Tuiqf&bk6BVpb>SL!}Ox7Pni#S{}_LWHN2|KQ}J;PVm97$^#4D~*;Gf9 zN0Z;dCy7rI`{VoL?}2mU9E$0AJ=Z&{umV)KN% zVt2)gB1Mtj&<++cNBTw>5gHM?m0p##P=%SUO;EYl;_EcVx*Xisn^D_$t@%Hm&OE@z z^8NqDoNdmGohZptNoljReuPMr7E7cJQCdh!X(2+0qJ5$4OG?p7vX`Q0lT_9cZL-hV zXZXEd&sV>B{V_9UG3T7;x$o-QVAU7oiojfLd@XGr84`^ph{ACZ}HH^WPBs z+AW|iJ)iSoR>CgOKVz%^I0-+w3Od#ZgbWnNNC>O^YJ?q9|~Pv95P zmup`9Fj)IF@9@5x0`BQWoJC;VV;t@^^F7#y;y(Nc_}W-wScHGsczrXN7i3Gbr6yTb z!Ry>Oz{S{m=5^3(ssB(v@*=S2VZYW-um@ho`|R~S4bFupz&_%WnZM~CV=ZE2WMpJ* zbZyjmWuBMfyg2=pw-wxm;xx!`tKf~;8!`J%V$9Gp{W57 z^)YK+9pQK8DyR_|4}A&V`^H3G^R5XkKn;8p_&j+(s5SZAyb2AOduOdc51{LaagZ|` ztoNS}#--+sv%%l#`e<&q1wI2`lb&E)b|V-|>5(-*vEDR|nw_t|`Cg5qHI6=uU+U8` zpO)Di*&G=c8yDLg-5k9L_J{X}Yes5D&czF>7jOg|2fkUW_8wJ-YX-*S`QREq7Sxk2 zhAY9`SbfvyaXjcFH$R#HZ-Tm=@yJ%_$~<^ACp8>32Cs2rN7wQl*&W#p^i2Pf{v|y& zH8$lMG@bLC(#7fG4p0tiK@C^}tH7^KNlZzYT#SKl;lJFjMY=`0Ql=8FrhS=#oc;O{ zoSQp0m=keI$tgkY!Fdnn&w9UR(c}9EJjzUJeXQz>&f}KTs>x(bcGvWc5Zgge&uR#5*`-gLu2{BLC=}7t(u>jkNyy2 z9Ahchtsdaxbd5r83H)Xk;04k5J_4*~yG}2GK48pqC8!07_he`IiZd&nZ#WayYvOn2J@1E;nS*jA=ahB^Ys9W; zURT!3-vfJxeZL950CjP!f5Cn09`F72DcBdUZsK!duH*fq?&O}Mr{m$s!;w1W>y+P6 zX+x!Hm8Vs{90pVxP-!DstnvGKp#E=8XRKgt-F4XYRDZBu zBx9q7r456bl?mpNybM=?F;E|HmcWGEgxu#a9+ty8dftj)5ExUa+o)?yrT<|VIP-NH zi~!>(>vsOz7^urk>gwR{_y;D#70@629(_~BWBM}Gt~TQnoC)W^I8fWN-^IPcTB7yB zY)Q7{J!YNg&$KRQUaF?!<5VM4|1w_lvAZ7?Gt1nZ-CWZiOJ~e&0dqL_Gxx(=IHOHn zOHV`_&hvbhF0`AOciRB|gc~w9;Fz49IgMVmg}H^fo#1ovdFkh+=DG%i))ox@%m?kM zU6)&zo0grHot2rDIh8X8hNOn1_9XWNekNxxtpR=DuXA?FamnM74?-`P3Hrq!1<&j4 zm+qI|3X?LEGJBzQwsrO}+>*N`cNy~xT>pH$#-3^q>Y(l`|A4x;o-WrOby{oO$f`lD zS3TN%t~Z#oP2^0^!=UFw{nXl;ekE(~i$Gt1e#i4+6;umVl!rF!R z%pAA_{9HfFcd!8Td581<4|9Iws4DOYeY>tDYKQ$m|A;;jwI$b^V$MY|9#GT%7hRbB&r@59G%Z8ko1 zEi+yk2j1((N%piDkE%->$N2mjZ{2u|$!OtA!F56ZrF)@!xABu6nP2g#sBHqi}M!; zded+DzXfvuY92d-*EQ`fI1%)-IkUi?lXJkIzZmYN*VlTSeuMvfm$%{ zcufsRKfvptwzLpW`ZZwQY;E5C*ZaIdu0gIwrUsqn*JTz!w`{j;4f=w1fj$&{EqdKQ z0_)2!9GefLZmO3=U1SQZ0OKn4ZeyZNa0brIvQQI@hpfXHZ}$WJY<~UEGJlqdGv`VF zr7^QVYpkFKxg6dH*SXya(-vxSC$b?>Hy@n(#H@m64SZb*SyJ?Xe~WO$rXe{P=uM82l~Xtgsoo zM1#VE@q_VJFavr*2WVTNZH2Lw$5x(MX=bJF6}wkVl~0x5P;NuH%0-ono-KT~@V)qZ zac4L^5PcxJGqN*sJv>hB)a&9_FvmL|tRJXrkyjkHWRE30fR(akx=&qhiA8#J=Kv#lLW3rn7f1fu~YWrCKvf z{2geNX%uKqO|nh0m*pYPbwP#GRmTRBgq3c_1J$=BewNx2WA( z6W<8-q^bSB3g%qqVV}ca(3pAMU11>fqc_C*T0eT`4&Z0n2LEGjr8S9RupBNAUmmUs z_JB5rjiHUfY&iXvu4mTrt<_yhAII19le-tYz7<15uy%hSdLTNoXk<|Z=v3ILa6x=Q z+@6qzusOCl_GR?T=ogVMB3FX@$)3=jptofNox~r4eZz_;=A`Br`o$juAM@YvGpI>f zdo@opR2M;na=AVLp3T}_z z&h*P`;?oMI75o_ck*Q7(#p-~u)MJsy0^i$#$bm@ZaOH3l{2jYFPofPh2mPXp@)iYt zd~2O*9`AZyPA;o75!mJ7y{Mt3)Ka4VZGXFPI|`* zL5*n%=rK^=QsYyzpAY8At`UCkNt_E~ev}V-(&jN2pd~bhO<;cRd$r!bm=$0QZH%P; za}&G*_Ntr*)~Ui6WZkdE!PC$j{QSBy*9CfjbrSbG>%3}B`$GFdp7CBAyjR|YZzA7B zD#8!pAHplZ@3Cj&9GC@ax%Qo^D;ryxFY5EDQ&Oj-2lGn)P5+y|H+667s^nG4&56xS zYO0?2v-r>A1o(bjVqD@pP|lF zr`RUlCOsoFBQqGz&Yqn;C3i~hWw@79fF?p;e6sp>ok7xx+0E7zc0m@bf0)l%3o*~@ z41Gb*lJU}B_z+Hk*3bp+ghtRCT<6qVj9UxA*FrCWIl)5s7UG;UGWF=xV3w+L!qkoW z!tcz|C}0MVo`J?-TwDNpi=P5>6zfZ_NmcP(Eu~NTMP?;z<=nuX%*A!Fwgz`;;iZK) zgR@Xt!V{p+@^PpS-QwNioxpR(zk?A{vD8qvYw!Qq!;FU4k;n_cdF z_`C4$LjRas!Jd}h(caP5Bdfs|dp6LMUMf#i00CP%f$@Rg#z}nMvcoK|p)X&X9 z=ffT_Uhy@uM?=r6eUavZ_Oqz}TmX|npNKQO>{0PLwNCvPv87&1y_ePkKH^+3*ZFI~ zcuD=qoYA;x0jz~;oE6;@T+e)7Uk9(T`yrAS$$PHMbAhkL=k;OcfVyV5Kg>_fPkDYy z)8eMZJrDFeFlq0kz0bi^XtS@)zW&gBfAjtA4zxRP<-sctPB}E?(7A`tJ^XC(v&Hu$ z?n!h^c1)g`Ix{$Tu3NfWpn+$2`<}U$uQAJ^RY|KL7JY#EGw!{{mag}~J;^!ZNI7M` z0qfi5ar)ZTow`$VX$K=g9ozM$Hhr}J`u)_FT7&+hm7u1r{xA>J zySvc8fSec1JL$tr>TG^CzdL7m+y}-+z34+X{?aep5d2=Xs6U`6R2166d;-_AH$iRb zB+xhG?>1h06!vq5Tx8{1*wB~37m{q9NmeeodY5}wbjcR#j9XKbW? z;I(HTy83*3(AR6tL63|v`pMvICYIyiV;*`ihs;<=ZDj)9K(Fzx@DjWXkAb!EIA^x1 z!K{b>(U0Nxs5M!;RzEi;w6^d-=z-8#k+ULmmBpnA7@7_?7Tqp}#_N;9M|gGp6>nzZUFGaX;4&@7k<} z@(yeOYZU7DPs4BcMw;Vg*DFvA_W7R$>O@a-_Q~}?`J?1a`evU_J)LS%+@g3r*l)WB z?AvORYLXh09uv&_shg=A%!#`qdj-nxX+dv@wUT;x3)tpL4p9-hwB*u~UF7t>{mG2W zI-CQg9`5t$dSZTNPTT|3!aoIHBV*RpFa^JppIa;42>$)*(dOAj)Z)~RCUOSVx9|q2 z>8LMQ%kK^9DQZ!E-M!~#Fm|rNEPx0YBRvS)KrPDrz8Kv1tQqU0u}*A0JcgdkKVT`o zu?k}mv zS$(53qce{(dv9ZEBPaDXOBn~LCrwUGPECS0p%LgE7?2u(T0SJzJl#A!5u8=fiy6B= z!ZKzIoWsmMeF?@#w}X5At<0|REK=_cV_EAu=JeL5lg!&y^Sukc2KV|~z{g=N2}ahZ7t52 zX#-fd)9a*X$o^sDtlBV({*w=33;28N|50yJ=eAa@)?^H)_N9+p-vgz~JbPIxLr=T| z>tH0@4QoLU)C1reJPqtGeFQdxx)m)2LEpBose90La4k2+yo+=E7Nr-ZkB64<59evU zk$oe3BRs_n(HfjP+LOA&I&l9~!!pk@*0Pp-8fR?i9b9>=kJC7QH~a*nVIuhc3-Due z0^@q`Y2$fwLj8woVXlSd3l|*Y3VP7=AskQt!gtKMuZ(Y6udJ`bg7AWH+i2V9Veo9r z8K9Trvck&>uZBxN4{dum6h9On0L~h4MwPw1&Pp-vX$!leyKok+i8h3LBlkw0hP~mv zVc${+sb@fUW%%U;Qwui0-90zJoJ0d$Go=@H{)-O17uwSHKWKwui z`0dc!q4zmw$0GS9WiKhaf!^vv)EJB%GeN+?A ztx8)3^*8qmUw8M1e&GLauZ*4q{Y=Jt`W>2pajff^F+vi|#j(-{a|zU!(xCoi+~{Lf zM>l5jwf1_{$F}0giXgtgo*S%T?vd^R>7(gDXR=nKZ_c=V2>ZM|5nL;a~97=!sWYw9P0 z_0^A|C)@{q+y=&i`ib|18jHSFXJdPxj0V5%Ui>|0`!o+V4_zF-IGl(iBF03Az#d9x z5VVW8W76)`@&2$2oNK8buIK-FSRGp(`z88I;7c=(`a1G;q%xcWqp1HKVrFZy}tC9{(+xK&$n@v^-O!rTyH<&Tn4p;TA&uCXW|adQ@;)@=^TQ^a2NO@ zdr!R&`bNy#)VRONev|!-eyvW4P6^K+@?7f~;Jl93sn)55>4oXena-KZU?;TYOtf7v zCpRY-DhZXW&aKXITb7t(SPxwa&%;+xhx5f<`-b5U9}hdB8}m!@!I;VCxGMfpYZv;~ z|J!S3a6Xaw_gdz$`~Bu!pF;}Nnr5RhsQ;D)<4pg(5B+Ub@$Q((>68U(=_icJLK5QLPD_PpyEGT&6tC zOwCN~0k5Bm%&f6?=Dv3mQ;79Z_?)+eGjeC-7G@V_YvpR?-psz4T?5DGj?WE-E1@;G z_RWH-B~^o%>1Jm3c&%R#uGb?$PmJsJUe5i{Lp%$N6YZn;5zIwT#*=5iqTU_-i{69Q z$ZCOc%StPeXE&AD(m0cG2 zn2evE1$_#xFRqDxY>=#W?Rsz}_}sb%xhARKT@U`=INVFG&0X{Xs9&f%sZBMf|HQm? zF8CV04*IsO0ZfJ~P_leYcY^!+P|$186t8-Uv*~s~Z+d%w!^7>~)X>OnRe9+{qbmE$F=-ml~J)3Y;+!XYkq^&@^}uAHm9`y$O#OA7%!j-~L zMxKmxh;@j~E0|YMDPAf5CUhw5P&gK*!er^WM7XI4E=t!^gu zcXiZXU=A3&nmbshR`YQkcfGF%t~u&K=6!d-09XU>!79+(WXyFgzSWv=Co~3it{=d) zOE1%D;P+UA8V0UoCoylNCiwr>!k6icDQk6li|(c;#>Z*hwFZ97*TBBz99pzm(F^b# zd`h}$n zORvVQU6d`#u1T*6W-ZN4&P{fJ;fdi16K?149z1;T@QuYc7H@`8&?wO;aW;Gn=O@n( z&J-V*8ko8b`lS1CGQsHdMi`nI$|UOVf-^rh;N@JJUYeekn3kvl{+w~zi1dhbTl^-y zvc0k|g_%cm-O4U;j1#*I;h%!_3cVl176Q3;#RVg#h+7u(yKHD ztozl3@2G!U`+1%7Hq8&0gF%=6^bf$_XD;crS~AW=4nH~;$cQG%r~0v`rVGclZN2aviz^w$V4S8uUO91wD7(8_i%UsDpU#TPORGxk<~y%feCK?ugwHv*)oK z=wnL5&9EBue|y%Vex}Ewk40~e-5fl=^O%QsE<7H2JTe}7hkJ*OYcGKW#hDMm7}Yw6 zv35_W2-o20Fpm73xuIX-<@G+Z)?)4QY|!iTI|{asUyql1w>q%7l6jdil56%0pax>D zwHD@qxz;536I@ruGaIow=z}z8dl1aKz6A3+eW%xgIoXe#SJw=d(%B!SWPmEpntZ%ZLHbRxzR*eb8^-LUB9e>e#|VpO4L-X;ThN7 z1l~*fo_rlD;A2ulat-(eTwA=yegOS%?I8_Q!Fro9r8PYLD=&eyxa&Dnz&RM7(68n9 zT00Kqg@Rcpw|V|CRD?S4JhTBdr8DWlQj2+l`9|&o)@-a<>LoMAtO?eDrlh6>y(VuZ z-(p3Yn>-O#B~~Q{!41#_UIXX8cy8}5cqa8s$}v5eLCr{g#dt-X`)2TdH6AhkxfS+-x_8krYT`|@)}}|rHA!9R zZg4FqfRW5PF)vcHegT|?v=wdw;dL;#;!5X1#9`s8O|`houVK z4c>!Qp#fYAB}YpFO=;NCVL`k3Cb%{mAG;^?0sF&m2JabTTJ_ndKy4&Tebai8`@VDG^tb5G=>X<-YA?+oSDND_ zy%z$1#uO^vM5t(tHeho}48t#(4{15*Y7B;WqrZ4e9MR9yYd8H&=VK zUTfai2;KmF2|K~-trNJOt%ttgIu}Q$djcjyIq>{-pZs#P7V7R(pUeGOzb+$mVDBU2prtxuCADPSpX7MNYtBUKjS`KX(mW3eI*q zL_et-l%Kx`pTg5%40RQJ2Ty^uh!SvJ{)cG<-@(sd?DP(}E{%gJ@De-)>LX2{GPqWm z^IZfpp%99|-W0W6J(ku*ehL2)K2&fh@L8+jToAh;wv<`_!y>~XdZ@n*eH$81Prh1l zYd}6I+n;mX-S;j4^@WDuHFX+Tr_p;a=g+_CTG?9JQILR*xsAEr%=nFfF`F8>>z(M$v>xkvrw7vd zeqB&YY6hR+|8^~Le=85hQLSJJs3Y7A_Evof4d|EF)AJtZ9a%$G>$JwBo~TA;&iocw z(^ALq`mzuGBWOln-rJyN^$_zZtnKb$M(Xw1>$8i~i_>qX-cJ1w?Bi_-cfrqzpM%*0 zCnrzF<#biDDLf3ngY$WJKx_P#?xp(G)@IgbR^mq+nj4zC7F+|pCiQf{e@OPNY{SEJeYl^v=I#L!+!4tKRvk=UI)-n&^doWk50hfaHI@i1w z;CuJt3a}jB2VqdIJ ztXI~9Q^9@4*!o&f3kidJyxNlf%T>%$8VlA^Zh$-BAo%abNNP{|=**4n{hbe6;Yqj! zjDL+0^kjAhV+K7_Z_$5lt?g&146oy(^cpXOD>7GP4kr#L{(^q zf;9!ZW4nXi77a<8Vw*UDsdemn=o;-Bc$NNTPSc9eieTRRV@zSbmR?G0unWPM-ZyJ3 zy+I$E{iJWflQ0_kz%;z8#slU#eSu{G#cWH^$8!fYoC^5cdjYaX;Gg^gkA(5lMfT2u z>)9ImS7w0wu(642xUq@ep{1}L8sq=EnlqfN)t7`z!c(JDqd!J|}%W#uCYx)FM+X=v5~o!(5ZvkbVl)rB9a zy_iRiDKjSMr83^P{_Nv_mA;z$@j1TAnd|!brZAi7-t@icw^DDV9Hu)AT#Gs+Is~4| zI*B@ohoO41deF~epNhS|&PI3+tToI@&q>$I)XUU{6>whmyr6fk4f8W2rIA2$P_MJc z=y)(*G%ob|x2~*C=rwURsG0o&IrxNg-WJ2}U|)YPa9=M3HRETP<6*sXL~cZGVs>Ko z#N3Iw=c&Eki#E_6-;O%oqwomxVjh6y(2;(B<80%VYRp+OuKEW`@=Jo*DSgQm%QM5t zwW}gr0eZtff;wP+pkA&g+}u%}=_MF_tdFl5xuN+(JI?9cRCZI)!=lf?@Av=F7pe~L z_o%)2`x=64sqvHdt-6z5P75W!G4nD9YDMOgL*TW%*8&fMd7aOZUQYKX<1oDkBf#s| z=kRoR6nf%aSj!xgu3%kv1uO>FE}wgKPkjxKa&DBqL}!ht@yv_N<1~Sr1N~|@zG~|V z#ykC?IvA_n$N3S~Rvy4>=X3tik&l9!o!Z7&`q9;U3dpzbU|!tioVosI^v~#^*r3=W zu=W`0W%jC!0zCqrFLx7Ycq@t(#lDDs5$y?Q!|cfH$Q$7|!fl~ARQ&&E8XNm=1M_HK z-)pEnyq)*9QhA=agSxGnuAUzMM*Gb603mST^SXwalJDYY`U{=|d+4q@hWV;B_MG=^*i)|H&A+Y26m=724rq(Ad_9sxf$PHG7M zGGk7UK>O16LHubyu6bLS9+4M7Ezh1k#~J$rRI^KQlWsyPW>xw}8vPx?;#z9-|Vmq1^x``$%h9{fG} zuUdrrt+l%S&=IeX-kZz7JzxK_d%gFQb)@TG-)<)u13o76tGdhpFNA&IW7`hC9%(S1x93RB zzcKY@AJc5`ah=8)XXajmnWNSjPK2|d6||)XP@PhLWQ%x<_@1IYMcbe$ykGc!;Umy1 z-Yfob!N&#P#=Z@DJr_n7Mt_R@6qx~6z-7<`+-r=(o`nIS0Uoy z4D=RQ^H+CLk5aQTKH9}B0`*ka4cCxM;7!gg*bn1jB$UlBn?Hyd{N8`>fNSV#>Y*{*E2h>2!GmMMv?ecvS(4Va)@;Z2rZHF^JFPztjbs+aA zYrUd3+!~qJjeWxI{UU?|i_M+fkAIz{AUS@c3cFJ`6q|{@-fN#N?)VZ9YV%^>P z;$QflBS#}gcT%4>?r979^9I4wVD9C3uWS^7px3{tmQpm3BSS^+@GV<i0b! zjNjKYqtKd%b4iS~)f=n9B`^d}(hg=b85`)qdKL)RkNWo-EBTrm4~+pz(x@({9@XPi zo>{#5HJ9OaGHyBw#?xLW)-b)-?SoQp>JQ_=``)_Vo3I4Ffi<9y(T_LdS5ccAL~r5s zAO#9W*DDXK|NmdEw4}6jQ zBKbh-fmAFVOK*bdoHbKDTb+pmt+RDbfIme-3OEOnQDU`_E3NWe#BKPuY^j6qyKa%eZ7K?8c;^s02p?-F>jjYWpR-_(VT zi(D68qPDP-na*`N<6}d1L*NN@pR=~E{_z?fs2ID9s1Hl@GG1Dp- z4&~u4uzqkV7zbEy@;>u9`T(ATrC@A%0~qtW_Giju%Dj^IO5o|#cUw}XgzD7i!J4No zR|Mt))@8hwT+{ULsArlN#%M}&4SNvo0kvV*Hhn%bAk5pk*t*#15aZ0;s&uan3J(g8 z4~-}4EFbdmrZ|`LN3hN~2h5|UalTD=wCbNDKS!Fyn#I($6|*ldyxj6a;qLhEc<;jA zg{$MM13%OH`1<%ga5?lU=vB}GjHR6GG!Zs4XUP5OP8fxsX?qV{qN@*Fbn$<@aNT^ z?BiWXE#272SgU|$8*@ivC}*{qE2_;*geQ+Y8EEt|`gQdo_;aT-3-2Vbe%gpLCr<^Kb`)aihQAeQPcp z2G?`<|AwiCsf)qcy8YmK*qYdySPspT&6EDEr@>#zzmkJfgH!d>_0tQWJbL=aaAx+* zY$Lc2igHD{MerHtw)nbPN6TwdnIzNAp@XpK+#~nm`lK zcWvHef5@q!Q-iY&JI6Z5_^*l{2m7Qdf#a?HFEb#_deGbV<-17wE@>2_pp&r4qTgElid57 zfWA!o8q|figY_Z%A>70LTutR6dhtKQS8gA$*S;FYaPS@~0qf(=3Hl7wkgezFVX@x% zYv|X|-OTSE7#$eY>eA6P)wcQ3%Rz1Mi@Y!LUS_U?dYzy9Gez_X{RFRb#>)_x9-6MS z6`X-HjNa{LptflKttMHWb0@ko=W^&V+*_=DRHc8<2V*_^WKiQ%pEb{4N}ok->e~7< z&Zi$kZC5=|-;Q;Fg~xE;e;Leg^evhjn*Xe&2ilzIh9fr|IgI&O&yexu3NY5vQ>6B6 zO;l|~f5H~#p^V0#t-r~9!?nbC$~DM%3#;)W zy$tr3+yKTwYU9=q&V#Gredq^1S@sN1fVt2TJ_YvyH9hM%er_yx3%Ev^OPp!v3tdrN zOS+a+$yLeek=V+NCC_+zC;3itBe)h_3tPbRoz8;QP%c?6SrPtC{F`vi(u2_jj!Pex zj^p1u#F^rcW*!aZH2swQDcdjCkBM3nf;Co8{$X&9GAEu4#?9soFM=AtVldb9Z#Q0X zUD9i*hT{G1x@62@-uf)`$?p^7V8$crI>s;NYUXWsf!g5)aNqQMXToYY3}fI_@OsyO zq&8jzYpCyc12txAv(^{8g6r(#C6AZ5=NR)g$N#e&%!$1JjmgZ@+>5QP8T;ge*S__B zeR%phjlo8PUW(1&-|X7=IOu6`-7^OCz52Vp@!RR8F_$a{u9Xu(eXKdOf%~BcxP~Xe z80&ewB%7cw^Y8RYsk58^FM*k0Eag3C4bZ)-v`lH4Q>m%=+*`9Up0%c13(UQSf}Yru znFrj76=37~lHbPtBVe%mq?sy9e|ve*r8}!QW}#YhLmO7!&b3L5d^57cy&*~4OuQz zF7t8v<8%rKP4tbXja__99*^HSGif2KQg<*mci#wY9ob{Rc(yXlu!7n_lrkz1Ty zob8B5<>Bt@2Pr59bgwOj9U0J&@I1P{tRZDUkEGVGkp3tg6o3&NIp$k z>i^H+uj~tJ%B%@`o!!6n;;dj+(|%skhBz-~F>>|`htU**^7K$2iQ%KTNRX|^gy0+Sjd$h5Y_py4Env3!L zSTM(#0^TobFXKQjfx4KQzpu@c;U~kdMqZ7m71_(X8#=~2#-D;YU@wa2^ICYU8?PJh zQ_!cNT)bT1WBMreQEX;(W^_+vPvkf-Ued#%XN&S<$@JXx+*vS`Uj5$i9kubdsVjO< zTPxdLy1R54`bY~fC;Eo-Nc3B|M|!WTp%|N-4eH}9;RzTFt^<03)PdT88j%{d`;__L z=k)CV4n4r{J)c=`u5o%&t$q3XjAx8Z)!avbe}{jUKWD6^-t#fICi#2)n-+k1lE2q_ zf-%&&+c z@bP^Z{V@7^?Dg2T=(cD&lIDbn(}J^}z5dNJeBP~Rr1R5(p3;IkwRwQ|wB9@S#E;8- z99+xB`Nmtf0qIiU)3h$5uVoZ{K~Yd6?ZAwu^GePushX>r`!@4!<`?Gdsx=MeEZzdR zEOA+44yY~N4VNY^b=+yAZA?Q*{5ajD}{b3yMw7tSnr1kT8uk-0y6f3`8RvTDQ4 zaCgbwCAWe#4X<1G2fg^+LA_}>HRJ~Pu`U2>-^SDX%Iqt13p2CBFbn=i?}_)R_wirg z{cbR#E`1T`D=^mAk25}hd{8SpkvRkdVJkk%6Yw1w&#MJZhG(Ems7&Bdn#pX-C&1^~ zIO}0h_qhY~6Zr4%;YsQMOF=I{eP{`;LHY)+WCre6%ud?K%+ht)b=gQRl3Sl$pVea@ zqE7DK>piS4XbsDpz%}|&>SbOJ`e?U;af~`lJ!Ywx!x-y)3_ecRvjy~}s^_|{S+7)g zY6w%nI+<&{AM3N73S&WSr5hN38o$lOV=@oSWqgjSf_bHD-kGqQIR-V*OszxwSI<KnYS{~FYS@A7GX_WABOkI(`b$MC@(y+FsQSu$yj%Hy)ce>9Mr7`!bz}zd2hSH zyj49l48~PULCwVXTfzRp8t@EU3eGaHHZTgT6`Tuyfx44%#AN2|P5|qHKQh<(1RPRZ zP^o?cy$NdNkHhU?EY}6}SKbIuz%QUr({=BDXa&xmQ1>?Xv>#<6xbL`L8e{3JbPZGU zcl|OJc2CM2$s93ua`qeH(vfPM7pmBy#%+9DgZ>nImAJKnobPL9*6I_p2BwzZBG)2U zIbAtD3HCtaY~yUrT+Q4s*4WqK>AK8)csToTa8|*$S;&2x>qwv7nVffHTxwoy zd}++=`~)9^{v7iFX9S%^ZLS(D0=3`~@D!*ie+VbTiQxM1515act99e7poicL_yFdC zZ{~JC!uz53gI<&~IXAN!TnOW!Iy?=2d^RlP9L;~=e$Ihf5LysABYZ|UKa?M88g3eP zM$p)DW6LcoT2}OB;g^LMLJ!b)T2dosZUwg8wP%S1zd8B4fM3X2G)_>b1Fh57>Jj)kQ#l0UJv~b-@*v^7tAB4 zf!h6EdJ#VXy(8VqbPN1(&G62t0n8^avu!r{i)Ki`Wb02HY#!c=+6G6Sz8ho0%t#x?!{nqpztIG`z4G!JG87u05 zV`5`sgl7d$#Gi=QEUa00I&6t=iMK9nUHDJ@pFjh@Iev4z0!%2FfD7~cz*kU*`Ek8q zYjkV$@5tXw;%ypvkn_CU-(TkJ3jN^Dm1xF%{p0BcbzfeeS)VySdp;eY3xoNq=Q6K; zE?iV{QOV)l;atO#hT4k)%{sp{zjQvcBaf%{e-P{+96<$tEU2~J3@gFs)A&+-Ngu+A z;MZLbjB)gKy9O*hveZ=Q$Sr8@_M!EGN}zw$zt45SI@n(jJsLe~%;q}c*ZyHnwLfFr zq%LoMrJiI>(KSGg&>CYuNP@5RlidFNT>-z zm`i;*7z5}lRA(8?Of$79V^!CwTe7!gTV`5jZcpEywg;|TvRm@X#FdGS;8`j)!MVIu z;W^+K3%;XUaxdHq#!kc2!vp{6(#+D#OYnI1aVo^y$nuJ_TXI`+rz1t>=rBLigZn?uMluHK3ul9Ch_R5` zv@wr*j5?@VlJ%j>!CIL5_9)m1`Z=$HyWuUk9bRNkhgzU9me19nV0^U(vhWAI0kgp# z;gi7H+csw4>*4GK_P7|k81GDnn?U{1^Qv5XFN2@x3{eZ7k)4r!E%REYZ?7)U~`FbJNwcjKi(dS{nb85$Sh127&kjBg6w%$WgtqkNsO z##>njZ^fs~T~c#Bz`Sp@?j-oy{|e?Au7PU8?@&|M$LaoV>{g7w^DFS{?iJowYEWu9 zv%q@9t>DMzfuh!=H)Jtb8#i9kOXxak%ws!8<#@xny)+;|{R(rE_v$VZ(_U$GQ zBo92X?}>etAOg?qe`fzx2d+9${b2QjOJF7x9xgn5O7ST^9mSr}YwV=g=~{XXqnT)M zR*LJJn)lzizjISLAEE~{uhiw#%X|#hW7WQ{DRWKG-*o|f4@2NX=mQ%;kE^u-y%>Ga ztL^J>Em#4rE9O>hp$)i}v<$a2)yu1wXYAy@f1=o;6px@b;yF4DfmKK9?#SKda)QNuKb zmODst;C+R13Uk4WbRA8)F+|dMoF^8}T>doeMh`o(m>b)j>n8 z^P5~>Uh?dM*z{Nns1Ek0w2!urz7TmKG7$DMo9R6`0Xl^`p-k2fIbYy2JS9!xQuq@s zWDWVV`DssR1@D0O>S34+YCF@YtC^GaqkeNz>ZFuCr0tUJ0uA=J)Nk66Q@xm{-#gPg zvkFFMM+avvo}4>5R}nhHUZ_-3sbmfe1A9=mfL=e>u+zac#=6`R=ID-MR_-a_=VPH9 zsJ*x^{R%#>cY^!*F!~+s>9Th%4A$ftf;yGD;7?#by!o_xq5FvOnCn^t&gk~F-+-sP zh&e>-z_rIcN4-uR(ltdN#U}dSd|p~m8{Pq*!VlDTy{?RH-T>E{0q_z02Ks!}2;7U0 zqxVz)&xK$=`JV8euruFp1AEb@F*mtKtVgVFv~JWrLvM{5v^sqiW+t@Hwa+;h;Dq!E z>C01>r>+8ZaO-fdCSK*_@Ue+oleZ@S;N0FRFey1HIS<|g{ojk=qx47VewlumYk_ni z(+J-{PZ*mU8+e)YJuC!uadTtiee0-R*FLY_Pu6OiGbhA&-~iO6R;iE4y?s8ozjXn9 zj(SM{2l|^1!f$Xb=wEVeQ*Tv^>H&2^bwWQeuSuQAnCMkzid(C5&C_3L3|1Fb!gXMM z*}9!SuXasH7WA&%d#tzj5Pfm>uIM9}ik{=&;Qv>UUl8;_`0-vamU;>FK{W=~+dE-6 zn9tn}EzzrHmYo@#9qSscZghb2eOtjedfryz@36OWb9Qqu?`INc)YQ(_&UVOk2z(`M z-#MRKwG3-E<`3oo>UW2Z96I7&px6FWW=k9Mxc(Rmxn7y`>F+f5@_HBxjlp%x81^L2 zd@_!(N5h{}XWB|X%fArA=VZ;sd)l9|uHnZw9;@f%j^+ZrNln@N$DG4lUhUQT_QlMM z9z&hg9K2JsQ`9<}^Gp;wgV>0q^?djR?ge8a>tJRN&F)|Q!etHP_o)=#R# zOZfWLH0?E4(|r%mt9q!jXU)xwN9;3kE!l++K<|>?h=%YfH7Rv+Yjws<*74qj@8Di| z6rO`ZXax)50aymsub%}!4j%k?=aS1n)C* z=t+rv|R*2!G^9)M1u25M~Hmb2kng1%6{u6Ij)T@Ah;d=0+#&x5n(ji1a%jfu?< zC&5&(r@-swZ)Sg~Io%9bLIqHRu=c(Zeg!oKW2es08@^+vh<}3`+E9Aj%3#P_m0Fd$ z5Y)GwA!`1nS72B1uHspTXC40e(9ef@?C-Jvtbfn?*QT_m;QjsY??3I}X$Pmn^M{{5 z{C4r%#or{pNw}`v!a3y4nS1#cn3&Fm{<;1^9^ZyJ8F~kN9rbi92ECT*BCgrnz}Rpj znAa_bXxV7c3-Kzm%p>`cV7}73%u8!buS9FO5Zc28P@mciy{YH@%lW)rn6tYS#=;Q}B?i@|(OuMOqjU{2Jt_!wG3PjG!w zA8!v^p);OL`${V_7ey`2`0RFO?w?V3M&T&tnJh0@Uhqonm7oV~NOVZ_NoE(_7ru{3 z@P%+)Fs3qhb$uRjjA7)tJwOl6v&Uu@7$;u^?osA_dYP=dsYm__dX(HRJ;T5?Lk;6{ zc!B!3epB-X_Ymt)zD|1i9srBlYOH#Z_4ujncZHuzehzBG&FQD`zG(~tp$QCv^Whvg z06oC_aXjyY3_14TnW$O zg`No6(yS>$Q18AIf49%aD!35Tv8_8+h3+NYOP9n?G?NN9AZZk+C$>6`fjtQBpAA&{TTr!!+%?hUZ-_ep36*Mc$EYw$6smHXaY zQXNlidj+!%%pt8as%QDP*P|!dSnEr8AJp|$f|}q#uqJ2jt&dc%z$4(ba4M)}SB0~| zTua@_8k%)n^+){%YB1ibtw0US+P|7rZM*=+W7dpM#bamvS1r`|>NR*D)UJ%LdO;*F zlJ_@fA?n-H(^T3#u54T~6YL+ghO(<WLOPXB zwN1B87lG$yc29Rtf0FtnRViI5{SPdG(eN*vlRYQ!fj^RcB+%a*8aM2e^&Y|y3aeNldzUv>lv^;yFFVk zS1*|Dm(68!t{at^JLz8D48M)*ll$xrNPzl-_o{oXuTgEd8r)xdg8Hl)n7yv9apoUW z;W2m$yl*}L`}CILQEx?kY$tu)pG7{4+!?zw_8~Yk&Uxu4K<%R1MUx6A72X}cJH7|h zn3}^0Ft%W9FdzKS*q^bp;BM$j53d?*btoSxAE^RM!%M^ZIqrc0V66KfJ~I6qzTW1( z_IH`bnSXfi80*ys`(sCe`Row1GGB*jk!g`7(Ivq=gO4H~MO^#734Ie%YcyVO0UM}U zoB&>@o#5@GZ&SUG9c|9ED|>NTqUo-ozxOpLi-EVeq&PVHDOMUQoyi%N##1}tJ}_P~ zj@k^a|6NMDlym^^8)KmsFamyn4><$jTUZC}p&R@SXVK$l{VogsU&c|!Q^s|#LT7L- z8w%Db%)Ncx?T=}Jm%-OfT}%Igd7(Zp*Cf3U=g{|kFPP6i4&%W3U1v~-SCh1tK>bN= zO6}4$%UX>0FgA^#pSLZV=++}!j~Exen0qmIYxdTxHU5sNj;U42Rmpb}?*wPgeN_BW z@fi3L^jP+TX`tS1fA99h_C$qbh2+!lJ-9Y?NOuT4R)aXlZZzBiJJLJo#``vXP3oGI z-h(Qj@4zz*9>zaaJySh1o%85Ur1!QH_&T^h>FFrsTp{bv^Ef*t1@@QD0CP0;m1UrB zK)<0HLOc}b1g1*^-_vs30>(yqpvuA=cm<5(t&I%} zDRr!;pcb4BYDmUZ{_bRc61VIR`F?J!r8m>ua2C{IPU3OQBfk&yH0^>~VC~)WGsaMi<(AZXgVl*$BM~GUs7d;u~Igf)m`jxROW2>X9 zqkAKJBXwa~cv>(wSnbTXj&g3$$6_Ahp7bghi@J_^-Fyb>6~+n1P_8Y;GRE-6?OnhE zlJWjXP-`{Dy${q$)P${rPY3Uz+MFFS4R4|Qy7$q^;G7A+$Nch9&OkITo)nrCS{_~= z*5|z&&W)YxEgW-xoM)lvar!FuRctOS1!uPWN&oMsaFjyfqi_R+gcr*y=cbXm-8T1nhMqp?^$(k_fFSrbFBif z$12G=bI-tYU=QFAuo{Y?LP-TqhC8vuuUp^y9kxQ}lFlW0xx8E<%+AivzLI$*Q!ZUD z?KjnfYQ@z!iD*l)Jr}>hpwysLlXR2xV$PLnpKYK0EAv-ymS;Mf&bG_7gTA$J*qkm)>SgTW$!oAH2D9;7gnD?)mj2>@eCwo);-bt_!R=~&b z0}RL;khg)^yKvEDNN^9b?qTk34sXn54)5%RJ@lq}y-fkHxiz5fvk~0yf*zD3c}K3LZ{*J0 zow?Pi)u{!^1xdBuWpGpaCMFBEN%zn6=akz-rWZ3uFUVcM>CX!}*?Apq#_75DIhX5e zP}?{J_M;k8En{ApHKG&1b!`Ci6j$RLG#*yFb?y5O%rh){)uyM=oON1sTJ+)A!?BkO zUM{#Oeo_2K@Vq&N=!M|v%_ z(#(m({)XsiTR%WP@}=;aRsO) zScj=k|5QiVi_YoSDR%_D1oj%}J=bFrFNv4D$t>^R(!T}s2AplOII%dv$oRys#lIG( zUjWhL_8Ozm5*9zjelhP-p%R@4g%IFa8+OvoS0K3P# z$0rv|E_ev+m$FxC4(A-4L}b;Sy5eonE5BF1`Ky1E|DW;MX7r!4!5W@1)k|PZ|2e&1 zIZ)G3_q8r<&HGodj->Wd2ReZFjJb)qhPslkw`-a8t^)i%<~_b%*M+VNZQx8RU3xdD%e_f|1e*! zLTQE433w?l1vQQ&s4q2#uX11EPHd68Gka(D&E%WOmBlNI+b7y5MuB~+^HTFtbJKIv z6EhP7?P_FpWcF%!8Sc*Aol8TNk}AQu=st#8pyzQ2xE>iFTfg)5t%C30b!afShNz{u z=9sG)GtB1v0{0SU7N}po4%SZ8QuL_g%H)F1gGQWR*dJDd{jcYM8mP6aj?fLv6K;nA zp!Tu@E&})c{dimS9a!J>`BHm0lV05Vnfk$;%d=8vr3NJjC8s8)Ch8~aC)M({!5zsv zlH;Kl6s8J;nUi=@LFs6XUa0|Ew=^b7TJ>f3!elkA!iCKll?bh*j!FNy>57hR&?NquB z++8=fBS9t9PR^Sq%YwmuxG?U6Yi&K6Xsltz}U*4sQ`2EX+OfbPiKH{ zcfe=#n5b)6Lo|k~$!r2+DDzLkc>cPdnEKZs(3aG?TyOe=3*O!E-(#weuhKe&nzk{c zk8@X#u)o`y$<^trm66g*@v?1! z#q>T6%njtE!PkO(<_6}!rkL+z4DV~;weSJ+JMN9%8y(7d-(#4wc_GY<&y0@+W2R5Q z^HaWrVeogs-@!UXi*mtnaC_|b*s|!dz*njEb0wG~J`egy+QByFH0@_rjsBAqJ&J0J zYv_qIzf~)A9sZO$xVeXZUvmNTJG~Q6KnpNVs>M8i{YPKJWt?5?dTd_12V9fyhL<>l z&pg+}Uto1l!F=wi{cB&(_r>Eba zGhTZgo(AK<PumYEsU-}Jm0 z51I3|17m#mzMna}XFg|hE-zUg%=m1@I zE^!=@QN_e2;HhI`T%Y8#P&-vS)im8S=%sr(^K#~L=m3kdi|EQ&pZzuWYcS*UdHU#_ zQKzp`pN!gtdYWDt;~q80ljvoB1xz}5%Tf0A3#5ZyP zhBL`m51iME@wDF5HsC$)?=s$a5!|CchG}pK{cSzrJ9rmX0IhU^Py5Tzm!S&b3gQ3s zDE*cb!CKsQcpXNBMg-?V`8)J*TE{cyQWJd$&I+9s_^$ljcfn1d_G%2(fL>i|ipEUq z;R7%iREzT8eGaVWwFULGWz1W75zI^b!#Hs7X$?<64H&_kxW}M9?4&cGHXh3)-FAAQ zT<5HDehd3Sec&lDR~$;MSD!+kSf5zMf{Fzf#V(37V-R=xmU2J3MTL20BkvM#(XJO;YM zF3#z)uDX|A%l_~vGx}u)0zAEyUfY$%duXk&f+!V8odF$Z%?5b zGY9rUmAoo>dc%wxywBXTr-OB=d0;)r{M9&PDEtcU!)w9);R#S9d4riWx8afU8tTYA z67{)_*^SvGwVUJNLa3RlnQEMD%*3XSoN&U~D9qb!kZcfq?B~wL+YN0}ZGzd~{nPz} z^G~KQ7qe5gQ_wTEpR?r_qDfp(@_)FOxHj9v;PtA9Uj0?y!zO07Skv~}=@#o2`#1h? zaIV-b@mu2h?-s=t#V&)z(Z$hM=>z={9)mlJ$m z4#%5x09^OXi`1N~r+o!iG4tEk#+*!D$y%MSnV)wjw|kP>oBjXBU0w3JO~Id`Y#f~B>%W&dTIQ%ezb2q|*c2XOCdy=b zy}afh&pe*--tZc7F2y2PkXn%13!h~^%W&(IyvJFCYW|<+f1ZC$_?ob5;vD*@op7ScTDndj8+_4@oc zuRqS{>5S+3eD3?Y-q-uO?w}XD6h^}H!{>*shg<;H!DP;>cn9>C=xz0NJ`ap#-51q0 z)$Q~yTR+f;XuVGFme|YTbLHP(6|B*lr+$R5+SQrwr!4UdAoFg{nt5*xr6pH#ZE8oK-COt4?m&y6`&fbqZm ze%2P^*?4vzo}(?PEp)=gQ+g`xoAbQO>V?${zdQQf(Zz*}gPPq(g&zg_l3tA=&^6gL z>AYRnDbJs2kZzF9=kSXu@EzQfy$7XeXBPQ|3GUAnyEnKd>*@Czeu6$jV@UG|^%3g> z)*bad90F_Z=1=BU-si5l#uiiIb5PGQKlq-R|E?`Rg7Jm__84FdA0FSnwKm!@Ghg z=>a&LcR25JIGuCNeZ0AATc`!bU&G)}@c&H!V=nVZwf7p#@O2HX--Yv9eun-O~i`-S?2j6GMDSy{&T%{qpj zjUCkG^;D_H4~D*A9#Ftp3gTR@+U{UWX##U;go-(B6`_{Mzq2C%oN3K(yxP4|FP zpaYD8IH=Q^!z_Y6V6NK&jK%yp#x1=-J=R+1=g^He@a(6NhMQ!2+dZ>M!{s3oBn9~ge zH4Sr5?-@NjZ9pyUFR-qqMy7Ur7H1C3FEc;rm%Er5+h4%A__+AWf|Uhl!M6Nu`8A;x zc($$A_qT99w28I}?wux)CXv^|uZ6FK)uGjNr_2o<1@p3w;JSg`EiVoIp#_WrH41g^ z{qPXyuc)P)UmBOafOqe4y!a_lx6>EqI`$R(0wIJoYzY^C2xz4BTh%nas7Jjz*Ct-$M|E}RdA#|nc!Z`W<(La&$Zuo3Tx&(#803VJh* z%U96H;Cth?Wz6sLI#g3PCeYLH2!7n9*`?W=GB;&rq-Ugi;?bU%oS3W)1B(V0Md6OZ zI|>)VmoN!F07}`x%mKC}Egwcgj#+}?Y`yw19;_lLf#+rfO(y?Z~H_e_SHL56G^5&D5%r}1FjP0#j^oSl>e*KGAGy_o8u%c*TH$}P&7hevbKTpIs~wQ+NB z<8ma#;5=&^7l5&yYm#e~@3%0!tsP!Xb$Zt)=jECw`n&!N>Nn7Hp0bBKOa?;rCP zwN_&as&O79Ei zubVR*L}Qx|e^HOKrhVwxp<~v*{Tsd4T~FQtJx$it)o!xXgpKd@Af5$k+r~x44#xil z(6_j6@&4TYz(-*W;^!ZNG0&6Cqm6)G8*|)iVM}gH?oqgdvz_jOws1F0&P~oufhKsA ze9W(aj8>vnWqs4!cQzPXEdh0O_xlv*bE-w{5$2b>u9{cct9L1wkDm>$kM1?j-7+`*2HoH9pyQ&ww+*+k$61ttwg-=-*S5Q)x65O?IbV(FdsFSH@{aWaNTbJ#!#*?CxY>Sd*5OD z6K2CR;JQ*wt=v8SI_8VjgNe+Ab04;^(RIcel(B%ZliI>T@H#T?HSS(QFQnJ5xx}sT zB3PqZ4Bi_pp(B_NS-bv{GuEtGxCcK-4f6fG_wz>Lt3H?WF?UI9S8QW^V|*QqPK-`e z0ee*T#r6efgx8JMjat`Lb2Il^OD)LfE)Vb5S+E0)OU-o;fw8JNt6HD_3fFDd@Yi7? z_&S->J;>~=sbH} zdmid1>nCqX-IBTw)HSb6Uzz>`CNkUO;_Su247sVy&@6@7@D%Wxe2+PN#vjI`YK3|~ zpJU%L-hY%cK&+473*O7uF^AYbl-ZC+4@eA*J*@X50($^f&(Tk)S?iY+!8eb7p>Tj8K``E2sU7dXo3^ zT5w%E5!40#i&w4NnOj2n#X_QG&AoVb4lYnpHFk@sZ1VN0UsqkO3bP_tKzN`cAc;mey#LtCEA`UJ`EO# z+e78@mCK(|?u>Fh%JwL`y-@x!shv4PQn(Z`rG(J|aHd^>%U z=I6d{#@@!9u2Buayv|(MISjMF*(b(^dL@hrHS4*bUJiN;t@}O%{5Pim$Bx}ma!1LQ z;w?d6$j^A--Gh%(qgxF6lOBT$z`C6M7Z1}*xDS@W9C#M=EzJYtDIcewNzV}>XAn;{ z;4IPe!0)>Y68OPf!>s%HwX)1ud8_!X;;Zq@TCaAGuzrZ`CCI6b>F$Tx^naZMPjGgx z@zaIOjB@?c193HU2Xk&?DqpuEC}nFzAnv5nw7YITWjz-_3u+#^>0)k)w5ww!BWs8 z?KPaBH%+bPO=yY^9fxLc7u16@K}~r-tbvo6eOmzv;o9)E;gQTKIRw){-MTM+mrG$V zq(B{G5v*qkf{Sbl<9lKZ>0H?J$>RO@MK zyUu*IchlZ~eT80s>I2@3UXQLfOY!-7KU$yoo|(1Ylm35Wr}N=-@LJx9pVB^fHKo%* zkL7%53u?9I@V>bo8>862ALh;ZZqAAO464Pe#b?7xAcTv5pZGqp5Gc*WBZ){tUxDX^ z2i{B03cACi)N!)>*jaB;LPA)-we|L z{0r3LjGwMxkI5XksQ9Adk6-|}Zd^jIvYNK_diC(P;3Tl$%p4#BJ{Ma-ooxe{-|7+Y z{#0-JiO9*XyB-+JR0eZHwd-~;2<)#TJPGtAdlvma>QAnP#$&g_CE$MNeLNV^*-6DnX1hb8e5^9{4xB7k&u+5VC+gFK-^F$DSPYz3X>22l84spLhjs z2lr2FEXIC%jh@dwpRJs!ocSpAQK}Z`2XJ;J(pKSCSPGu$Gy%F6buHQsi=Z?T)nz{9$eA-MNCk zP@jWJU~kS1U_G`17#|X9m2#gS4tjIc4b+fpz;aM$`2qBPyKbpdyH;82YKdp*f1t;% z0cVBZ53}HOs137WB=mp<=&kmrJO?+y9C+hJqi@ z1LL_X!SCaGYHjRc=m*w9mt~d(-mgQMLz(LI4X%NOu(fz=@dxzqTQ_+N{s!Z$U-16j zOdq8E5qE-d*I9UQtiQTesgWCFT8C8Qvc_#5?CWieV66EwxaNIIz0EaWAHrwooHM|f z$XUlnnZct^#hyjikmaD?z*wjnXJG6&zT@~;pk}ELuOnDbRU=j#)<@~@{ROzV>_4_Y zm=k17={?qs^XTkVIE^#itw;6`_YYsk>=VzBGf#^pVnj?IB{b!ChK6tg^aQ<^A47kz zr`Nd1nQ`%Q@pA7~e6QjI6&|Rtyxj6~4a+txdqKek1+n~CzV(qFu^ut=!{L$Pk*49M z!CZ-rXyeo9D{2VyIM3SWsW(0ElkkDh0OxzCA^wl^C0!#{(SvIoqFxd`77g?Wb)J9V zW+($4zzVP((Qw2Sty8@umOI&-JX_1MZRLaBILg+xnW< zpne7O3h&!J%s2cU)G5?7%&XNe)Gn;&c%8k#+~Mk}>Z#WXUn^{SwCT}CM;aZu2BNUy z@QTAn;LRg%9(fDSJ$mlZZ{c0o0Fw(R7dory3D8?G4hQ(O^t5y=6XSHu6M}Q*Dr75U z8|511j=_n=Cl+5tkD=@StH)jq&Yda5yHo_TVHD>FH=u_7D$K&WtPi>|eQJMEn=`M~ z2cTxX3pRuMp?xIABrRbvSg+a6*+6GgxAv_Hs0}q{hOY6CwFv8RJDFqIB;17479S0F zgG$f_u$qP*2mMfQh29GF1Zx+ua4hiTR%H&^bFhOsb5lUyNO@?*T&3S(O>9l<)`D9L zHbNc9CbEgM;Qsji@rtlIx;pwnJ zDs#9W@!@8`^(7zLgBrK{qc7s6cf@OG(I$5DN!lW1j>O!phxGA z&VLY^Lv3gZ_R|%{3*&FVRp8v?f9P`=3TMD#W{ej=NvMR$1HfFIr@%f*Yt_z}Fn1lv z`NaRj>t)_z4*px_w~TvjcitH{4J>1INJl7ic9j_ZTB6T(61HDdO z{A$$;!M$<&0RcY1Cqgp0$$-tiOX z-?;Xx?fIG=fj5{trT4NIb@374J?H&rd}NKT81{p`x|=|KNlnH$SMovufe+92Vjk`2lzF6x^ks*!QZSuTfO6T z&XVev>6aPA{GO}8=Mf1cdvosQ+%)E9n4`Owd*8QZ-n{#pI<~p7*O_^Y`;pgAbx?0_ zQo2d$Y3T7j#<<*m7Oy#LbgoaWoyD%c#^&=HvVMVi(5+@}t%D*W8Qi#Lb za1V@xngulr3iAu|J3s<{O#FyLgVZ`624ADnPz}`G)CTJ^JItE6>-ke)%wfKK z{Mhk8qgEIHnm&K^|1~fbjD=4F$_&N&i1cymrSLJ6nf*Ej^eU}~{%``b9G`=W;2$tI zUI&lSk7Ddo0B3@p0X1#&IqMS6VCo3g+041skm^BAcpH3tKX6U-@h2TWDVR52omqp% zSYJX=D`%|?9}ge*HT(viWnPm$L-pxvp*f5IYcUO}Vd<519UBci4MDBlx{SV;-=Goa zUU)6)70iNq_b1?c_t_4hS45m2)ECs$SKv-PwfNLx*N(-R#hDkKv$Z;6}I;>Kv+b=mQvXc*x;;N9r9J4Ydnv2mVX-aQjx)!}sa$(|ViQW!q)zcC9&u5c4v2m3<%LX+T1SO~4)9QYny1NEk_;Z67)UV*2e2iUK&0-Sa4 z<4c3N;s~f4svFGZt%V<|1w03OEx&{!wDmP$ozQ&In5lby_xvBA3+zbj2x{T#CmOmV z(Ma?p&MNYL&4e<+JYPLlTi|#4Le#tU73j+`)@%*N&*o{y#_ofYVFBy}eFBxiuiIbe zy=AYQ`{#pjBisd_z$Nt8yGQEd;T8(w9euxdfiaQ$wb!pRnA8dVx|+w&_>+Az9`L?! z&Vcn{a|G`vV-WKTbyn*#&PcBpsuw~M4*wAOA@V3aCLhE;h;`?r0q5>I=l)!12cBi> z>^OT@^b5H5d>Z@IGDtADxG+)}xdR%5vGU%~UKGT>LEo8r);9V?e}N<9|9bN~(DU;X z{tIJG*JZE&4)7kcl+0n&-dtx~OZ7GHz^i3^WBzI`r+#eyHIm|#fH?+WWNy;9?U~1L( z;l(zVGAHxncj3P{Rb9}yNnOz2+4!n8y^<@zyh1b!UBujD$bCSaVj z6#tPqz44a0ekJg2Ehrjw2Xh>2$?t)Cp7-i0rBC6cos&!F!5`?LCGZ*N`snkqA5l+b zb+G>T1ieE2AP>xsT7i3%*QVN84`wYar9Nf8q*mkaW!$}jS*_)Y%N38vj>z7SxgoO_ z`ok8^1aF&Zn>my|6x7}H39N+Hnbw)Vf%GMNG;=ibG-uB}1nTLr;utF8MS=H1k3yT0 zHbGybUNhHW^MDG>K~d{>opp`1UTa=bix|*)qWk&x^yTh@XW?}EG0y=#-qtSvf-3aq z8lS8|_cqRX9rP}}0Oo%K;WwBGkAU}tU$=L~Jj(UN|F;pwLL4fFDh6jjUBtN_`(Q2J z?0mdY*7DSv%mwtQiM7Aa@tYrn6r2y2!oAQNnt*wOkMZB`fKlMrworHVb^QVsgZcTz zU=BV7T%YH`aPYNOM{?cS3|@O)XX-(fj#WC=FV`>kTl%*^>l>6FlpdWK9eB&W&3>Dm zkN4f&+WOIF)U4HS-DiIVsUAB}@Yp)07T>r40&%+0M| zm>bN4@$e_O$9k>#IDY}x#oeWMmwqqry&!-4m^00~#Jj{_f{POuC%WZ#(<+od4hF*} zxB>Lf&P>eY^zikGj`hi`x%LqCRU z{ySH}n#l0H;dxQ0Lf`lgXp_z9VH`uhtn0g4-9Auf(_=6!IxJc%UMt=`);-oU+B5n` z_>XWq2=R6u=TI2;np3;Kmjh$U&CGc8Il2iF;F>lPT&t}i*w0%AdcohE2Oh%{rO!gW z=ry|e8P@HKO-tnb|fuL7m>Vzs3XaIpAbP>WNueI48{%o+8A8=rZP%>lJ|>lFGA zjFpVDhJtIBo&jT8b4d3XYf(Re`KOOnH(UcdAqlQ|#=lYvT7h|_{t06z`=TC!6`(hu z0Mw`cp~u(tOt0`Pa1GkW8OO%&&I!?0XnsZ8U?$1EZFR+Gp8^qvMP*-XW#!EMXJ>a);c7c!8^h9676 z`9zWoNBp$1qt*H@z_&ug>> zJ^0_1d>6zO<`UL4^z$8L?oWuOlQAV@g8J19_{FaUV-6pG4RbFSmMjc<_0>i69v!D( zxQU*UdeM4JiQ5|;7aJG!sWeVBPHcr5`8DzvCl&{@2Tn_zmgp7l#U!WkK~1lHynTFK zY+dY8xEd-#_h|RvT%p^k8Fis%+9uQ{&?bFt`_P{}i1X&`d%7Q5fHeYh4E?jEVFnl% zU=4Ho_FsmV+i|1~E1@Io&gSfGHWASUuqI?;KgMDk}ZO?=I zjB%@ZbZ7X2-ga}hKR_L;HF1>lI@J)(!_3Llsnnd*AI-(A>0X15ZTx)*thZRZF$dEt zb{0M{*Anx6*BWDTHE!bvW2|RD{YAg>H-J4mh==sAOoc<>^*9}$%q}Ryn|aZ8@OnKF z)LI(mHOzAXa;;aJ?n>{@?A+{JZ)Swe$jr$6nf^2VRO+d~53sg)ZLvDMe~ato8uI6> zU^+AOCP4y5=0&x2nmO zX9n6P{61dSJEET z+-rcZ>B&$L+z-^L)Thj~d&6M(68;B%-^ui`_TUx0~m=Ds)YEO;3bInMRpy&>-7@uDnaLpGlYM4s%wllLcn5A+a=Lr7@kKns^4^qeb8SbD?JqW*eZTfu1gL<|xy1AA2 z{U_kMn}G^=n%pZJ!6ooN@O@{P4qw3eU_5hf=-g0!xB*@O%GaTrz*x)gWj=6#KCa7{ z(c2jGPN`Fw`x!r(H~Q8dTpL}_)X>$#T(8am^Fe(G*5Ztj)SkA09#PlV9H_g#1o~`$ z$6LM{^fa5t`nfd^YnS>2>Ouk*GnXoa$iF4NB|acAAYrX)X>4h%I@p`mBGMxAbNJ`* z<>2qVk6E5-`VTUjDpNWW%t!x%zOlDpGFU^`!(x6nmtHY77ripZMHhlPZacgmUd!%j zqrn=r9v<~wXA#{1YKrdh>c8ghElam7J&l_EaLz&;$a!1yBl9B-fxFUWQVDI*n(33E?)abA&AsF; z&Lpr-GMc##YOU_;)+}3rJ#*e)&x84w{=o0yId}$-$H(wEUTVMo8~tn7gWgB|i)s{X zLBZNki5am`u&(d=;Cny6mR^)=U^Td&yZ{Tqob4W%2s7bQxD&SH=h>FsmhGMEog2z| zjXje+lb(~k3H0(bOEybRPfbrvO;1g$vwR2_WG~3Jg(jTi>Cd|Z)UC`B)zV#)euNpv zW&~%Ts9C)LKY}`ywZOSx>}335-u@66GZ`-$LmE%HhP(n7fw7Wtmif8$8a2BUImgNP zYB02CzM9vjbvpfsy}+F9a!?=Dr)ON%n%PG6p*{1O)Sb;&jTH+sg_%C-KI!{Y_oo~p z^9|T<9D_fK{wTTuCV@4%vy*2BeJj(G(}Ni(=cLX_oti#1eK&AvE7xW!fV$@^d9UQ{ zVouIia0PUP&*{ClcYY0eu=T1pp)>4(IpFViIjDEL5iaDc-ZfyneFAu|s?oUrT*EoN z#zN{im%*3deZG@EI@hN@&>r+Qx)1vA>Ok&a*7eK_ABB@(f<61x<&10m*x1N*ZU<*X zxu5DCR#%z|&wzXUQJ4&V4>hktkOtR8*P16lkKYAgOzYpEx4S#s4_AXVvT862ZU@%` z<7j(XjGL#yJ#YFZT;>SdW=?heim9#70wm-0GyM1U*f*tjHdR9 z_N=Z067}=z=l2FAzWfW}d~i07`Q06$X5I_}4`%G5*q_lqqn%(@WLBgu%ni>CzXNB$ zIOY`|!J}b}Y(3&t{BCOEUMqjlS3Ml&f^pnC;QjV1{er_mpOZ1YdC~izH`Up)rQum- zg4mOllfGEBr|w`aS6{>P zU>v6Y>+g6X{lK4;d{WXF|Jil$7d^$U&uZ;&z+Yf}&vknp*fXi-sE&9Js4cz%#!$vb z##_dQ)>O2?j&Sz~@Pog^fL1>w6 z8JxM<9S@qmzVZm*UJI$DX5Q!VKA77cY&qQ417CK>OkOG>QuT@&<9q)JP~s_=Xj~*)?wE8 zwcy@l-uEOkeO(U}P}B^za*mSoj9yQ?o~ReE7eA41v^Zz5{f<8ON$8W%`n>gdbLl14 zr?Cv&`_x^UfY+4wtQx4-pKF=*UGq8fJA1=UrkB)fd=S27W2Oti+W3WFkLy@)-Kthn zt)v6JEo%Pewri+?{v7!^GBi3g+MII;&iY7Sd0@ABrQz zk)tpOW^hi_RHy?>IYGV^tm3TY$G|vN@7P50VzmzaH#I?@j_dej{6YFH7lVCEsU*$JotaO0>68kRrRRT?;YjM{gj+vC36nJXWxilY5$}I-# z62?hiz)x@{=L&7$grPUU`*SNagR?-5`}eT~YJ1q<$F>$oYgbMt*^5 zMbnCgCWj_pOTCu*CjCuN8yuS%oB1*OWA<12g#CVRgLOdf$!|e@UN5>amamz$k|&`i z_~yD~eb#kKo$bH%Qr*pZ=18zsV%S?bG3Vu|30w|aBU>ZCg?|eV z0=<&z+Q#Ru87IK^%%F^hqME(C*S_$uf*Qs%sGj`PldVq1-Szs*ZdwU+#@$^=!37LDDV_gOBg8Q#?lB_}bIOEtS za6#&Sv<`O{xF5a(Z$d{fE>hdr!5pI%5Gfrg?d(_mLnEOB=<{-4vKHr?`Mj}@wXysE zWhr&ve$W)$W8LFtf!-DS5LUwn;PvHR>prSh{W;tPd%?Za{lfj=0(g~qt$G2>>D;fa z^PC0hyT?k71$mtJ<~d+}Fq{cz<|gL`^DC+)t0gDHsl?WQL&r?VOg;w}|B(41$U&?* z*%ME58P;|b11`8)b|v_`x}+}LS6ICJ+=Xbo}jOo9RN0r7|bBld9YesGN%9UUEQ z4f>Nt!u7C1gb z1^RwP)7XL0{!0xE_2Cqp+C18Fd}^UY}bZ zXO6sue!O?^5WO6JIsA6??daji;YfEllO7y>EK4}k)%{NGI9)m&`29yPd%{}bm(1U` zhIAen>!}f`^O>7_P3Y;E2E(B;WWar9=CPSUEzax2b=bYeYh^GPJNyR2z?!4Ab?f;T zF(>X+(3_xkMpz!KS(J2wee6SeTm0GToaeJ!V)TgOilD8zQ!uLhr7lomFVfVtDVc*exNBe@a~_u=HrR)hHh>=`g!*AY*p}WWo~88eL)T6ZfZ;V zcl1sLdK}vEZ(t6#3e;bWtDMbLCsZe>!@2hLLi^UA>DSe>)r-sx)rQRPkS@#2LV4Gl z;F{<)9|vQlkx(^MHB=iGda3 zz8vZogF4`_SIW{>qJU%>LJ5gH;Wnu$ZSosA;pl&XzED)VE=N-wf6= zZ`9|?zgwT_c0AGEADuv5TTRUS&b3A_xB1Y!CGXNTdv%~8e_HY>T`Q}CnQiAVN5fja z{Uwh>cd#GpZwMEMiG0QvUkn8>1sEF?oc;6$XZF4ZpMZV8##zRb?Z6(>AK+zZ2!Fz3 z%wkbDx(+S?eFRPU4b;O%fPK7v9h(>@A2bg1Fk>G-_jg(Z)&~zUpL#)NLB{-C?Rar= zadK>GY-(P5Uixx6r(TAh*`C=;@m!tHS%m&S<0^B=`{7P-ZMJS@oMg?)xTp>^1vNZ< z1C8)k8lz9c*Ly3o?7b$81?k7lFCg z>!8kk0l0S>cYO-33kR5?TZ7pI%gQV(&v80a zZF+TIr*~C9QV!IM)SEs8Kb{0?O|#%dP$RV1q36u!z&h-O%#hp0d^2A|eNMi<)-2nC z-Y?_f|JD#|-LBhjfHe_kq@;G5SdlMGi&Y zhf&M}&xaAPgq%ADA9DhZ^;7o}*LHJewO93=Q{l%_KL#^+dQyv92EL7E?u9v>GvCx| z{>I@jhFKyjz`yNy$?^X`hZ2q4TG(=U5qiQn&|B)7WgoC>iffwpU8!TGj;X7wNt+Wc zgR!9IV+`f$N^c5YT&()aLeA2I}X}!V>@-y%#7-uyE<6iHr(ahLr8EvUd8XXrI z7ny_acr=$kZ#Hy+ZDa3N=2o&`@Ie>yl1!+ieqz@JCi$;o<(piqzlu9H$f$60`~TP0KU~Js#CPP z5Q=se-JHBRIStgBPJ|kq&2(z!R3<MwxrIOEhZ@VWbVO2 zuoibM=vy*p{D%IRFF;LQALxUehiQ(v89sy4!MdI6m~psq&{d$m@AdL77zgHo+WOn@ z5qt-+yjb4P%$fTZtT*{P=s|VuZourj)4+K0b2tpHeM7;x>TVbb>fp`6>u@y812sr% za#O*3)3xm~uvf|)M(W{t(%0m5xC_(-tP`sbt1(#La*Z<|(7);#Qe&fIgS_ekdIsGa z^pq9l6$O8Tf1m5Ezppilt2mpzN~8)WP60E(Ka71Cn+s}8_Q!pl_&V_d49_2)@BHr% z;~xfR_1?o7z0F`wbWU`CWPhX!bjA1I60U*)_|{s3dVsl`HO_-zj;)thj1^abbtjga zpts(8$QZ#j)*gQIUUlP#!T4k+^A+}jnvz(TS7W*yT!XgJyKe2R8;k&JX2wG2g8jeO zK~pd$str4HJA=7%bvZlK_}&`A+}zw;&*GlNZ^BSGiP;9$uGF`Tjr0lJ1g?Gl+duRe z_s7k=0$u=XiF!PJ{}U9#&EUHE0~En%=54vR=+$@6QRgDzVy0rIYqo24Ei8a4oO5spe2!dS{eDMFj+VH;^RZ!ureACPuFrrml(h--qiWQL)#%lzN73hY8s|FQn!YvNC)FpFEy@OZw?^Nk z&^*~Z`DW3Z!CWSFCiQY>@j4HsYPxEAEUbk}nM%PNxx?AR*++7Z1hK7g>F3Z35A6A% zR(cL+h+31j)`3kW@UeMsJP5|y-g9cj*2N0(@2JO~983;5IhYq`ee9gPbAq|q-oI7z zss?jbowMugo+@x2*ni$I(J(kO@$%T^v4zov!QL`AGB=WgJE1FF0+qv+!&h@AZ$0>l zGg00J`%SI@bGNd1quNl@-vjG`5U_M3X4;nr^BMEZrC@zg{sarKC8bL^u^7T+Q}#|k1_Xu2<+214~(yjwOpTn#;Q$)U@4u4#C-+p{%Cp=jO`Bz4|(~b55ZB ziS7ySL2vp`jaA*BUWTn;z0}v>DE;x)KCP9yU+P)b)BX#%J`aN#pw{O-M@j9t+KjrA zvE`dE6ncO@3u^&BHz`;P#+;;_!5kws8^7*jTpwIpM#4ZSf2@2k59%3a)A{^bw{pEq zfFHZA7^mvzz7%#dug>o?4sHh@Oqn|wFIztvV=AwC>uhT9mw>v#X8L@mKy6TS?E-D-J@#)^`*}V7di=-oKbHTq;-3}os&rSS zK@|s8d>DR#c@^eWI0H_HyUX8QepR_uAZ@6|ii|IXPA9e?0mj_`g=cRuNYoQnDS+Yl0Eon5UC*2L5VHy|%*?aOHOo!!Q z%w_CV6BaXjZWQQsvQN*Sqi5bag*ATrH}oNzLw1BKLA_}vm>+%(#!jwrYOBWo=Ailt z-Us~v&I)&ptOss#uB)HJHZYelZ&mYc1lCi0U0q|`^OiEZYd-|}A6mF;j{D6!%(II# zRO?XkP|}%g&!wMBH_J53+{HPb`b)h3`*8-Saf$bPMfz&4;Vfy_Oz(aD+jVnwb4@Z$ zGRxA-(!ZpBNp*(CU_R$LmwK2ytG7Q4fF{W%L7ioIa(GgIWS4Z8bbA;MjWdliqaZJv zM>W4?Fq5f9agAdA;4O+<1Ui#3q zeBhrmpX5lvk%Bd4*Oa}q;L?Hya7q3p`41-^Mv<+ZIEix?$Hd0OCc#SjLd+Xxf%@$< zX3?#L&*6LOhTa4A?v(<)Gw##fKwav6`b5m{-48m!E8zNJOr_3zCb<4?Ve;rhoO|k8 zXpPQXE3b53pdI>Lsofh3sU_J5y&LRXbN{g?)B4BXU_H;+=WS3o_-~K8`S{I2A6zZ` z{Kh?Me~0xlgS~P!!GgB&w|eju;0zSK-%Y@poZ3?zm{2kyI6v)bygS|x`UKo(y!KuL z_nivhz2&`U4ss!0P1nCmscp7*zFxQ!4(&g~Z8%G!POJ{6crA>TkC%^o2Bz}__Qvx_l`a$>uBHha2+nBjLkr@waSGzqI2xeqwWZM_F zr+VKtm<2bqWN68E<2kJq7z7_OT zcLlYiGGNT}EBpeRz}k*;1zaN*fO^$`&!PP#C&3h^I{MtX=B$M2Fc(}K{db?|3h*>o z6ZNru@!j7G=9}Ii=fWZ8n!6{Mlj$414t_uO`!Qc{^HX2H-$2bsoyx{3YZPkz*6(`2 z7HSpN@O->+VO1DR%|w5D*?8Ib?AYvJR@|WIpy*YRt0Miv{g^&Kg1VEjk-3<8fnFciKjRH`*+rmVz&!1L z@DOx_KL7Fs{kN_u=fW_sCgw~8*ByUvJsa-DSA+XqB9q88fSy^*;S z{ppijN^gZ4r?HQZGj8~XGYdAu&tR<70xki6j+)VSD8-v=oH@+LVEkuJvklB4v&XYc zb3Pd8247P{HMhAHyhqh#tTP|N6Yd_~9^c`K^p7rLc9}Vjd$#kLw!#MRo@#*CP7TdE zg|&Xt@7Q0kHNG|8Hqkb*Ie&BhmWo>{K6&DkCk{Db$O%_Ls$#0*^a|4}Y%IUAd;vUL z_Sv$|NvQ{a#s7-0j;)Sujc$#;1vSC-?>flG-(Q{iHO8f9Kwa3)xmQQ%U)Iy=o4KpC zf7fgEvtBR{%7L~1TDTdXK*LT^BU6*HmS&981=K9|!43G}FNTjfL){ol&-bn1Tvz?4 zmGF+I>3ZJ`XTnGLR9!#Ef%k_on6MY7;);~MGu<~nT7XUuQjXfA3VYVWTxuii@QR%^f>N;P`de&b~0 zC)ai3V!Z?g(N{5x%QfA-PYvDcCyF0<9R1F|*49J(dFpMe)2lfNu0i?>7>noXn(Q^% z)o^9;mBDq64`8%Ml zq4zfKdkgY-lblB8~pk2 z9ByMI{k7_ct_xp*F{i##<6vVW{eZvFKT-@`n3-hHt=EO;6CiN~vjgv9-if)t9^oYT zc@6jkZU=jMjgizf^th;B7$0~qUIt!s#=Z9H8b^43ka2@Cg4g+na2}eg^|}B0v#cZi zNzFS{5(>^XLuw1oD6sx*tZ@*m1*!XA$$T0Gn4@?l4@D0}3uA?`d*k=Um%#^6HBmKD z4?KsiKKO6{17q3?K_B`1oHKC=+#k6=qW^mnGzK-3#q`RlX<0ikMt5B`CuvNL{o2g6 znH8xOsms%s2iorIoKaQ}o`GfAW!cTp4GzK0%*RS)Q&e>JWuNC9wmQXih{)Op{U?jb z!(5+SQ;Zdtf_}_V;Ln-I?A|JzNHCeXOg=AlIiJOK--mWL^<>r-ou?K_q`54#(zHa7iuB*madYRQmj)NN0kI)}q)=f|yTz8F;n!zmm zRL0C_zy)9}POVW5$#tn4o*Xr}m!K-Rr=12P;e2=lc7%6?oyk5K>^IT}+Y8FV-<*^F zL->cluWaqG8mz+qYTd~GcI)3Sa*o?dFz0vQR3EY4ke|!XmCBULJf33IlT-A3J(;vD{5ENAlV?<2F^{L>z|)GF@0kCbXX5;3+Y!fuVkLe zK9xNHdR{9s8(i;#Jw(<`-A~^F_g(c^{V(T}->SJHFf(ivU=ubZd99Iza2 z+&ke$@H#q;x#JbVb>EoJo`OmE67(CIN5)FWN~=5l13lpuP;YV%#9|V7_skRb!fUYp zUwWdqyS}+*#=z@dt;u}h63*YWZjn!Ye{W=OD>u?C!B6H0^<-@&i>zvdqRy-e%D zc_@eAE+|QqBxXTzyg2Bus~N8ue?InnOdrA1P!WE^tLvezZL!R_h1K~=@&CE24{)y&F;+}VCHe<;>yM4OUg5y;fr8~!<=Jtj=7)vcTE8A7yAh>2XiEK zCiQFcD*e~{VF^@VW~Cap>%>j;+qxIt3zx$~&^+8cd^PlegQ0^=w0$O2K3qOH`_Fi& z3-d7Aa$fG6aAEkupci9)XnycLeh>W~%-HRSpC+4^&8v+s(%ku5Fjn$?(@@i3=8Cn8 zYv5sKAF6M?mG@RKTR;!ycKYqq-{0rl@^hI(y}V#K(->wTDT=~OJYH6LF~oo zi_vY7ZIM0UJ>jF!AF`orXd9dXdaTs)%{wNQnH2cWt$9BO*7J<3)ak5ydjoz!Pi`O3 zOX7NT3amc9`uNNE&#!{5^bL%KZ^3wBGq{$h*PDy^@eN?T=`2vYPzUV@#_#H!zTX7a zpv=dXgF3f+N*l1|WE^EpWeC{s@EqI%`Uf|GkG1})Cf|*-A>I$a9}Y!BQS1L-fqK$( zxGQm2a7M4Woagg~VNrY$69t})d*E9?u&>5iYjbK#Ya(kRw}O5FW2Gukp1H_XKoQ72 zs|HvjRm;2pMu7FCx%3m7yPg9+KXI@|sV3vPqh4(;)<4%jcUt!Y8wL=k5+>x;~hDFgWYh?^Thx0Onx6e;P_1 zD;4p5v_rRRYTAi=ifBTg+)W^Zsx+XmZ z=H%8j?g!Tb*9EVO#&~m$hunj#H+jvh0DJd*Z%lxVvDBGpq3=Q)F| zS-4r)>)t(69nBopjd(G*wvYYagSwpS+XNy|J5!sk zl%56sYaI3;FoItyx*~y#z0~af-Q-v6C8tF<}|ZGkUj;ZJI$HaP7F2*}0wIe0Uqw zPOU#1PugRrj(0KWlhV&^4cd7rf8(qC9=?RO%tL7o&(edXE@j>CPUsEyLltNTtH5>2 zStt6<)xC#;+SEIs|H#)Z4TG40qF3Uh(jNtnTZGs9ey}cS-lGQfF3>WSdnEHnW)J5D zJ_(O;X3gyE?CfItv9^QzuO4A_XV(RDvM0cN&TDlH80UCR+Q+aRZOPA<&_`}f*lXBW z)$3JXuaEmrV=^}T=J+>3zl`f&b$I{y`$11lF* zzel1+!aiX=ogF!gd=J*Xv1e3fu>az<*m0Z-RBHGoU3@1LHDl2(IgDu{-flUCWHC-(fba2DN%U>J7m> z&vi@Ry0P7jum)d}eg*do>)pmhYDRh^|2+2RG4~#0p>5RTK7i|BHBjQ9V|CxLYWRsd zf`8XV@EEvn>Ah4>u-C=cb{-frS$FYyFdjb<^uEl758yL+0Q3q^2iLSupkL{JrS-Q> zqu$&Gd|nqaKhk{L`{-omW%|9<6V%|;pkBzlkXeylk^U?7SL#vFAO1M#2R{`qE4-|* z-{F3TX#+m+^uebORy$Pf&|Fx-IR|r&%sH~<=$51B7o8t?$JN$|2(Cw`Fn@PE>;+?+ z0(x@o;~Wng;8S=WtOJz;W2u+n6PO0ZMD5^i_yN-3*FS(h@FnOej^O`RYyW~-P741k zz}}NtV2tDEkAu0OdY2y?cfG(|m4@(g-phH9!ZR?GJ$wrc%Nv&WH)qE6MgeP@Xqq^o z;DmxriA{;&^lSVO`ym#GKG8mber0Usy|O#BJ5-!k9B66#m}#O%M=k$yh{Fozr|YqD zEq7h_Ijjj+fSS0u$`mkP(JOA8V6AT>s8Q{P%6QDI*Qj3(1oJTUj32<5U%!koy&AE) zJ)uPqOQ~B}gY68TfY-a)$Vhk)T0uXsKIA>6eo?(l^)e5J9t>TAr{?15#lc(@*A{0A zEQMzI&GK&nKi&oB<)0Vmdt(w~68q!( zpb*U6td;Z!^Lh80%fNho1|-NcjhS8mwGVsI-U8!4_Y!;mt<8=AwQcM4>WpjQ9;UX} zfqb|Vj2q3z{2tR`AK0JN6x=uTMjGor0uSR$v7X!qDuc0<*Kj#lg>TjCtvMJ^ya(Gs z-NO2dUS;=W`yrkNW7z3nJY~&E{rCka0=SN|% zXBVGc+=qVLb=h^<+o38n&os|$Om7U%>RpgtpmjXGF0(E(9{yzhTr3;Qz5`!E2DZan zxwmrN>E%)XK9PFEC17u)y1jdib&#pxa~VD!W?Ims;H(wzAN7spphn|br6yp^v4T3> zPhgLUZyz$dWEQw)xfb*W`ykcB?*Tms*7w)J1K=9s+Oh}KnVLdRI2F{RIumof2|ng* zm;&y%YDhlLpIaIFgX=_lurBEDVq9gcHiced^}WyGRpr)fVX`J zeR6Z*KmVqF3fE>m=;L4#xW^2EABmUs($YEV%mM+U0eu?rvOV zyfj?!gZuB+U-UIS3a(YwYnmKy63mNx`S{C$)-bTtz`&PgEc-P^?c+UVNop2(ia zN5EDRnMg0M`GNk~E5Kaab-WxNIAdJzm4)DYYn}SH)D^tm^lf;}9m2b1?&Lk*nsaL( zj6E0|5FNl2mnu;%(V*55;;j^Zk*Z*9Z=F=Hz48AGoRwwG!q~($-yGO{Sg-Mu^z?VP zrp7&B45Y{6efp%0lX{f&DA6mI0KG{Mfbo=Zl^*abU@J2T>Tq_QvGHQCRxur{E8PKl zn~crwfg1F=*i-C#f1b5DW1!YxJZ@dioV@}*TVtocKn*}Yld+bXxn5KI$Gr|70{5;D z;Q&(!$=2mymAJc+q8OBaIaP88U|0;bUzf)IK zgEKx#!2Z;JPJF7KionLAjZ8rq>7`IqTv%Lq7`}!3ita1=1iB}?Gcj&QvP-H<5Kno= z??~qMBw>DLKBx3f%&dg6V9l>3EGS%1*b7=0wYL0FG$1`79m<3caZa`r!Y+jy~!hI~GPle^6Ue3-aTZFao+m8!%6> z&g9zO30CHVt>TGfrpsIwlK0V(i6_ZTm44pjbLW5Yw6|S&s|T? ziv4TGQ|65?f-$$gf$r##-bdb-)@k&e{fNih!bUkJ%$j={3t6+!zdsG!i=SuakKP;W zdB#lYAqVLDnhBl3`^H`m?;EvP?~C6#gUp_J^Q*HWXGNBRvvMoMD=?+y=6Di3ht9LI zoHsldzKVYpuLDzJQ#cW2L~IFkhBeVO(JSGb$TyMQ;oaeJpzvibb{jL4-^qI?=q37# zzM%`jz4~o1Mrse%3w)~t6OT^}bT?y0a~8E0Scep*L8M za^11!atf$987HmdOlNCW#!~;q>h7r>;7S+{-phJ6#CWSS^V*D;T0#`&;Cb7DU)=bm zGUqzInSC?+3)6^4r$?txf$gd7sh^WSyWAw5G3RW#-QbLrH(?EDZ|N7-o9$k1erZ0b zHZhvM$Rp4Y4l)bh{aateb?`RxUaH_R-2&DxU5C~0y$^=Mi%^<3eaWry3ivlJW_II* z(h~yjdKupQThwQ6D|1^gUv*$?WqA>0ABa51t)_3rJ9@=Iuu;fu7*3o$9m7I zGa2)!V?PD1d9Q(ct+ACpgfgKrA-$gFjsxHtxDPzv;AS9Y&WpktW-sZDa$Ok@r-GhJ zYd>mX<`C8sjgkDf^5ERcZOl{hp3w(kPrQGpI+HyUqv&(?b=R-tYg_|v1><1jE@P_i zOMM?)8}0BfsY{kAU8eMY&J#NV#^KiE%;8%zgZDys7RI9()dKSZ`%?#I240t#PmGng7Z9j-F0G z-U{X+?$fSo#v)~z$MXmHy!Ht92(OB)ig-@u3}}>Slqi>9F8?>^ThO;)d;a$P4h09iYG9tHPVCyP?(CZ8{jNvRzkL!j;U49Dn1>-3 z$wiijmxs4eDgHkRWvcaN9?3!%ZW2HO9E*vWj`dR%$1_UPW@p5(e9 zjhU1DJDyFoLiKXmPjdj$Otl6j)^`zf(G2993;X>+rdM!3VI1~Y>7Jo2SmS_Fvz*xu1FBli)h2W;UMLnKy5mF4aLECE6(`|W_y5xs^b5F#^@KrS?_Mo>qgsMFoA-8O zs06Mx)-&|RY~@@e*Q}241n9#&0``Tu&-+{rhI{esseyH1mfyboefh>bZ_%f_A-W;z zytoGO24rkGbUvQRWQnV&ZuX>dcV}=`re|U51-J(Ehu4Bd^hKJ>&4w>wIokJAa59|F zTxDbImf*fI6K;lA@a`VOlj=TuA(RKb7%Mp&WFn}4`m@@@(hJm%vZ^;lJ?i@1ZSh4m_0H340K}7 zs6GZ`5U;-h*~!_-8HpK*YvAvaze^e?8Ye!0(Qp+wOU_=I3CRh`-pudy z9L;ztp86C1fVJthWNi6q>v3n|b*q7@f+u4hjYWZcY!`eW0ULQTX+rL2cNl3^uzg#8#@{2 z9AUna^)uH4*`K>V_a~^AS1+j9`!o8yx`(>XS@Tn)Tc5W+&!15}OOKO&acgj{C-&z3 z$$4iD;dOWzE`W}pw`mu10$fY7U_3jIS#-uo)~Bk%HhS6g>fZ#`E7Tj+Laqh(mOJ1* zW(9apSRc}}-D~C;K#L2!r6#f=dfN z0e!B^;>+Uv2(eRPQgjlhTGkG7yOqpMS<8%+jiHUfyrw8;E>~vupt*Zh@O|?>T9>oV z&^+h`@*3-l_d2Sb>ATmDV~nrfX&$!^e12Vv%~!26s>_+fs@dpwwFde*xaZo7(+-SN z?1NDwzZP7>Uw}91U2)x3!*~to29z$@A})Hif2{}?Aue~@qdUKM8N&dz-k zEzz31b$WkJ^9+=@qkjylH3c7=NPXbP-pRNGZi%(&$tTQ@|Ma|Xkfkvf`f_jF& z+bQ5RJ-yuNLEYQ9%DTbv^rE;n#OPOF2UoxkpfBnLI3AW$XX}DzYB)R#*6A*Qx9MZ= zNu1^0J`Y}jAOzlPgEtx&DN8|L-+Pq%W7wvPT6{lzTb zIr`FE^X7uJlf(G()Thi7tb6|n?$tf;XFh>$<~8*H+cexXoS@ms-mI%)SH<22bFx$7 zrvz({`gk><^(p!gOa=Q-{)+q+nFam8b?7><7WYs7KS7_QI-7ft&$fP$A7LbHXa1;l z1@F1J;JiHVy@rsbAMrAnc63@W52ppQLR^PlW}3n>u%7=jJtcY>ZwEEBGhivRVH5Bg z{0)Bm2`k_(*a_yoYD4-l)wPF#`PT3BxLkoB+;}QmnhiVxuhUE7*X{>(a{Zliz<<+N zbS=0?ybpROU3;oRZSoIeBXjOP&@|mNZ6EAxh$rF+=N0uy^-1~lVVnUy8!BWgWcxyO z=F6Rep56m|ugp!XW1P-xW%D?5O*MUe0PdZBs298pjhNTqT5nxW4f7^?Mt|k((fXWI zb{-&w1o5eR@gmp@<_pVVIC!tG0rQ2^smt4|wt#t7RZ6RrHqAE8K9+tg-8a=YrEl^& z*pS!|^z(k1_%bmGeg|iOFNb=`ddX8kuh~nfmr~EeI;fec8F=}(a_05b*{ichpbP%j zC&7MCbKox^#`$FK9o8=OPBfr@%KFEYoGCfmBikc|1%(BDU|@V;+%rM;NB2h`i#*08 z!#g6Y!mGj);Uwl~g!xeS?f^~TrTmxj-vl+H^5B|t4{U}I^k7EiH?R;sgpZ*ovU}h?GVXGXFgCNs(fbDhEU!1qZl z$=W^=P_8+b^=ji;MXJj1J@vX%sMV>V855sHmCm@=IO%8by?0$X5te|OllQ~~@ctMM zYE1rGU0W^E-x~{TfU)3uWXz%#s6JxNr8(%o9|dpx%OYl|SflBT&(}K4Xz**Pqp84K z(4N`YRp1g}+YZiOHg>2Bk1*@XeBI~n2WDA3oPId{UCDPPZ-HlCc>m~yy96#yU!1-d zMrB52J}v#UR4;<@?|%Av)MnZ;`w}~PRIic#?n?1WbX*ULTLY*M<8fua4p+ds*t*~x zx`$&A$M#0|M!SQt)YQn-$k_1MU=HsE;S0hYLmg4HZVC0rY5OxXv_1#-i{l}Mw@mHM zz3+T5R#gvHH|Y=7mp-FDH4Tg%%BSwCqqvL=XLJj z6vUgM7r0kl1Kq*+_R!y{cfi`5>##A8dr1xOHB<$)->YFZ9)%#rBS$wb zQzNzyT#tepdL3qV#h@k>fL;*e@>bx!cLn%w)`vUc8nA}&F&Hx$%U=oJyT%%S!r9Dg zb+6Okw4ZY!j4fYh7WyxESP!KR1+yz%pNbMi347#LLu&}by5e=k_m|vX(hoYpHuwfS z6KWR>PYzFNTKpacQG2)$4nvzvn;@oAbE;5Uq4b=xbAofT#^EdTo?HjUre~BpLzyM$ z(|M!Z8-dsP348*^vyXsvM%M)MHuI&?umd)Lxzkh3wY?LJH`JHUVRqha_yAplU(CLk z#S&Cn8-~+ctT*LFQ2XtqWs zR+$E_e^ud9aQ)MBdW6|6u5Z@g%mSpR2&{%tSc=`hPn@2QZ)U zS?mSI==tUH%e6SxBIqr?oIX4Aye~pugv_IiVOB*}MV<{m8*T-q`K3Ycp>=}ha38)i zH7k8A<{`f_AF2bWVOS5G2VUbkc<unID}WZ5?YJ`vF$RSI37G3@Ml& zpHCLIEWQO?lRg1;?+S2J?53EWrs|REkxk)EoMiWW_&WFr|K`)cGMTSu#5$?_)5V+!X!FS+g*|E)N>;;1!qbv1S1Do~OBe{-S0x5c?5Bj8q`6)Wf?`Gr~D zXVDXCtYhrt*Nvx)lZs$d>88>>=+tjOQ!vKw2bJIfx=sAt3}Ubi|G*5W!BaAZK5={Q zHZuFb*zE@}H&DYfwmJbu!INOTWt{gDsF$mw+jD1)v=JUNdohe?`^-%4> z*wp<|fAN{%-lKlgjakt4dXxk2#~q;7bP?wdslizPGJjOJ^qJLH|5W;^^!cgtQ-_j= zf|*Ti6KxYcz|ZZ$S#m$a70D}-z2GoZlQkDLCcGEw!YnYCnG%^2Sy8y6urYjF@NKY< zTGN?MU*T8LucFOk&0{6e5-QTiMfLK1!yMkbVGpPH{snC~>sEh211N${(2N>Q6#Ux5 z_?@=G7BH^TU%8B#nXke^aJHSlSF4@@En!v8s+@7mR~irdn8WEapq`|!`@cRD{ock< z#zEF0%)>HZd^8mLfxj**S61!<<}ADit|5;y|Ihd9cKq_LFYZB?K{a?7#zT8}3WmT# zP{IH}>&06^eZbxXV<7J#HGv~Xj|B6v?5S2$@%i(6-BubvgHq8q7Jql{1hlaemxKcwo)r zjpx=d8{swTkFM9N^H%4LXQs_Xp^HK{!yoW_`1kNO7y%U`6(V!PbHlCS68IqWLC_ob zC9`qvgYM7>T;Fd;pL`jtgR1>Km-Ac@C%JC>9C>YxixezYz~^9ZtJ<)8xV^Cx!8pUc z^n1<--wk@SZ-YDvALdxbL24H-fj%QW;5ig&)X4{dxnLt03hLxbpbfrlb*XvGF*YVM z2J`>p?4%z-Pm=4RUT$j+b&l2H=_xqowY`w}DyM?+>_g!DumWv#4)a34hZ|rhv(weE zK89X!A2n%pRC9sB;B)7FX5Gw~=QD7o#53>+=$kkMo4|W$C|Hlv%d`g%lxw;AjM#T> z?B)0P{eF-2OSLHPt83vPyhQJTdthVw@yw@Mm9{Efn^~JNp6;3InYurDe{v|NI_YDg zd{Z*5cv|r)XaSvJGIW5(C5=mlgZ;f5z+RR7WIofI8YEW(;eIgNayWH43k@~1HR)0r zo;^h0>Pe+11-ba}(&53r(vbdCH9^-YH8^|fj0>%m{{)vXFHK*CKl{nlYSqpj41J>+~N7S&FfN{uxyaB=BxC*={;%+9hgUF zJYxNF6lb`(=j_Ss$vlfUw--EC`dF#^n0Kz&?v7_-VgNps`2Y@&?~BE(>k1Sp`JkV^BPbAtXs?mHFN0# z(?LB+kANN#*Ep|@eu~H77xbn{P#cVqy$`Ip>2-5$I|0;K%-h@}ra~8Rzp`fIefBdL z!yEtmdv5RGJP~J%`K&rC#Jt6|N#FOYP!HZ==8$vkP79wFE{qgLZsshISMWgI!(0IK zt%6tqC!#zM8xbE7pIk7xz&Tk<3YHYS0l&b*uor3-)+)6B@V)qZ@fz?|?5o&u;5ks< zu(!Z3;a|c7U{z>Us3v?(ZPHx+R%*1aN$w}c!R88TChqIEf^pJLh%->a*KU8l`=;xJ zYpZ^UJKz8vW z@!3`2-|Gu%PB+8X&ubg;=Rr023-r<&QyGWpo0_*ek^!~*D z#K7dhL&Udp+vy62?pZT7g2XF|?O^o&YH^zebqA{sG2Kvr#q_5>;=#95r zZ;M_=ulbG4cX>GbaNzk$r_wl@o=82Nd^)M7Gz130qLM`=qXg~SIZnTWU-!KBy2-l9 zc~C!9KeY$^c$s+;w`Ok5jE1=|Bs(N~4crX}nH%gZ4C7g~JMVRSx;DaK<_|ps=P`lS zJ>@aT_vKxf3{_!Bcu2TKs6|NMK*LbOkbAG1#4n(q$sE$$z;&f9 z__OT>a~R{)E%@`*h>TBNFU+;{G?|0#r@z#?>TobNv_{tl)BtyJzKLfA#}1o#@I3k~>ND~8?qlZu-_W}d zJ{At@JL(}XgZHQL&jnze*{^$lF9+|nRq!s%go)4!j0IMJ@q!x3K=A8&KKz>b%MGv) z)K$z~%tt=OEB!Zm{ORl_V>rjJX1Hc}31@$u!d$r#u@SL1p#$h6a80Vix#QN}I-_T+ z+1dMWBOaj!c@6T60jx2YQ?`N^pgwfX?Ha_~=DtHg9l-a-eZaN6KPUvA246BO?0=wl zNz|B(1N5SLE%jjP=lLA{$M{8Gf!9cF$@uY6a6MBm@Or3O)M1{HeQ$nj0I%C#_y&%n zj;6Lf3YPKMu!XVQ69KX#UZl4%7zUm-+&7SD@^CPdPUw@h2+2c54L%rGGuLEN;^Vgx- zq1hUl8ktNglR695CDtX%L)Vh7C5wv}7u$ehtP*hc z)JyOkT#>pW)h^vGT{}}d@O$4xfA3lF3H0H#z)_&*#hhSU*|swGU1LIfR(j&;`Vh9m zHt==nH}!Qj1AWof=Uul-!TW6pxK8LzXbdkh^It!L{zmnT<)DY)To^_lt?`Qc=~KB+ zp?ZIotCq7pcYAPd?;&bw*6;lOE%XD|vN}msei=xVFRcQ4ux^>G?zFVJ>4?(R+pNAfgOu0-s zV={BT7VvJlcY~hrCiqM$fVwTq4Q{rg9Qy#yhL&KS=Y8U@jg$1JoPy4)M&1JS6c~4# zo~bVtf@`39=zXBxG7?hW^PuB$LU*eP4xMD8q7_6UhjdIz}!S_ z*k9ib_TbIoj5YV2=jksDMM9BX<#&~DdtBS&iYpdZJdTgU6%R8hZdS#i6^2$Qf)?dl zl%HBOwdfjHQn;kBH;gP8Suh|zAZ~rnK00HlO7KGXh4A;G@5$QRgr264v5X#F*Q`(Q zcw7Z~IC{bsdf?U6hQn`Q-|J9(0Om!fgL#JiA!2OvKX7)Z>#!Qnbmo?H1!E~|bVJ|{ zI1}E?zL{ME#z2Q54f|j_I0vOgX^S9cdYZG1!)4(>Q!-|n3&!X(nbqsehED;TU!e6o z!_1J)U{8yFN_}GLBt762_yqhg2B;3+gL?ASrp)=SgO;Gb$@NKn-nFqOOaouP&!PL3 z&!O+Bp4qivF7Ef}L9n+)E&pw3&G{;N5Y%)_$bHRWU0;p)>T%9MTh4uJ1>3>?kJGcK zXU(I;57*A`LC=C~zx%IytRDQu^g=&?4p%W-F?)Xc{PgXq+k-q$?~*Z;XB-|WIZ~pZ z$(mgYcoVKnUYUFwYH)_ig|HF!rT3-lWa?y=rcP>*)dVn>! z=Jb&~1xsN7TnuN!pD;NzIkbZ_&($x~Zu`LB^asxi%?o`{@IgVX^0mrWEUH-4t*~36 zGaJ-gBhVw(BepoYIMAAmg7SEGwk+GxNQbSO8(YN*@^C+5tesE(f_aU#5-**y> zhHYR>c0cDn`2HGKnR}Usx`(ZSu3(MDI*mD*TEGa5b|5-7B8SeW?pB8jpbl80>k{h{n;V@Q%oT|8aU&R@*q`zSd}8+zXV+L8 zU4hTfx?|gH+idGh>&##OlFp$Cqem{YU|*CaiY5ts(X z{KhGpz_@2R_!_OTnL~|-CSV_%x|7e{a$-&ME!U0(;QC?QW6b0C>jm)FBjDttCm+?X z?Yih%Zfr9E7J{*?zrP90H;tbNYl0l@zrSOAI|^JgJ_I!~_n3>py!-(8*;y4PE2D)uIJA=I}ZD5aDJ1G&r_it zoDE~)FIWI?L9dctoLD@wpE+5X>LUCDXa-pjX=b;Sv}J6+pe)8mW0xP4F7z(NK2??d@~;i`mu2jyu6? zqBi5bX8*o5tc#f;==x&JXsmoUXWHrUx|%+n4S4$h%XihNuKjlgv)-LHa2K=(ynr z!efP%3n~}rCAZ(VF`oBC{{P|p8$Ukg%=SK@r)C1#iR=5f%vDwIwpXrW9hCG-J`kjVCb+`(afZy{hxE87#`B@*ix{|Sh zpFf6AU^F}im`McKVT=(2N zRznLsTYh#QG1qjBH4b_Ld~jMpA22>z53YBcVG4AC?O=>!FN<;39WVu4yW9)*f&1b~ z%)(SFSIbjJHc$AkhO-DiioL_9fF6O?>DK8#lYa)iyiF2KJdQQtdh;ka|9k9_u}3Pv z6^E}lT|t`%dZyn`FbAbs=`%;Pr#Mn+#vNU>)szm zKa3vcJjc!9&EfGdAv7U0I)8Nj_nd9u|HpN%2U?YD-gnG=)3lG#$Evd*D@20b-zE?sfPYj9IL)xsUq%T>{=$9YG!ZUZ@2B zY1`Ia9)|1T5%`O073BSaC ziB*nQj@z>`IyyRfJA4xPBr+4e3x5~B2)aP4P^-{a`CkS1!+yL|dQ7a-#d2afP3bG# zOF!&ldfp#NKa%bWy;8k`^FS`oT%P#=)@IjoTHLm*c@!yZux6MieGHd@>w+~&^&{7V z4@9t%Z(-f*xXP3~B*4gF2DxgZqSggny=Q zxf=CV*A-_P_!^9_M&VPl4z`Ux8*}xG{>8YcH>fK-3f9r8GXKO6^L^_({(35O2lJN) zz&Og->M$5@sUx|jn|rBG=ub(*ci{eWKR(|JLKlSWk8<9RHIJ{OUq{b^2bkON8vTrW zLwj+Vbqt*XZ_y*B7tvmee9&t^8L8X{oR{I+F^_pXPje^wPPW z_u_mCb;2``o*C@7#;-mHuA^!>qQ>TP*(^|*n&sRG*6FUGU)H=x57345OV$Bnrw;UE z8M_$!JPJ>MYmWD!@zEIghx2)x;S)Fo^kcsQcYryaUZk&KGW-b3K)*tDx>s%keFV<* zP+z?mj9K>KV=`v5H)Smt!?-sO0Be8l&-!AmA6i$u6>7sPFcZ$mIU|T+Zlz|VPvlkd zjI+{b1=ns}W?e9k&)Uc%P?KIm^I`98^~`d|${kaCYykQxuLk=9#)Ip<@z06iT4ukK z8j@TD_PMwR^np2`24yW&ubgrAZP2D%8zvjR9pu~2?9r!S-M0lgRTR``W`Oa&Ya5|V z5L+dVCIT<@R{BKMU)2zOmKuZ4*!f^DgL<0pTLb1lj0=woe-!yB;y8+1@PU5@@5bMa zKV9&2!Lx8bd=2K<%j3)ABf-6(1I&rd3F>yKNGdq<>7VdFoP>UV*jet4D>SY!z5Mj@ zHHvB!omhBc;m7fh;}69iitUQ*iqr@5%1Zbb)C7#NeUGiD-U<5Xo?yO-Gl@ULS76V^ z@APf%iS!crz5jqcaZ|zE($D72=Ysl^v8tcFU(}L(##{^4=FK}ha+ZYa z;>Z6#mNO&MSXhtJd@vSPcXB0uS+-gBT4skj7sVv` zw?n@js&=5-fja-x`RDijzwiI}pO1sNapMn;Ke+eM-b3vUw>!KN4jnmkM2YNUAZuSgjA8&>k)H;oyygoNli5>&$vy;JGE{Bf@ z)BKB%upd~hB^Rm@5%;)q(sfU>N_}tb4^%S3luQ(UeI*^)-@3*x@ zJrTZl<3i&?S4Xan?0{FJuST5<_ZT>D*ElE!UaR)-PVAl7Z(#B0hS&`;=L)QZ^`LiW zRCrW)9@GHeNAHPm@c!QjncPfpZq91Xhp;Y^2Pfl6ai5<6J`ctWSO&HlH`+M+cJ_Gu)Uk3B#LNM`gzKp$m zz7J2q>u@e}gx_K2rFxTI7k?c&7CH77UQ5>&bFRVQdu$Eg*L*y4P`o#coz2y%(J!haK=cc&{0&TWc|va&6ILHw!l6-P;8nK`r43xZdlvw;#f| z%UtN0$TN{v_;!Hb&E=fmtqo?&-HGcY}n>90f5@57~;OK~Py`M=I_10{nPt> zGF%U1VFef`={<3swI;b4^6;ZP0KTT>U<~p&420$2GrJCqW7L-}h4*sb3wn0cfXw-7 z=hwzzP?&EV)e>A!M#2bK4A+9|iG5<~*m5ge1m<1tr}~kM({_Wg&ki^Ydq55AH_kIq z`!;r4h%fVO@HzM+=Z|15X_VV2&^cUdeZQ>3sTo;kI~8t*Ct(qo&svL9^S%$P2W)44 z2up1_?C8hLsb*(qXJ@8nrpCix;QKcR+zaY3yQCX*2lXs<)(wyZJ%jp}^pqV3#{2pT z)IR-s2lxhD=d9uR;lA-3R0H!b`&~T8L+xQVOaT4Tw=x%KlN{Z2)SuJ+)*R9O*gYtY z3BWz3HFF!vh0BG_-F^ULC4Eb@dj)Zjx!Uyw*B6`v&X-d|S{Pp#e+8VCdn&Ast&W`r z-J;#1%|LJZu<)?(zRKOAw(*x=rWG&A9&ez%!uY57M)|~;~LtnuXaKAIA_TEv)OfsK$8Tk1xX22YT z5pWXqn@7MJv(Nc8oRijuxePTp%kt{X)tTn$=IN7DC#NPPCM4RyxiGC{T8Z8P|M8`; z73@{{w)orP$|aRc<`&N_UIWz*S36wgK$Qc=Q|%75JM`}1cMlg87ZpDXicudXK1|%3 zx;J$}`hxVynUgc?vg-o<=|Jg$;M%Ey>7Pl$%!BY5B30M4#32YM2$aj6lg zdAkm|wlv9al0P$VW>BLuS^XGqllS9EV63C&WbI}R+!nembRxW-|2j(2dBM4w>+;v- z*MKpw16IMSV2t$&R0I2QcY)qbbtvPc?U0+F8{D^($pL%Q?;C@j^yV4QxvrJvmgV|f zEXZBJ#N1uE6Y?em8vO9Q;elU)Z6H^ztXpokTs@#`Vrybk3#Jw{0Bci?VvS-mqBEi^ z>8qa_o*M2;Z~7)?x7f>SJ@QXx9rS>=@p%qohLG!*&yLp#=VubW9W^L*N1r==2KsHy(HGG3)0J4aCcdV3=vPs%^PDGjaeGu;o9e+S zFfBeUuJ7NOFY7_kbUM5Mzej$L+z)3!C(g7h55q#kLXF{3<}aJ0zYpfy_rnxeKwsk* z;C1tQ>8)7G`~`J5pOv9t4^LgrDfZfU-HbogO4H%FekX@Bt zmDZ$mBOC@jf(w%ilXX*dQ(NFE`Y&!^CRUSd6Hb-=F~}|4SGK}j`cA#p*7~|0?Hc&W zmvXkB`+>Tj`@C_j`#>#bwU}F}AKv-z%z*pwefWO6pP0wrh0otuTAjKz82_jrxi)WM zM!ffgz9Z`*=Ipma5Afchq#2xJunX_q)yxE4!W^|7pw?oXR4%7nu#Y}Z-;-Lm`{}1( zT`mLG<(w_n75X!K;ubgw?gM>5m*V-W1|QI$Zf#X>pI(JmOJ8L&--yy`nQCrd8TZjk zndPP)HkC8tHkNJ-*5iBV@VBQ6RK)UWG(QXZT~@FMuytc%;*p~u=7WEy-3 zZ$l^e7S3b_%WKR-Q3sj_TcCDc?YwH>J*lSD7u28L0(C0mom2Bp&AT1^`Wesy^i}VJ zyYX52>&xl+H3qW===WR+?ziip1P+0{Dqiaw@d3Jqwt-JzCiQ<~pXu;5Y=Wwwe&&0p zpWC?5_fFkMUz;)2^_*xmT7e4dP-?eValXKdv?XWh*BUr){% z=`+&9Q^RqYv`r0zQ!=Lz>0X+d5BFy8&3*@Gm7W#UeatHcfjP{ha2(6TFY7p+D z>aWiJ=mXv(@+Ro}eH83ZHD*$i(W7E4rf29@aDV=Vd4k^KuH7R-BSKGxpA6?lbECJ# zZVS$SI-%eMP7l8#(3qwbObgC0aCY38@I%25K@88;4UkPFv@ zuL-;zM?yz}9@qt(*=!BO8icv>li>a^8SFXwot`><8){3B!WOs>u7#<1#f=GEkKTvt zn00VD=ed}N><;e^PYg{AIhSHFe1WF96rYGS+6S3EcOuN-{L)cq(enbc0K{r(BYwZC(=u+QHTc<|_hf%nYb47GMOszLN48wb12>hDokGhf#)Zr$=l zFcEZ(wzguOy(y@-t8;z|Z^LqEgI1}>P94>lBMuJD@IH4x7MU@>^hC$-0tyiF!eA z@08?}iQsUWlA45-i zX4a(Fr1xj`XD%{|Al0IO-ZO{@4RcpcQqT$MYW#v?y!br-CuoQ4Azc!URy4 zQrBARj5w$Q=R-O#O$F}zyo&i1gTB1}^tbzOr}9!kpReoVKyV#3{ww7CI`i!F^Ue?E zLD@6570gu|Lu+^fUZuyv-@Cs*1M0IWYI*xOVY*swW?2!eG2!|K`M9ikngvm>)3?}Xn8uZQVyAasDpt82)Z z*Z0f!TK#V|vt^81M}T{rd-^zP*?J|^Y1L%|p^^XUk5E_Z39hl$CtXj~ym!+x_c{1% zndzjNgzhp+kTW~TwOkc*`%oM#VaaZEh zl2c0_2K&N(P5hehnM$UTsafe+D7WeK-pt;N+VE+3aVCLY1N(=~8^4B)5XDF4o<9cM zLv8@$4PRqTFi&?Lg}s%8JAu~bnlK3Zf^`#f7uRXym*eS6n1jWYbIuK(L1UuM z&>X748Q}WT3Vwy=%+&pfd524(6*Jgk@HahH*082AJI?#id%A+NUip9iN^h|F(@)u- zvI{Z`f_~o4sm`f}uq3&JNtNA_A?OO$-yQ(nzjrG91qIBgETtIIlUYnZFuO_p>3MJs z`ycrKx{~?emEjh8V@`uk;D>ACA}}ud9b7LImXKF+YeFeTQ*$(Hbk~Fa0QXV-=WW2( z_#E2R7FY?(@C+FHx*q9UI-dDbt{uj=gTQ>vp4bkcmgv{?c(sM+;C(QEA4MO11F()@ z9_PMq9_L=Q0*nRJ7_I5Kk1ag5@R&NPzN5o}zNN z)uPp+6X~`1kU5v`U1Q`W3$g{eb2`+tG=)zybK^-*aOobH++@xE)*%UIBd-u4B&Fx-N2EWFoVCmNDza zJ@8(5G4I9Te)e9tiCGbMfc<3VNoqA}cb%C_zqos)K&;dGImVpYk1inEdenVx&~f zR2n*_JEps3x^ePyGU)X?J9~EaH_q^|SJu8pwK{zuUgHs9TPl~z zejw|Z&NDE7ya=qrE(f1G{bHx!9dYK7KI_S`$+4TFH$~es>%V8XXSg?Kiq-||j>eeg zy6y$1Gr!M0vKUyx8DLz|8T5&mXBbCp zfN?Mde2y<;hJt&M_0`Vd&fzy$|ihF-I~dst)>1`-8qmU;i-hb?Y&h1!_mnKwlUO z#!n|OqiG?%g;#>H=PPh4sC}4^8H+wmKT8PAxwq5nQaM#QRajC;HZ!N>w8UwN0m%W$ z4E<)urH@NDg9Lnst}-V(Cwme-A)~=K?!7O=?Z51vn$+52yp(;damr=uEk6BAd82 zd2O<4s%midQ$yykz5>6&X!?9Vgx=sD^KSmT`5nR?!gXPLXnSZ7oDOsI=jI<_?vZgy zv;1cHei#Q`%A9T2lowzqTn&psPm=M+fAuiyYx<5Jg7u&#t}dh>$!Bdh)L|}A2)sYL z<#!8a3)QFhQw>SIsuT+H3WERl*La)!-m<*1;AdLOx#RzUz5uleYk+D{*5~?g7J^!o zT9ul%ag^)MPs~D4bMSkAVfL#Yz9#g)KW zg=ZBqGO(~KTnffenSxAk=6I|yR%jisC|(rTn>j2xELs&hLw~p|a#`ff@SEWYa0Jci zEI1kJ!(;eC+(&$Wu7mTySr+@~9rD^6%hZRKU`<91bS8Aii)bv`7O#c1gR7wl>}0mB z@sxFEpLOe!uDi{^I)WaI26$eLc|HMSlB!@`;AQ4r=r5}msTWbh+KqnoHH;074Nc{| z>0^1v@;bwMW`|jGF9LPNXTf~D4)`9vh5O-Tu=a2Nyg9lWkg=9Cb*&?so4bz~bNS4x zo$L8<{q<+Je_8F<8VF^@;58L6f8`3O4SER5FfW{hAKW!-7EqB5eBe(rgU8s|+T6`J zs9VFGa5-E9uJ^8K-s9f8dN}HU8nXMV{RtOy4wUtH|E@8k^|F4PfxLnqlOCxaDQ8%o z1}`OE3eG0jlh~7}1D-+tD!dMiPEGs-o`d-%oS8Z^b$a^rbRoRUnV7C`li&?_6(8Yo zrN;%miZz&z<^ActY7Dv-iotmBzgcE#z1GsthP&W8SP$lluC=bi#=mF4uCiTa*2|w^ zPW#WWrgTlIx`2H~dcySe_&VQ!PC1=&?#R6(h^-#TeIUqn2QWiLeMtX!JGdF%gZ=Pu z=;6>L{Nk>S7t@C~2ByJq=mo1`D;PJ8h03AIp>@>zVwjdHK@{)P!MuZc)(QRluB+yg zXVcF&EN@ugyRn|=I^2LcQEKqk^WW$t9#tC{X2S7)N(U;RV+Bd52+Ou$bM|($~jyxUo3&t@V zSqq(>H$Cu17@Nky`^vTNUe44p#_-;`j9g1E<2)O4o5|tH;S7|I zmXE3@T^+wVei}H7SHJhCpsz_C>Uyvi=h>knVGy*6w2JfrpXu(Lb7hQ#EkD#DzXMmZ zL9nm67k>|T!SgxK=iCe4`y)Xw!|C``)H&4Gtf3o^TjLr7>NGx+))g+JU)h{hEv*h1 z(^z{vAFLA%0X>haOIHWyK3SXGU%KDNJD3sDh#5^6f-z)MNaJTxgENk?uCE8|6L=By z)4O*2YiplsTmJbXm>h z^5fLUss8Ey>H9PHXEwlt*$1h@tntlo^^A%lAMwp>vOfhXL=Rq_q{=%mYV($W|lm} z8Pz|feoCd2X{HBP31Xm~B|A&HB)SA=rl@z1=B$F};SF#tQXAi#+??#f9K2_sBe=o8 zmU%5R5vpdZW}B2YDg6M9Yrg~cj_FW`8CZH}=7Ji$&xZGjv4DOh^OaHgqw?Fv+s5Y< z&M9<;y=VU15WgY*XzbD0mGD;dt>|g6oq4_I0+xnw5ljh92~C3H{NnsZp++G+1DC+* zPzkET2)qXR80~j?1HOZEz_`ncsg`8UWzXGn@F%tTdd#7`5R9$Vn_NHC+UJ04ho6l> zjf>Qs;(75vciTp9ubQ`Ohk4fyX8C2HUT(eMJOyY)_8^O3p4b%0)JH2S z>BdKD1bR^1?>++KdHWiUho&$bjPL*Ej9>E@>($1==HvR(-3R0gu%2yPbvHZ-Co+$r zNxDgTYsuD<9?T_dmui>F$>wCA=Iq(C@C+Yemgg<`x8%1Ew?`@ZFnnC(xX8fh!05=> z$k^|&7VNRs`>hYt*-h8Rt_{u)x1jtwTmeg%rP2W|4PP2Q1^UCZ(6mq$Fkauv{H_n+ zc5tn~86Lu`q(1BZr%z=MsDmmF8<*SyBjIAO<~b3@gPsdL(Duythkc;_q(6TgbB- zjQ^U0`J8c;-b~-yn?WC3KIjow^RnOD_gVk{L-5PLoJik+9wz(8A7uWz@sanKH8?M* zx}7yV|9$)CjPZ>5CQx^%KyQ_Mq+t&^>juEox8>X7P?GM`%r=V#8R;&68+3wrXcefEX+ z^mC6wD^y!+3&xVhzWQ6t8+<;d0di~5V}CXEWuH^)iJlE(UBDbbzvVN~G_Pqeo9P|2 zZ)^FkCFWIX=)<89j3t}G8fI(G%g)0QS|_U>_8}9#PAWSoIPc;%e6{L&)@qE$oO_M%uRu+GB4-5u3~EXP;ds!;X|Ae%GaA&P#P!nqrv;o3 z=8`vpI(idklJ^4hZFBOD;2L)3zjKF+ng8rF?t#ykPl%m9*t=Y(%>Av$ zxt_VNEkS2Bjyjcm?@#9KsFmx7ZUe?r#@q`bf{yOqXl?XQ@ZNEKDo^i=`JQpsccJe> z|3v?ZI>Y<=$n}vK;Tb`mt~cy2>I~-JpWvI=%*tB@Ixyqc_`~<(4Ke_qW%HtNPB=%6 z&3vmJ+V~Ohyn?3jrtyxTm+2X(1NX-7jVp3l$9n?q1m_WKif)Qd0nY=DMxv2z%)y)l zAB8?bP3s-{lDU^^1sn1<1lM~EecXlv(eLt?#>%d+$a~Zu|KCiA3>c(oN z#^vT=uY+re+Osju7w|2pDa{7spzl7~dGfCBcshpohFNz8p2%8R%X1^c5W~3f4${Ag-I{<*oq- zI8Q>)!7_RS*JRdY_9gZO`H{83X~}8Hw^MJYR)F<$|NKGbzo_|+0RIg&t5d+ZV;h+J z7=L>G%rm{W)VIx9TSrKx0nPz!$#)_~_4sEOA^5C0WY2I9l$u$+J;_BbMQ&<0jR-Q&)o$+Z#%*KMGfsGm;n>;Ej~eA zU4N0o0p=FWE!YTII1)b+Xr;qq!(x-*RB+b&H=H|NKU_b2Fmy1O( zzuf-d3<0%6>#RQe{Xk8_?=>!VU6=uCfAj6r2kU5)!2Y#QKu!83XbY|n{++&HPVd~a zM&LbB35bKc?ofrf18NL@J&lpg z^+a#5btG#zb3qS`bspmeH4JMl&PY?o)k9;={SSBo%!_=6%vtm#STpRB+a>p5<^dYh z+QaAG>Z}Dl7k}sfoj)=(GIR+uc8w8sg?EJyF#qp)s0U3zFU2>Yw!aQOgX3W?diX_< zWGL&&=uBn#j1tK^%EZ%`f}ToaV0FQ*Ia`AnrN*}A#2vxw>{|K_-uMgXQ83mpeo$vI z{{M_~B_9C&V_T_BwxVZ$2)GVdL-T9qU#?MV+vaOEnE|K2NKM*nV_nbnL9fz9&<|>X zz5?^Zb?^wB$Qi+dLEnaX$T8@|%%!J59qYf^o%Pml;6~^LEAv+7Im1N1{0W?gULA}l zdxd(1to0ngKkU8T3hvImJNIPh1-~%YL(S6OvBBWI=$>NixCE>bY(*pY`dkXNp*ooF zy~^AbV{Kz|?@|Bmm(1a@pLjEPC4ZGmpl6y=3f=3gNCYFFP(|S0Ovws_dYwcC( ztH@^ir>8>4OvhkG$}QPjve%Yg8}zT-$9$X;=t@82Xy`_l@2B95K0*iFsat}1#6E-m z?58n<@J?6_Tc8HBY1KQdskecTU>H;aV=C7W;~Mj`Xa40}X343~MDaTKemn;2Kz%!# zn+-fK{#$=BN89y!4?W4|sphB`mR?wDY;Me_kI*Xj=>*)>NcejFCs#;Wc&>uLQGcMfg#)8_ouT!nlSm_6_ zrf$BtjXo^n3qL;zL%}>9$@ZAfO21?Mjy;MmNKfX(+=;opnQ>JXEsK61`#$zw!FvUh z3nv%O1&7vt3qQdVMNbqx2Is;l@I&Dbg{xr%bSmgna4>$52`T&Hdt-ZJTcTT{XTyDw z`y!u)KMhxe$3l+|zz>!0sM3wQ=r!pJ-sxW0-0OKYy~QReG&@u%zI8p;gHdZ~J; z*_;vgBm9*7DfubqpAXIq=0v5fL7ub~KfAh{uca5bF5ir=Qymi z_tA^#U3aElQMM@icKYq~V9t{3o$Q@-Zd`w80AXlR(ju78^kCw_#BnedJagPxP4B^j zsRx5zx~|NTm z8!$GoUR6jgrbg!4a{=@O*OjWAH=~%{(S8DSXiRr=;-k1@S@NnPCNJ}IG1B| zXmrr)umc~ly;#>n1yEnL#-_G@2es4BVH9(MyMt>-60g=t`0+0W*OQ;|`!$En^al0^ z_lck32T()w*>P5tUpGGTed`Amb1DYw$#CZOo(D6)+Q0@PF@LW&d?k4H<(_hTf_}G| zqCcQ7GtBh-Rs-WFYdx;b zPk=duJrtL~ckJcn9>zpI56)n-_vQJpgjnV!F_vZy*-|^|-&#Goy;olroeg8D@ zYwq>#`)UW~tKM%dVGntn-)G#|2{K1BMD&vbU1!a2Ie^G|d=1He7p7*}te`G7UGRJl|+{bA-g>T=dF-TU-4 zH34I%4a{Om9ZenWguhoWlkds7pbo0{*FAD9y|ky(+t-|WZbfEWwq}k~vsAOxkmQiS z1Ku~$H(}4u*Tr84bL1M7H2A->#7fR7v6oKXfI%gLO72M9k$4(h(^@54CG{HI0*}G; z^z?L5rif^)b4K0sA<&m`7rY3M;nVvV+@C&VCLb2LW5eJ(xP%#Me}KLkbrH2*YvW!E z^(Nz^$KWUw#qdsS*|7aw5jQ+e+C`|=6UOf^Y0o%8IxS|@0{^Z zn3HI}sE)W9&ZPIH9jGDYfO&>-2&s!>H_Ev`os~H&L&+t*I zy_^MWKk9})8}1X`z__p#9$MF=|ABF}xnpY>4A;R}&b_S9IaJ0;{#vbRH%tNbbYt+Y zFcW^`3?qG*{`pLJ6V|~jaQ$=*>;i}B576uO0W1XP?0C~(!8vz-Ge6UQ0(H#Czz=KE z>Z1CZ)QQaPHi0_K1)%qD1^mst{12#~yH;2~_ZiU#H~i4JZ|T44_AD+Voh)+Z~gN1%TFtsRvUL15B8CqBY~gQ>tG(; z0*w94RaU^6V7}{mtyZb`&e+0d-5wxc^Db({55ilJ2gXFkNNO_bs~>^&GwWa9g0--< zcyzkae|sbkq=S@V_~(>JDv(O7{|U$@s1&XRA~K^SB>D-Pszavq#V4TpITqH96}6hrnmmeO{kO zC?^!0c^Vb6k|L0r`@)-UJ>xrzy}6CxA1 z^K&BxZo}vwy&BBjbHM+%J;APbyO~pP1#H0Mtv=;?VIJ=~P!no{vCc-kGivqb;qK!_ zu>08VAg-)I|D`#m`%Vd{E4prc&OGl|z}ndt@F5s`yZ88ahd_6*?y{f$H+3WT>c>Hk zt8tK?JD;#?+xJRMN}r|gz4_U@pf)uWZUVJJYq1UC0x;Ke9dh4E!Xxx7 zwFK85a<;U~hk(LaAV3}L2_`HQt}_gZrvy*p|$ z>Ub}6o~zHd_rJPwJMg}L461?Jrty=y`>f2Y;QWGjlkX;@HZ$3fCM8|}N{<+}%l$oF(uPyzg`cqHLoS5keu2VB04bJOujk+Et zmQD<2Ik}E|9nboAp3q)q?>$97&sA_dxVNe6>wU7eqUYJZSYs*kKKsPec!*)u_~`jW0&PG&q~t#l~9d+V=XYLv;kb08Oa@TA#ZFjHSkdnve0>95A07 z4PO60z<<~Hr4(F;%(b?GH84HC;Y>L5X!_CgdZ?PInn}U0*|E!5z2L3GdKyQk_ z*7xPyL+dIxl)E9QshAJ#qep!*s2jPTy0$sbXgB?z-ur6cJz;ywJykje_}1&&QvSUsG^R!4}TL zbVf?ug1SL3uYQsNu>mo2JUt|jz`^nd%MU(o@NtVOE~+@D!k7vl6@66nR^eNPwF+t# zEQl?LjgO9xwu!Wf%nZ*ATle@O|A&0{tJa`KrvC8n10Q&MdRL559tG=-u613QXW&}!Bdmw2VBT)LYrfur{_I7})wHI5J2T_m+wKPA zO7Bzm!**b;U0;Q{wRM<@;M(T>rB){kz>Yv-=)7xd+yxW!($KU z9LhO#*}=;W-Uly2w?o|y4S}6--{Jdw$%khgnQ>$w42ADtZSmS-eFc>gl@jHX<>|az zlH8fvnYuoGefnc~DDzOJFk6@{hpEp!$-K??`cE(qa1S1UuOY8oUf^MUpR=&jV4hXFFT9Qsu*PB?&3nyws2ODPGI^Ehd20tv;5m2&{Ik#DXXpeS zp%ARaCBZl+3txh@{dsT>9!xc=N_e8K0Xg-?8zreGu z)vbm^heRC)*(K5?(wI5bJ3>3?upbe+9-hyCK8US88Gthtrz zgc_2y*Ym(N=_^7BzXNJ{-UsR{*1`1O=+jV3@qW4htkYR@ za87{wzV}E8JsIxbY9(r)#Q1a;9}693lO-N)C{ zt9=<<3)VZXW*+Baa_ZL1ZStB}=iiP`&9$U`tbMFYyi433IcGTi37!7Mx!?K<&V(nT zPed;O{hECveIpma+VI-&%FxPC^KkQU_fYpx83~r}_vz$s#@#o;bY?%SrZ(;VtZ%`b z+~>?XoAKWZ*%z{llZ%se6Lo`g&zdHiCQnP9ma>@tMe2*x(DcystB``3nVFflvu_9I z%&Dus0X;yyyhT}yU`|s4|6>E@#N>l(jd{ZZ>td!+lNnzp);UpF55JoI^J zOKeN5b-Z>1TU)q)w-2D<7c&u})UzOPG5FD)IE8I;+` znJAN!latAkWJwL^QrxBZS1>kuuK2m)XG)$axdv_l6N`iJdgAq9eR?qYVDc^Km+F`L z2GrFzq&KAh$C1;=`B@X`2woqV_ZdDs}#q8dOnO*Tr2dZG|Du}%udZtEu+7-Nu~+i*b6dKU=`;pUQ>Dv zu9iPa%^h4v)H=<>jQua8N5QpUy}B*@3@72&a+Z#Jm37=_IQP%FMAqQUp}p4YK<~nC za6MErH!jncpnpzJ+(G8=8e@&YA8brz-PpX*^-$g1+;KBATh-5vLG))DXX!I|6}sZb zyYJ|IL5`uXO+T4FyQ18p+$GF@*b~|ldNT54WMgz=aK_3x@pIyf;jMzV3O)kkDdVX2 zPzhd(zZTb&J~TEoHVB-5c_N${Ig?8H36UDiy&T6p%@g7$#77p5EP4t&-@yLhmhqPH zR*TLs71)4Dj#o5aHv-`6JWd&uAaaKW1=t>RlSn07~ zwt#Ef8Jq!rIuwERh3#li$Cn*nwwGDI>QnyReWm+K3(E=v-Mu$D&rEz!JzyoX5VBx= zWFBf~-mp*dDDXAZbOoS8f`Ij&?} z$%rE(jx;^c^uX`?e&07||D65fp!R{<2hKTo&cS~0#i1__jXOND_fkN*m|_^}rsI zBQOotz&|h$Hp6~c1ed{XH~{|H8&Dly{kKn8)63mnVHSMLoP;qj z70!;F9r>!@tAf#>S#2#SjM)$39&#r{!jbT-(5#R@TkTNoV5a-pytTnRgq!g%R|D&O zdP2QEN&Mg^gZG7A$$RK?JH$+&s`P@pFS_^XU-}eQgPvStZ|^NV%*f5h)DzSlYttj; zd!a5$=zmn*ejcd%ngdviQm3+hr}nZDti5h4-Ns3>o9LWa6FhUTaVDG3!x1nq=?7{! z=iw1oi|Pl)0Oon_>tAp_!-3obxivX^*R|3i=3J;C*(3g^e!53F}(E2vGm?x_V@n{%CTjj?v8PS_82fSRB+ z1>;_|kUn7Fjrn+Wum{8%hI;ku;QC;FZXu{wUI_Nltq1>24dH$G7(RflPzB$Tny}AN zY2K{+8atR1TbnC{)9J%ZLIU0a*Bke}_3$H1E^iY^`3uR8M-R)vW90>IP@i?N9Hg)44+Wp42@-Z{0(whf-s}`2&Z+ z85+JO@4z5t_5KEtbR=DnDX;}5(=6MJZk^uQb93i1`L9>508VFba7`QsYVqa>*6Y+X ztYdj!`8@r1Pq~M?=ezgozwzbSP6TzKZtyvL2Y16=V9&|va5Jc* ze?@QqCtwdsJG|K5AL>ok!ak&OQ_MN#_Nl8URb|F*4BErT%mBCtHh}*=8H|gb06+g2 zs9pJe*3{I&`+z#2`p<5#M*|ym(3|@yvv|J&>vL0~F+2q3xcf`(56;S2%9KGp^449| z!(WAR;NEAm>blEQoQ|)_o*9n|5uZ^k~wt4 z;8NxzISbI4p`AmWLv15%BlegK;hf&-@#*n)h3yKL!E!hVCf!$ovr%Rj&JNBUcOGvr zV=mr1erxR3SVQ&fiSsbs?t|&I@Lv7+dRM z(BGlwwF^AKoQ4Yd74r3#{~r52wlBIbx+JnB$j4WPR)*f?jJ0*l&v9)V2wR!=V2#|_ z1>T455o)96%jy^P!MeY%k-4sU-E;6TxMsWlSktQnf75SgZm}Cq;%tMP;TI-Z?}D-T zq|Smd@E|B;?gngPfqq_(`kOISFHp;R9Nae^gh9{x6=U@; znawwX9z5f!BlLL_${yc{Ztp&3o|VmHGnLYn($@W}C#xqX7f&u;1;0QQW}!GcuB5o6 zcn0o)Z{aqmk*tABe0H)oJOG{dh){l8x-{4(c2=3$7)y;RUZGQ~A;7+uCYw6}^dRC2_Zh%J6 z8O*z^&z;0fw;Mr?>2_!g<6sc<2VSoW8P?v$fc6+8Id~*cNA6y_YeE&?|?1gE#bdIf8&lG8tPHdBbeK`gIU1M zU@*Noh45|ZZ<#7Pr?j4@7nsFsUwR6^g88!jOf^9NkA95U*RPZ)(^2Sm!nqPw0U%k}0{~6|cm{Y2Gn5VZz^DYanf&Fm-y7%aH`ljTYlG4XZ zA9s)afOA5BEch`vOFR)tL>MCw>j=(|I{;JSQ{v9tT^U~){}7%8*NY{f&)<2ww4_8g zL^ed;gKgn$;SHe;$~pZ1hR|=!DOPhdKdTO%@;c>NAJAvA4bSe3QZsOX?JYG5yf@qj z%{zVrwcM6qTgLo?sF<#pUIXHP{$q~seP%D5pYOnV%(ucCa6f7S z^}wE_^Gcmpij?wr1^VKQpY&1~`S3%uwe|CTN{>=TE$?3`I7O55~&zEypJ86D zC*wP4gg)2@hJyEj*Yj^+?Ry*;x2emSn+`>P*$LLT^kO#Utjv+{I-H2_+jwX!Bw#NX z2dS4^a~p*Z*tp63>NM`)a{1+g^H|(3&9D6Y0jLD#U*6lsPijqipc=!9ycI#u`Xl(u z^>Pn`zHl9LfAle!UwMzMg)I2@7*qLu`mTn8{xsK{-{~c@zUSZNYcT-S(I$bf*=E=W zK33zS2~Yy+JwEO};B(=+{T4a8eFI;EHG~W3?f3@&V13R&s0`1d@rIx^v#lF|&$Bg~ zgV}>w&z)ET-!t>3PNq&~ElkT!3v{e_E}mNlr%`*F0Lwwm#cqL)$2$f+vF^vlYkL2GV&cR%#EiR{e={sJEc63? zCLcvVin<21kGGG12A3CJUf3QkhM~{|Y+O_bbdHmn)Z?+oIbr#Z*skcVXd~DZ*%YY` z?}gtBcK~(qvhZ`k&jk8C-B#x>vP$J)coP=d+A zIORMz9rR{eyLO>{x8&X6ECXX8^`ypl8q}UDGl$97=M#7ZHUkny$?DwdT(gp9f!}<7 z$^5|YWNlBstNtrJ-KTK=O%u2s%n2U@*EL^X*Sq%MI&A#(JXl9DrnW}68b*U(ufFN$ z+|$f;-h>-K-9UZwcVchfj5qB2c?9&{e+{*n&8x;V6^6qOSPkl(e}LXPbxPyFnYo#{ z?%D3yWICDti}P$+gR^*yi>$}hghE)6Sds8^_5m9got8W;*#y1>XE&)cZH5ywCuVv> zLonaAwy_LeNxzb|*QFbbf;W$`>)+W-q#?MCUt|L9%R!tpreI9LKahecup0(~@Aqf+Nh{dO zx#K4?%j8(WvEX~G=XHjbpgww-vox*uSi3VXP_wECXMnNOA7K3Ax|q&O2l?Y%&bk{3 z-b8u}T(_({o{XpcNzkkHGQ07z_O zcooOt6~Ww;Q<(8&&C2z}o&oDb-b?OJYQN@kgTeejooFpQ1P_4MtFgbDjJ3S|@D*71 z@}Ag;4^h2IufbW=@ZQ3oZ60OpyQN@D!D->s!h<4%B5k8>qnE@k3Fhu5Vu@Hc&Ka)< zSAsEBQ)mf0nC%qfZ3;ArHiZORzH*LVh~?-!OT40;96 z#9R6y=q);oZ@v<9Dyl&XQ0q2cuukRI&jn)#VKx=S6_>8)73uXggamnt@>}5(``AiGuoV=KNF;xhEB>zZ` z2R-7}y!0m+!}Q?H z%ZI>q!5r%dxS^Z?O~9W1{`8VQ2gXu*0sf!|W)irM8tYVKZh#+KtFflPg)^I62dwSs z4_8a__x1#9ZNtHwvkP>CIS_%4^zZJ3W_iu>)b!tnBj9s$Cv=9Mpk8R4Ydmbctf#_S zMJX7EKkY{F^?w_Tjkke0yx!EZa6X*K+!UWvUdmw3skM*J;5Fv`rtYb}Gz1#LrC?s? zUj8|L9&-fs=?EALH%&E7U7ox=*(B8@^-uDjWQw3(U-=IKVv<2?*&Ss%a^^gXSE z-f%li2lsgM9PiOF;5}(Pbw82lJ>1jA0GVx5jXRK#1zsYm!ZibU!a%6I(Ca9YxLWxjCdV4=(M!GeQcVHNt3Fg_~ zQk(dKna65*)=)2l&%xZ{X*@T23hn3G2IWeXD`lQ{H>k6@Mj1=o11&)P<^-^obuAc+ z_}`VxA9io`ac==*>Tcm~;f~N5&SJLc8=OU@c4gmzx|K1*L*VPbl)3-LAm&)E36nry zfccv~hZms^=*8#?dM?d1jlaf13bTWrCi83SamGXDo7OM(z$c*hL+#7&H#T|+E(T*N z_Z!zObJ`z3&reS<4mJ-g0P7)MPZPoGXBVhB{f)oZ?=x1OhquMpsTi!koB|6$ACZ2S zCe(PX_3CLcFK%DbzT_d!(KyH{v18I>(u_q<-3|9A?oWJL{AuxQP;c4>_Vbz>FD_nO z{Cwj1#38W1ZXwKo#i_+XoU}5%GF_A{qLa4;r>$(rE@QUgQCNT{?Bt^-2VVO3=`{}> z3z=OU^R+$?jOW$3t!CV}n)CHA9{SN^r#@v|qc&9b-!qJz(QI$T2VmW}2D}Hif*M6%h=Q}^=7YM3 z|Mh2F4Bf!k$@omKx$)YE1s?|IPQA}8s3$o~Tc9s&3FOX=VJ2_LC-jD~P6xCgi=U0wR>(&lv^fNR@)(9h&L zre0t@W*vM2YHX`xtI2#GkJ&u6IkK54B-cjPhS!Gog!Y7<w5bZ~AoX%dQWu)vg8qaMtip=nckwt~LJsKAwZ1 z7s)!>cIuMW{nx-R&=<_T^hoLxD1sYoj|*~@vz4>Xi90cIVqyqfn!GeQJT;u?YF4UQ zx>@?x%&oyJ-ruvo2OggJ^tJjs)vhd#sC(-nS6kE*z8%z_Tt6zoE#N(>*5aGqfKT8) z&`YA%PMyX5)cLCBXU@#9H`DdKJbmMS{1m7ysfEv{&)oQ81{he zHRmia_Vl{&IxucBrn(C3WpRy~0&jwP)otK<|0L)9dL0=TSeLWc*L!n1-rdpgHduRB zQy2o)0lizLC==l-ugx2teh;cZ2? z75!THE1lV26pn=&a4>!_ejl6(`U&)I&Vw&Gzwal`Te$;6E6&t=W{4^SgE2hi)|8l3{~r$6yM4uG4$Sj4c9A^4nD z2R$#o`E_f-+}i#XV@I#MZ#XAmaBgt!7v_1lg&Wg1rmYB*VNL67fkx!ZDI!(;FxG$?6MQXNmM z`;jyLUIt@T<3{5^Qpe-gV+-+0c#qx$eL=0s^;KQw9+(WqOasB!b$NDqwio_{<`Ac6 z>j7ph`Wkr;=D=L20zDfwnae+$UTgK~m0&*R9=kekb#R{CG<-_#>!U$Ud<6_C7!qhp zl?p0RdAlk&tHpZX^I$EnfVXshI>;k`r*Cf#oKSEA(|yYojKFub6uQFF3wDe|dhdXs_t0u~TC$qAj8`IODA{3=R(t_oE-Z z3@2K-me&E-?=Lws&swl~sa`652YL$he0rZ&f=|FYks8(&;C(b4{Zo<1J?5tHO*onk zhlfRmMU0I`#YP47xL?!sl=`sIgUpQK3Py zUXa4`?_Q-Yxs7vd%-P+uSAzHW$Mh4q|6dE%EZ=}5$BqPZ9i8K8E@R#34DhiS4;tJ2 z1jbWp*d4(BK-U^IrjwuujFlc@wm>z=lw^Xu_iFlHlh7LMYtcKPt1KyR;cmh~IGPE9!9QvKp8Fb^H^*9G(mw1)%m5?qtIhKU9JQtMzj^YHqEansvy z5?;%dP%Bp}cYVqA!P&{y5niOmqbEZR!n%)Z_nn*>GYRbRRaY~f*ny@zi!)ps7d9^Z zojDoyFHDS0jLnVCWeV?%=)=%H(mwJCEM|6?vDog=Ztk3Zq2J&r%>nL_7eZb7c%OkQ zA)BAg$1+pk{N2Iu0GRK&ezXO(>6^i|pbc2pe-V0tHE8es9O#Rw3hGE|PU?O7(S2TB z56mrn-tPtTh^3(JbP{KLKEUir<0RL|h2Z@mtzbAfC&hSYAYLb5M`JT;}D)%Rx`KG3Q(0di5Gy z2Mo^OE`+loFgyg8Jw4^ygj;FVizyk-4X5!+-sd zzj9`eHEnb3k)Xb;=f$=DQOxwXTu+LCynn z{jb1UhxKarompT`sb*vxrOxB?8-{JquW4s|XD}Chacps{ALOFB=-r@h?%RWr2O~|u zeaQeLQ;-S#ZCj}Mt-(is9URL$Mu+yeU|+U2@k^IGPT4wW*4>jm%;kHKKSQA{lfUinH$+$Ha7t;hFX;I$idvf zoch!25CZ?rWMLENT{7-@0`zS>1Nz0sKzZhxxTp66W2a@f?@wU{iffs^%Vl8Q(7N{B zyhi3EAA>sgxuAC62&#a!M*ZckJNg8^fHOJw)W>sm?&{nlsYg<;CtpvtO0`OT2wgK> zGlyY#c6hckK6W3Ik5#{@HA#QpbZ|Y}07LQTsxcUcm*ET;ebPs84`)hef_vJW$32=Y zD5yO(z$g6-xR$QRW9HxH42w;=gBYuBrf$ala3CCj>vGrST9&jd=>k6gJ}2tJ#K|k8zHXvE7qkz09~|A2ms18TUMEYPUlhcn_?hsX@1mwT@C#TMd=ISUEd#wzYVYP?-Qhg2j(82|fwVSijAS0+Yh&!Au5G?G6^xHQ!iQ!* zoBND=i}l%wunF43b)~NhW=TASwrE^sE%#H<3#Zq~oa#cb?rRKc@O>&X3yg`*I{t0mZe-{)~V)XMG zA54XnU_7Ds#afZ~w|S8H&RQHd<_k~Kuhp9wG4@WE50wwS0{>%H^7PR3kgvI#wXv$3 zOi#{4Zipwq8r;RL0OM8vY zK$Atj%=5k(1hpUv?oDTc`{!Qf&8d^W1n#X1z!+*Wdcv_3EO zLcKHgd!}JGo~v^7^}2_5!T&N1egJz?tj{N4C8%>h4{8Zzz_%|!-DeeS1N+?6)o+F= z`BQ?~mxuBX+qeN%lr!C?j7L$?Asi? z4|?#eMNHtV1GULsoJp+qZ9ZKguR;*p82bza>uPFR`kAaHsvE`OEYPQ*&aNKf8dwSa zeL>!WU~cB@yxGBAmf!Mz%i9HSgL{nem+RokFbLFrnuD*exv`!Ry&`%so`zT89r&+S zVqMcU)7tq+X3lsGsdpOp-vxs}oiYsOI~_sY+#Jz>jl=%gE!fWshTn~GS_ArrmUD1Q!`EzUI zYvb30eoJRJb&qzB)&*mzW#MJvdT?v#R=V0x3B6wMdhptM@2$&QmuItwYn^$ud7bqO zdrpEH0X1WDT=N>|<(b>Kw(9RPuUbqFw-IK;+wcNh3U%NcNKv;pZu%AOfypoumVo=S zx$X7L&vkt^?s^{FyRGXPi(LY}p(hN5ws048hHObT(3H+*POtHszOgsJnCBVLpYGpP zo%xyes8(PmuOGXoG{&o`C;z_~up?UdXwbXwzNFsknphR=V=}+-e)M@TCeoMbTKF~R zm#cf3r|PAunyDHL@aUN8m>QcNn?93sch#6H<|^g}!cnlU{txH}dj)(he*}Fm`htx4 z)jqxF)j{>C8f$&STy{0+I(WAUo3aNo2Qu~2_0q;er$GHg{lsISzp^hB!%r|hIXzh} zRW3MF#hDR$UZ%lBW=7PdZ~jbp72f3x(V8VSgPAl)mO-xl12Z(#yx#=(YHLEDfgT5I zNqfP2X$UNb>7ZUyjatqlFdEb+{s6TDYwxZ@t}E8@j)7}XeR@px=kE{V`q$BIyMfx& z_@ePeRm)T@<5>sxf}8-=v|Ni^TWf;rYah4;J^|MVV<`J5T!SmY?V!)QJ?B5^ zt#GX_!WC)0ZvLfT*4`6in$l|7tO?J-7I0lqpZp(Q!7splN=-*!hB-_lma(O5Ws^f<5D4}nj{y~G^Y`$7%a*uXqO9oSsNd)Dh$Pje|S7cuU4 zKW$7c>`u;eZyIVE%7(My!_0vj9UUEgHTG)YQ}SG=J+VDZj@upU5bqG*9@`#k8gCkJ z9cvxT=XE&#nUOOC&p-{d#2)nP48sSY*0TizF4{m;N*Fs~?#urw>LQ?S2>nmx0fX>wtNc z&&^!8oW2n?f8(O_flDgbi(PZ9)%i2M$E|se0pm>d@eer5+k0~D(X~e>Qs2{eZB4D1 z8FN0ydYohZH#0+D#NTv17>B6|`h7cL3AnC44g=vE(0hL=UN&D}Z*J#$WbC0{yoI{yS@fO7!B|N@ zv-#aPP}_ML%<&Xg=1?Cq58DHNdoPwVrTaXQW-fKBmTs>kQ_%;9FLHG^UK~v@w z_!_Xa26^1i%vSO1%>{-+OEB*F2#kCGVV3vB==o>o&gN9~4n&~ka%usE_*(|U4E$?e zqvlcz!Puip=_-NVWB#B=z}Sb|tF)Sv@zi!^?KkC2hKIm)Ph9KN*^R-xhU}-%)8IN? z1JtIhb4-K5%o4wd8lE+gBx}s!7iNEi5 zaD86_-a8$^{@@m1jASnD+Gb6{wa}QRi20ZLTU|fZ-=AR?runCJ4SR`Pw=d$%mrLMm zP`9rIu5InW>vRQdg9h|D8AI#^{if!hk>ioTE2j?G9n{6QfqA2zTJwmT;cA$9Y-Zq_ z*N2dxm#{~=NBS~26JE}|oC)W`bfL`5sj2DVss?LwYjX>;3$s;WJ2QL3&>+r(yOo|Lb^nxp?-0V<{{rY;7P8P}z1nQBY}pOk5xZ5_l)-E!S>YJ5H67x1-o zPjbIiUo=+g%Nct)*1iOs*COu~wf6DgdNK*@XE*mYcIpBC*BX+0&yAeV=Y4O^ zJ^-9o(G<$SPw*664z0kL$+*kdSRH#B=zH{9`wpz9l!r2)SEUEs2JX4OM((@nDPGsc zQa!-EyCVG$){@=Z?T4@~Zf-Lcj1j!>d6#7CgGxR{#l zbWm&B!1;jsNUNe->S1`8nIxi$xpUj3@h|kP5Lk-IBalcpRa(0J4G}i=wm+QkG=99h-uDkAw zYhgSXcU!;J7iD~K2yOB(_%-J0=IB3z{lD+v<#`yauRR0$n7n>_M0!Ma#C8OJ*sigz zf!E|b=4G{k>YP>jKC^^A0r!1mhXbsLElS1cpHD6F{JtLi0p{$ zJ(+tlZ>8Q!sU3Nq(>vhorj5lLi?2vrk$4!A#mQhU!R*BBglkk0*vE2a>daIp@J#Z$ z>AJyrbSp9|GFN1;$o3cdewV{uSb#_TL$DrTZf!p8{$$*#cDD=WLj(E(mxI0&^O&ai zbVk5(xSxIp{c+yoXM%ZEP39Tui#Pzr627mlw+Ebep~i3?eI|vV#`7^$4?5GU=YK(O zTRl8X{`+R?W5y@?VAQbu8g(Dzv@?V3Fn{yto8rW*M z3f4fq()CK~2VcRAJ#}{D9dkZ=QmumzpqF?k`1#tL*Pfyu+|Qc_MM_5k?fqk%-d?K@ z;yX~I$}gQCtc~O7lTly)hxuUcBj@4wRFC=zP39HY#2J!Rk5@hZ1wCf2LDtlL5NfyP zQ108_XL|bFb6wla4ZTl&E_@yKa?ZHxx^;@?vF5?7lQQu#!8t0A#2<;bEo@s@6ZBSo z4|+;mvxaiU@0|FYIO7gac&Ge3<;RyBU+%3F-a4UCnMP&GF-zr%!Y2yjye*0@3hIZ0 z!h?c&ST0EBlwah35zMi$erSE+a!^k&mbwV6*QqDFR=B>XZ5ylH3dX`WfOR)#d5m{{ zG8hj%0BTJ4gL>0xV6M^@UIXK)HJn{ggSoxt77g(Exwc#9yAUcvEpT5q#;O8iz;*MZ zl8*up`up_eTL)CD`T*3T{F~Z={w6&e>QA#kfy4U4Ot7EDJkvNqeuTkr0kgs119c}o z0Ir$M!Md9{@13B&I+WVmAh1T_^P~5``mH`x<4)s^+_7BHt1=e-+r7~1*SgCX@Xfl- z5^yh7Q@76R_xZCE^l2JHS^xiE;(v+Ti*GMpb9l|+4o5m1seics;k}3U9_o6y>*4K( zwjZ)+*csYD?<2jB^nn8~sCZEElZhvT^L#xs`qk8{sXM^FmnG>X>6Mw4!F-2N*-_cX zxyGEFJKaAy=X16htYtn6+u?G~?9u;e0p)ctHrNVYFPAX$TVGKR7zg%tc#)i&e=g3z z<$+&uI5WaNf%{=Ic+Jg)-C+IRI@@{pjjdfj1nT0(Grxhgnp2s1auIx<|9O6M=EFS% zH^HCGt1~{E4<|8q#h>jOq#xiE&@1rY?>#+sdaO!Om7)-hXqbgWzlG9%lVp zeH!T{m?77Xd6Tb!*P42Q^@Ofq?Z&mEI#^TM3d7-Bm<8sczA#>E)`!jk`&RWQTW2%g zHNH^;=|W%c9n4NNkI?UIJp3w@rGKMyNoP7UzTkAn8NvCq^O(tB8xAwb`4FhhY+?Su zyPOAlH!~Wxy}?BJ25vgcRw75zwx{JI=#bO z(8l<`KSG%_#&wUi9$>$Y-cNH?b$dOe%ivbd!`7#xC+-ulzN=4PKhL9ij|TU#H7(aJ zW2kFk0Jv@)p$E;+tBo(@jB9H%##V>ncl_G=D~*v(0`n}N@O}8yNcHo!!+`t&fmg}c zsRO8M-vh3Tt@2w1XU)198Y9gCV=&)0{<nqwUG!h8 zi66o9ac=2z1OJEj?p|uu`u*%9+?UyxxsbC*XTzw>sEm2|T4+pP)|=pZVBPRVXnCw9 znO4QX!(uO#ag*1FHE^$y?ey2}hTlO==ms!W^56Z~bx!?nBlvv>j~@*BfzA88j@QB8 zo<+*iXn*VfX^V;6B=f$OjOk?XbV&UefJQjap08VXC{YM2FTR(dCl zn{ESj*g;_IW$a}AT5smZ%;1O}jRm#4ALy|&X7cAg47WgKW{vy%yMlE*wRZn5@2}fH zJ^to@&jK+=@j7`A{Jixz*EI8WwO{orb$N4aYb3@>&MUB%XPrO|&b80iH6Ppyp9Jf# z_SqRT*-M}%FdKZ%^u!s5y1-tCFW5B=SvSzh?f)@9G#>GN7m6mZj+#Rj-_+xr$#ib! z+|0Q2xO6BLO3h5p4D|4w#XF1dg9nd1cx2e&VTUUptbDNQ-&Ozq16mwtabVuTc?Vbj zv-+R&51)Uy<&l<0Y8TfouA8WvsFJLb?3?PFs=!>#`kDHfA7N&8X7>Hu`?(TO@0$Rb zqnTjlqCO2h5nkiQcYPoU&Sf@UG6(&Go`QQh16n=8b>m9TwoNhwp*3g6HG`>8kCVao z=I_mKL2svVk9yJ$r~=jDa&QiT`jRnGB0mwtL6BrXiR)AW$ z{u}2!xyJ9KAJ5T7bHTn2r>9Hrs-j}mO3yr zFjP5QIs7hXG%k%Ujn0eBi}i^2pgPwyelNTTV`F23v!2wNzKMMkyA~!#Cr33Zd=dE~ za+qG1U*QJ$IrMXACX6Z=6`Wmx%$k2DyoA5s*TNdY*>EjvEVVK4Cf|+M*7$SX1kFpqj% zW?bfLIF<8-euhIZE;lY`4%Y*I2G^P-L#)+VvhW)i%Njp5!Y^rWn{lprzI%`Na#QFI z#=XYI1Hjs&DTC@&>52{Kc7K#!A+7%=g{f<}qu)eakgx2eU@}Tf7F1r7He={()=MYoJ!+y{=C{ zADP#(H8Ag8dm)`OS}#&B(v`DHcGKV3hMqg~Q`h;uoUN_4y*|A@y)(5lnt;524ac`dkqZw6z-G}!m2hVmBZhw%RF4YR;CY#Hb0svD@2Td%XIxC8VU*pF*W zKNM!be=(IYzj>hhs(x~HCjFeoU4CreT5tFp{F?7z2;BECec6rof;I7{U>^AXU{C|A z1iqaIx4{NxmQ90Sp&DL@H}Gjs1!Kc*@B=Ib*JJ$xpMkZxC#aRZ4%YHqnc)SSH4_hDS5Az?k?G$iN%)T5scAodMw9s}58XU$A@Ocrf15h@zf) z2k05Nkh#(3VdmRv3@1Z1*o^036*NEIJhAA3LcT>QEC*@b5pP6U&kPDP!HMih=HYzo#P zYQVekcjNnG`(r&|d~|%Y4_pVoMShFC0kiO6TBEoOriG@3T7r9uxup62{=EIct2mc= zHoj)oG5-Yb(`WD|{~GxOgQ0^#Z{87R?HC`s*Bk-s&<#!ob$qp? zp70g8F1bHFLEU6MXSJv&x^5XCJ%OiE4g6g2V?C9wjn?V(qZ%W-9$H(`r)!+;b77or zo@i~xd)Iq;8u*+y$A_n+t?>|!xO*!=4;qMM_Icz1p6d^r9SEUuE$i}*mdX>dd4=xCa|7W#5~*jFb4k9d93NH|C~jS ziUH!AoSRvLIVWwQ9PG;96~sE`64v#KU<53KA@C#kaYfhy_JqC&i@^F$U3&1W>20M) z_cO2${J+^v{$ArOe~&Sh+SFy>{;bB;1(1{jEj^MS3F5xRd5Z(x+;#E4^)R0|eNpO6 zYvDusOuo+lI)8m^eav~->cDEi8)6%Rvmp^-IKWR31Km<#$ntOe=$ zJ|8B5Yohs$>yWkU2S80^A?Ur)pK6R;o_>2{wLh6FIgP#<%UkZO8`9AVb^dGv2 zTSU{aFSakHm(p{dZU$qfTVQ%@dh8Xr9y&xjL|q{MjQkm){LCp&Yr^ZG7=LpINK$v5 z3Okugp}%A{epUD67eLRc*VQ{*%TU>R0P`2u9b@k}-jJ=-J-XAc}XJbJkRSz07gl7yVejtGx*7-SQ*2X1hnY zCLfGfDF{5F6WwY16&1r$ivi*Tqj&Z&W7n=?M?lt zBCIXFHkhAr59btk&AV?FOu9M(sOhobK`t&e2%;h&VU8v`Q~e0U(@NkG{!NuuEk7>Gnrqg zR#Y0SQUAhB{9dVEsYak*_E)HpsgZdLW@l$--veW2>qn0<)20`F6`w#6o|$jy<5j14 z15N^co5o(oS*~fff-#Z#i2h&e=$(&u4*Is6=QYnWx4tfXUD&!=&3MfqFKZZY7){#jT&L<_Zg&AVi{P@@Wifkv>%o-BlpqH_Epl3*IjJ>$TJR~S47?lU z_U7Dw!&6`l)mpXB?-k&^p&r*9jL)qNo0~ijdREnV)5p?5EnaOT$<-M4?Ky}@R@o2_P__Cj_f+1#;TXnSgJDEr(({m&vPJRjylaf$J!*ZV)bUcse`7|rev`XkEnG^jYyF@xb0Mz=btU5? z<1BN^DX<58E-T?#bZs-9bWdyo6QDl~1Y=F_@u!%NX$@H)*$X8vlzf`~G;6GMQTn1Z zDQ@ykcnX|Lbrv`av^?Ab&%hY)?e65=L9FEb!)>W;9$%MgpKhOiF!NyM((I+#Q{XhX z5U@%Ul`YQog|ToUxDO1?4$XRh)Q7X+DOi_Ymwq_&aHf5(ea;%9bGG!4d41c5Y0uyk zXht9PN%$hvUd-3bx3+-$n8*DBg_Iq&ZG6Z%c64{ zSA0eO;Cj6jFNW)h{;=i|h&GRA!8w-Sfg1UW*oxSV;8`kqXf{VT2WMnDm*7NrCh|;V z1WXN24L=`xKD4u7XF(d?f)n6d&X;%rTqj(c`U1CIFwe@p+qVyyKdX-LHmEVF1z$wp zy|rZH5_2Tic6H{r;eCCLXx7% zo|BuCy94fomf4osUFltE`@FL_%rm=>m}?Av%q^T zRuU_*r==q2tW*O1p2n}%UG2v(elR9>JzNR22L)J@Gj3FGa_v-$)U*8wa|n%}p25$g zw_AVh^`N)zGpI?AgSnaY0`s#~U`%BUrANj4wO#3UrB`rffipE`p}+W=d)=z_4S~Jj z^=%!iGV|?S8}&QrN4-3Id3G{q7wk^$4m<#Dl5LVB5+gjuAehfIIWal074$Q;O}0%o zfE?u0thP0^HT4DTNbg8DqgT5Mz4Z3NjsSI-8$r*pbz8NTz?(!Ys6XH=yvNqZ?|{?5 zc)ZUX*Z^RT0( zkCs+ba+XSe&}(h}FdJM)^{A}|>vR6xdto6MTiI87J6s9AemlT@U5(Iq$vwvXb}yLg z>YX=+z7n1Wb;iT^<=o@F()9kD>mPuxpc(W9`{T~$Jm=RyUDSDCYT)V#>YZw<=4_u+ zt2XZ4MDO>i)T-1O$up7{rY=l*w%5a{hl9Pyy6i2S+x$KB%=XMy%2i_W$uK&T-pzdv zURMq9G`qLgp~q|*R0Y?xcBR^tdW>_i3PJ^;;&5>=Td+Z_L2OujSiCtL05ztDMGcGU zz~REfg_~dyyaL1H!{Z(hG9o@Au3qkWEc>JT13kP`q*Fu_@nvu!GjUo&Q<%+J0%`!A zp*GZHZkP2^uRT3sYJJ{MwefyE$IOnU%)y-r1HtD{{lw>KK3J!#4)=rk>ouTeR1UoN zAA_f168r&g!lzIzzgm8SNQ20a;UB|Ypnj-+Xb76Z#b7+&2%nxaBFcd^)jZHMr{ zH{k=YPHU~9J$OBD!$+6_CJq#j6B zgC5Bq$)$;aPsmiI7U_^36a!qPY%HF$EU~p!zsa__O4Q0E6 z>v_jq$6Te7N+pj#l-Ul>YfzJW6ucLFEPA-yqr7*lGa5IpU@vxlzBTiC%+b6cdqHr{ zV4Yl@ocoPhp>bvndIr@8)G#~HBWOPKB+REbLA}#lPmkm`ump^So`Y_ne<{#E=nL8o zTj6t1vrvOFUb0r!4?cluU`?+=s6uEEHM|bs9Nu2=AXvjQF0+QGf9fIV26{q`i;Ryx z20abO!L{4}`gJR*^=*gm;SqQfrhxUzb3pyvIYT!yQ_3~nJ!UHSdYT`82j_zNx$C8Q zqj8Y^yXG(E^w&72Hr4`FXJ2sUZSQFBXy-`h$VK6c!u3M+Lf;g8Q*b?el>bo>gR1Sv z!FxtOrd~;FLi!Ni0k2=*%p1%H${Z^b?8)7abr14C_h;+JKQdcJ55_>wj5sHJPIwdN zo_H|E+}PZhz5si5uZBy2tv^;2FACP3E2+xqZTcTniB^doi5!W%2n*<+uLG+?t3!j~ z?}EPzzJm+Fcyuyc0oF=(qqDllySFF7`@$NOnyp%X1YXB8?S1Jz|H#otf>}xGIr?l~ zf%?z`%&&f@7sbzC4VjWm5Z`-Up9N}CdzfjWhN`~(8=T1e+#5=6AUl36n6qoFbw5l3 z*KhMQW6Y6o7nJa3TxHy&uB49b-((I^1x9naulLh}?1CUiao_NqZF|Z-hA%lsWMOJy za4vc@6V3butFx=KU2|P?rAkVbTn=od!Ca{M%%yW3YX`HyzoXT$R>umC7aVsDo=4ry z`?3O9k1E1D-V)4DeO}cY#=)7T&kXj`fy^0m-)#xTMwfzp4%Xe(jce!C4)*ap-b(Z4 z&-L*=n0qj%|0qepvk2S+S0z^^&C{GQU?1-Tuo;}e+Y_DvbG*M`UTR)y4xGXKlne}K zzUmC<%ZhPh?#3W@vzNL%EQ1^H%=&zrt6O`!5&W+;H21lWV;{#_!Pn8RIXS0(^qN0<)Ja~JzNW46?|2ofNb9N1^!C&s`WVSJ_ohxgK%!axdnrn6{jcL zwdqv)fLA~#Py;ys-&sP&_kQj+P?yrTq_?FEo`9y{TA?rC47eQ5;jGPzz;#ZYc|QHQ z`FZ(tOP9_|GPlpzR4u9>7zeQx1+i+bRIb$doQI|K*O&-6+VGM6^yRhKqKaxJM2 zTbQM6yx0@W*9U;HhWWX%wff{7XbZ;OYES0$qd2?J+V^sJAFOX$Be|*6O~L;AI=&~8<`z&-!cVyDw@^sr=+uTdke%wFw*Sps55A6@V!};E0qhq5d#ZQVm1N<52 z81EQQ$I`KW@qRcg_Qc14YggY`-`Mi#^5{2kBe+ie0eS|k4Ll64uO~uhx+R-{^$@*j zJMpwW1u1&2jdhK0o6=)oEIJjePkX=JN4@WU^lGFuF9${9S3Wm55i5HebWtI z2KyDB2Yp=j?5L4-f{);0&UjP4RT!zDuel%I`}2vo_G$JQ{RxgA@>0E zgtqht7-#$1xIR||Jyg~q^v@5Yb}$aA=T#4SWDjyCP&52eZ$o?7hY#~F&n19Mm{YE% zv=rR?UF#atvuEAzMfe?Db3X>xHFc!Ma51<>dT$(sVpv0OaeqiLC+;+6#I4C&6U0;I zpnpJT@G-hh+B^6f_;E|P5Q>?lWBjk~ZjNhAWuDlC9J2s+(Hs30yajp`UMclTkn8*L zr$M*Cr%ZSHBG3)2yM#eKy(#z_d`$0(9*9&V710;DF}g80zk6DETF@_Oe3D|etvRtd zY7O|3nJl%y{L{F773Tw~DO>yN$C+o?odfOnRQ$tz@S0Yjf5<%R+wiyH-I3jqZP9Jf z8L=6$A3*QdGPnXQ{R38-sOmJ{7FV>TA=%wdrh7U$g#Y z-sE-lI9v?gU4dC3hQs+J!R)n3)UZP-2UG_{2Mc8)GAtoy38c7mQ^LMN^t+G_t;MtfpcLL=NWkYSxfn| z$N@fMtkG9fb|^FaE6^tIrb1zQqZcoe%6p8aDm{0La#aVJ_0|3afCXJ>ybLP@%+NV zg@v!d`1ttv(%912?J${hex89nura(b+y*X&ZJ;LFJ={HfFK6}kg@BT<$V}3S+8D={{AG`5YD=-%J^;0YC3~F)9@WnensTtb8x}oc^ zd%bJ1+O_^{>$vXsSAo7S=h4*%-@IMiF{k|h1bu1P1Hn@J9 z>lnvdgRnk(CYWC@0sWGd$zKQ0Y~q^fdVXo>($J&fN5c&x4I`eZ=M1zIbdPn9QI3u~Kcyb1lh=sV zz@1k&IM4T{=uOd{k)Dw?cnMa*97r&C&KIE&mKQ7!&cj&5TvTIWHPQ8X>rtF)<~_!o zi`QWu7_WW^WvP!^JM!98D|s5!$iD@(hY6hT`X(4tnFrPe>(6R5#uq+^=0rX>3*lOD zeL2G1aeIG_Ka5XZV?xJ5!CGfuo7#{%m204N?UmrqKfw8RdM*cmy44)K0DjIGcu8nU zXnbURaNbos91s65^uJI|2p5D4&c^5WIA@i$hpu3b<=*eCl51c)Jp!XkjSjp4YHQBc zGDh~bHy+vndV01oi{K-80@wnXn0v-?AG?q7tz&NmeaQNo#^6ge22fKsc3X;X!8P2t ztOMR(bpU;x(w*2}tyFE#Yu%h-3m(nu%^C#FwK-vU#?x?hKEhwOBi3A1yv1FdN* z^Zu+8^nsT2Ram=h$XPpTY{q<#m3l1DGDwF@sTaAQd9S?y2A*C!KZA9A;|F6}_igK5 zH^T#EK^O4)FuyeBQJc4xR|`6U zeJwA5@r2%n(cr&thfQ!F=RKMW8AGX~c)hvbsLekObKna&A@77>UHrTB-+{(!jbRhB zGSviJr)EPT=R#OdxewG3D$}=XPNNPJ_*>Cm?P=2Uqh2{4)M76N?@>SJ&)Uej;}!Ax zejWNc)H>QaIy5pgvOT;#d;zHQjw~1%%>C8_xh1kC(m&cix)tov?N->W@a&?qi%y5z z;VPI=IHB+-cnkgqVOSSmr`#2PDEd(J6wudHDN-r&a`@%&m!U611K=*WyWnoR9ZxDS zZZ&?@>-8Hw*2YU}Z|ZT@SvXkY zKO6+(s0+Zl^pEg0=&PK9-{w)!Ltq_2@0e><3d|LK|1VI>o(+DDd%-wxUvQl>FL@jE zE9gV}0X~I8unV?;J_+|6Z?X^3#EtiU%KntSB7H@AN@_}~1j?k#q|eEmllc<*Wcy^* zhSoz@W@Py|yMTL@y14o7t#~rsQ%jDQ93Rh2O!H1XLe}|Q8{JFwx#$GHuVr#pHxG$Z)H+)QqtI{He3K|+>uNqa~Z5=?(Wpg)XYQK zhq7~^Gc$vY7jLJJ=q<2*>FePBI+1x;wV7w8-%sE05LgK6xN5pp!F$Vit_akuy;s$N z&2_Ae4TY~kPoZ%S_RiqE++obSpiD>?$6fh5=uKf%PvOO7FD^U3%=|LFih31&Rrpm9 zYpMBuAN`(_UYkUl!XxyD{>J$R6QBviU}?cp90o@MEmiNNUYJwh0J97hgKJRz z_xeC+jz`w-G4IjCbvHBt*K7aV6Rrkpb-w<_(yl3w!!S^D+6w9qdQPn0sYzW9*TJ&m z%YykR>H*eN)ETV9*cTP}H0WVz1zulwg8Q9)4G)7}UH29DZ|l5cp%J);szaDZ==swp z^9g>a*91S1b>}h6K_AWee%FVu51$`7Kk^bdXUQ`u{)DgLZ1DB+obY?X_k_)9jb*G; z$3QLBz2zk^e|-RqS-np5q?tSa!i;2V1=Iiaq?z~n+_eF9zdCp_dZKx_7pCYVbdR@h zXUefD!9BYHPkS71kNZ;#(D!3bbKDsJx9deW zm;-IWHBIf+_2}(?{RjFw%@6w??HlA?PaS>gsQo^Al8iNtMV$#}4a~gQd)al=IK;p6 zNzh~Oedg<;Pv6&YC0J9l-$uP@JuEI*TyR(Pu4n^T7+Dyc_i$(U&Ty|#uh4DKpIM|! zs1uEbo}9;FjmACC+PQIoHJ7>IoQ6fE76tR6y?)*M)CqiFU2_3GJL~KA{aAl9zVP{0 zFHrxym~-sZT&?4r2`Av&^m#UaJ1uuwu0^IrrdGOE+I2_2!25~!6Hzz^JSX#Ocp>pZ z;vQHA2cTuLWwHk6J2|7*a|>M8`lR}#x^h1FHJNLeayc>cM)r;DWx2~Z)$-EZuW)C{ zoq^ZhI)u5eYq;9#c4&&vy*HR=c<;Ec)d0N`YD*Krb)f_3*~{lm{ihc7{)%uZv;gxh zpU-ii*GM5@D5#6;M>-DbMWg7cx)aL4W3V3m+&E_j{0Qe4oL^ubrzY_P*uV48@rRCA zEvZ`4AlD$6k#}p!t-%~sdz{Wtgln1BZ2~E)b>BtKbUjiycE|yUvF#9YQpjScs~D&-%)f&5$)V%_rqN$ z+;ze|&>RkwJy3Qi)HE4#GJ(lQ*uO1Da#LPI?OV_;w z!xPkQ^kQ8P>SoJ8Pq=Hav68jcH0T{LrqajeelriOeW-h1%?v2>JmWY24s*|HxoWw= zslllg$rZ`wsphGf5XnZe_rdM3Gq*Em>{yGq@jj?XPn7kL!SwX&i`dV6+bYZ*GuF}% zRvk3y-^w|kZPIP1qI3*$x`I?e$}PpOm;-(peJDPc#%n%5{yoD$EniZ;3V1qYCx|=UW;4?ZQy9=XfQXiTBuq` zf5B96oqLX6nQCC|&fL*8GeHlZYo=?C_kfb6R`F z_c1@i_$a|_5Wn8|$)1MWkKcY=O`{B+ed8wUQ|{09pQ!h$GpTo&Ll{SR{ZFQsy*-=) zynM$-9364g+~`8khvRjrSH#EsEN7nnz--t1BKP4W*c35d>Jsk~FXZh|{192(x_HmR zo`tjm#z#Xt7!n&2dlA+~*GA*;LF9vo8sndw?PUBNqmSkh7zD;{Y6eF^ZN$g-7k#PU zKu`DtW`ngN!u!Cx{2aZn&JQtvtp>(Y<~wR_Wx;&Ky3&<+%Jfd0N?+Al=Ci3k&1OcG zv$%Z@+t4G@3G_luKRW%W`H~ur@umH@=2>rnzHHZn-QeF@4C+$)Q73^qRU=ecUn9TY z^`R^NA$@A~U^J+MoeO#(e7#&teU9gVT9VqL`@gZ2{vtp2arzvnYwI=jXW0X%wx(93 zKe!}X5`8)La_ola4N-O7b@T%b0JW_v;Io3yg7Zd=Yu#(@Q{9Gt4|xx@qES$bFI@qT|8P6c%v>vZOZWlPGIbjfzf9^p*O3!rtXb;{n9GLS3I6}L>Z zOe}(t@D=F2)HD7loD25GjZckFnH!!1XG7mi-%ROj>FkqGJ6Ah574&or1or~#s*R~h zyRVwltD||pEC%l}do9#Lym#$Qc?f<0?`iX-rl8)l3%cPKdJ=Zf$Ey}ooo=<0;aaEz zZ^Ll723CTxl=0H9_@Vnk33E-ZqCe$7J?hc?M}rwq)tOgdy-m%u9y17hzajqc@AJPW zqUs%J;A-cuf-y~1Sk8>QGnp@9T(~{EJ;-tI{eL{2d4P`P_y1>k_8Gghl8REar&QKZ zv?wj8$dWdqRN7?;B}FNbwL+_;qO76NV*7|T6_JYU%slH1zt`*j)^A>am>FZt+|PYq z*E#R=KIh8ao%G3&z5TjS72;kx_|`~_+}#)wx@hkO>y122YAkb;NlAy&`QS30_2 zG~K9kgPvox_5rYu-euz>?+J5C^G9oCFTvYzBmC#V{WR~>yeydaxmcUq8Q-Zv`dn{g z1~OYtp6^$K*6?lKw}DRS-?<(xz>7ecG?+$AaUV=1^M|Al{S zQFu}KczR0gnVS)x5zoQ>iTe}Z!HA*}MX$g+U~Ke3(Fa9CDh{dmP_>7uIlQK7wW`&& zRM}GH!O9O-UR`l@#TFG>R9INN(4)qS-$}d^oL|sC)<4!X+BBHy{!aLva5j_;dR7|Y z%b$;r%kIk@tSRoGufp2)lQ0ncU4CMIq&2Tj<(+~#Nt-y+-dxQ5>u-EX z%V7>!<1rR!0rSh|qZSPd^e5}WJDJft7dAs@I0hbq=HSO~g8umT!5WeKxLT~=&$$lf zbzPw|s3#4BM)d0%m+F<820q8u?aUjE?TnMG=@|>SKe$erZ>mWx27Q?t57nv~(|4`L z?(bTanZvG0yO{*H1;#TA?jmRhu73}KYr3(HYnuC723(_!d#v&5d3zfCTsc?+_S%}q z>B$(xx$R4HOLLtvoicsWebUBS`jMPpxuJAJ>9f$jqX+7c z8!UD1uKjhN!)fW$(kq~Erf=rF?0MN!U>AIy`#Q&C9>kxdE(lO!VSWDDE<5` zV63G7>0Q_d7g6^)1b4w&X1HyD|6-nH%oeW}suuJzT*J(siBKDM0;Ph&<&ou)J;i&9 zw^rC%VP)~k;>pmVs6)}r#LUEXFgrFom>p!l#0AW8xS6wu9;Jf)Gn@tMLhFKliJzH8 z_XDWU8wZlo6t2NrXAnez;9htVT;Dc=c*_ zZ8)!NGepWFWwk(`rTfb-^qHtL8w;7!ZGe_ccgq9U18a1CY^-REX$)yi+T8G4F#b6n zZ=bP{*Hgc6bFk+3JQ&}o&DQ|E{l-}S{psKuV%)63r{SsaJRas_!Co>onfhRjVm4Gkl!+m}zn~GX>d#>?o+7s~%|L?hEGLzF9+TM}M(3RP$QRA)LJjI|nob9SxowE*)nzrVV?nvfcoK7vC`RUvE$^q$)}Z{Q5j z17Mt!1Z!~HICtPS<^mZ{NiWc6`4j8~bJ-#EMc#!ZM|`Rjdi(+%uaD1JsW(6)V!_LskP}{T8_8C+R-!2&vw1)f24ol zSu`i{wcSH6SLARc$amC1?W;BqJIGmb`lr;xH^Re-hZDEMXYeb~J{z0~b!O3-ML#5d zNX&zQa98{;vb(3^>tgF-e?#|*-7Ai)JhJiwl^&=x2S!vFQ2|*esDrdiv`hFkx6;S* zZsgs_Z{gp<|1kS^Tj92#2iLwPFQCtebp_*qN#J!>v$2oPz6IkEYy9sr!%EMoKE1(Z zgUfQfO=cEZM_8C!n7g#>(!if|5A%7)GLNRXtT^z0AI15sgJ1&e0gGQZKtFg8T7kYM z>ws!fcQM2F1y~2x6GlRkhF51~wg)}0*6{8EV=Ch&C@3L=Q)UvkUY!7}uN2+oNKfhCr%UbuV;C-|sw)u4VDEvwzZuHlp@R<{90*@P+mf~={Xt!PPjXLkH|$F7O3g{nN&gNPWG=|`%J#}O z$u+_Kdt**bYZ<5y>VdVMVQzgDXXqL0-<@}N5cgd|&zN~<&_{zVqvu2&NqxHqG=)mg z8_cP`g0q;h_71!XSAgCnH6p@-o&cEODlHuW)cJI&LM2G_j3oO9weSqkP^3D5&| z5;4&Qa6GtAdOvgo>-!3;Q}BA5Q@O{^fZOPk?*?N*4b<66>KtmG#{7Q%GG>$Yr0=IX zTn5j9d$r#~%~TJuU+>@D1jYouo)q2nbBUYtZq8eZ z56suboU2Z>PBa#e#h-vWi8@@ZHxsRkS{L06&i;0TJ_Qyf76o%IFG^hGB}i0=SBQ6x zbq;!bJvio)=q1s6Blkv*g7x9`oMcfwe0=Em&_B!=ydV5O^;>LZPQ@EwT=_ko>vv!v z7*D*yT+5%CL14VU2j8Cu)a$nh)Ctv)R>S?E=4BqO57hNT z50dpaV`BYi)*No6E_Vowc|U=D;J(reyf3VmnunX$_`TH9%+cIWke~z2$vEtH_yKC< z)d)OLO__sY&!)4NUWa$Vb;j$d{$l^1^lz#$93IViJJw^2`@B}|=rMUA`$E=rrA@j`;1BPR>X32{foDK< zOLoKgJuv9;d?xiw;I~|mS`eI3a1%3CI>JA2RpzSTby}NUiz{Md*0)b`p9Fe%O?o@c z+s&QN$20Fe@3Z9fGC$B;;6Cntuig>Oj|Tl7n)L30Zg6J7nFVX|*AS6x%YTwHAxqKJ z+_d|lzPt;?^zeVhxo@sx>Oc>H>(@v08+V19;Tt>%=280Y2=NLE3JZex%Qfav@ZTH< z_S>nwuPj(uVExX2yB7Yd>5ZU|{d~9!jHmWNZE{gHFTF|D($qGLKW4$Hc%g2Bx?nst z8M;7y*w3uq&7cp-uhBE0H~9!}>YeUu4YLii=Vi{zw8*wlF3Mh74KQsJZo>>?`nXZ;ZyMb^gi}| zmoPBZi+dtQh&GSq+qWqa){RH z;9Qg!;C6TqT%T4XRwSN<`jChx;v-`tagF~Tdm{Qo;Gfzb*&n$L^n(0>f5biJJ~$WV zaPF7)f-$l6Pj%Smpl_sa#Ic2@MP=qZs?BCctzLajn6eEQ#m{nf@( zcd+)WuV4Y(4Oz%Tw9)@)^|`;E*quLL#Ut@PVC(^OBTYoGp6_m`)@dntY-e&kc?bna#5`qp8+r(6e*;F)(_ zG_D-Uyg2LZqd0#g4V9U(dNLTh4+Z0Oy>!-m)LGA9&Y-d8)a=yk2bm8tlhTvYZ!ize z83JE&@<3-e8cqXs?te=DDY?4z>e4IVco_d+p@h>Zx&Fzpe8XpiXQ)QX0{@8RFWPk~;L0rX88 zPya^Ok3KoC&zs;rtcM0UD9~vS;tzNN)Vf&|M{W(QP}rL~VC*a&dBKYG|rwx+haee@IWu zOv{`}pZZSl`EXXlF6apEz zm^Wc8!w@Qb#b(H};lpRJ9zLETV4$0^KXe-hja)V1tWF#olO$lO6(pC6z`>-ywc>RPK_ zsurRyXP)AyHlV7#Wssu5T(I{?OP8$qAC zzR~}*r_uN(?HTF?*5JMa_ik&ddbUdPO8&oZ!gz5z=)W{JeiX)l{;uDsv#KlUGt&Qd z4t30)@F(-nP6c!Ri#f+un#Wd#Up*)wDE!m~-3XIS$MTtlxA4b#Zkj*Esh~buV*A-wo=B3*b@E%V8ce1zrHx zra)WZtP$5LHP5#XzkPU7{-XScm?yd~x-VLWAU>Y62F*pS^;-A6rr?@_ckcv5lNKE*I%0mSX7@a2&wa|Ak;$pasWr(p$tZkP`c>(Hk^?1Yl%7%g zYss&i0@bDDn9^fP_m=D}(MzzlbZu$nWaZ?kuo`{^eNL6rl>Tb^fbB-QPIAMYu(HW@u(GL$@#fCSx4qChKy>P)nd)xE<5g z&J2IXnH%azddrQu{>O|sKkfp?KgL7u^-)kqey48BS|qEW8XYshix$`7ibj z?o8}VTmbfsHHkF|&dTY*S)QX{V|XK7Aq~U+u2xSJR`1c8$iF4 zKAg8<1L$jUFV!#eCwQ-p0OR)>VEtUbM=$2|n4kH4eGlqY#z^{>E`UmK2N+xEd0Gy} z982Lx=nRJu!8X!6p{8Zc-aNZcxKCJJ`c39lPK`~Cjf{_^OYX(^9;lnBi>j2LI1!?- zKE6KQ2hIY|fIk>L7@Yw2_Zo}61sj-2Y#p{XYzl3n;(AT!ar%Wm!N;oK=2`q1FM;cc z^E%YMdx3QcV+?ED)+^N)tY3O<+)Mj_&$!pYb$l%+!kIr^4||!BcQ3Pt^$Hm0n49_c zA45%0CwG3{Y&aX*XWM6eMm{b1w4^(%f(E4xO7Ep>-dX#N(~Z;5L#0fm%q-Xh+q2s_ z0k<@mKf057yk~G$-CEAGdz@MCchWQ52F&mN%k_+B^_ZzK>X}l1(nD!}Uy8rWy6o#P z0L;gYv&{F+%l-XJ!G1PlBE5FzW6rHqXV52U4E}!J`zXbC=bgY=)WuMmSDH7IdCzx) zInY0NGwh$f6dzC=oKNG|wu6U3jb;ewaWnR~7mW3d!(T6Zz3jW}ci9P<37L;LPsm$h~Sr9E?=k6ABOFJ;Zh8jjuvb4~XJHT|J@LXC}nfRo^Td>XYqDVSa~?_=-B z$zWaiFR;h=6Z&{&gZr`9$2fBdd)8j?J~5s!-_wg_JZP?e9qwhdCu?-az^?pV`HwNT z?FI0;e;lp=a~-`(YD#KF-kWOZcY^x0@s@j@9!c{n>v=u#X~mf0F&bK2P=z_-_X>ci}zi9$&#+ z(BthrQVaBb8xyGUx<^?Pdyk$abpq>5z7|XInB1AZGi?v#U&+6co^e`}I_uHdqq7Ua ze8c#8H>jETtW^aykWKh}d>zMvy}loTd&_9>bsYi&;5%xsYHRu7{P3-jTO$>t6{D+T zt7G~B&Pkk;SOwjRx)l|1xYLfJ9YsIGWl)+Z{r|DipYcEAUclDz*6~%bRk7YMIXXGe zn%;=K5g7;bobRDSi8g$w3`~sLGse@Y^ z*Y|E-s}@li&V`2Hv;Pa{CYigsE*NtT4Gj$)h#ZJK0n5V6!XJh{477$Sg;ffDz0Ga@ z^MCkkn|m2c8jJivAMGVz9%-!F04`=;sBx|NhWXqQ=mOK>1+YG7ov#*?4t@nS$(E3! z?l+#kK5Gy?L7!_Fwv!v`@%Rk92lRFt4~>P^;M!&EW1Qrgycf#BYj7zT+f2seumX$= zx8o7_^={03yQWYD?gqcdEAS0Whp)jkYzrEuH5q-KuhSD^oOo^S+T5#|S2H8iBh#m* zP7TfkcMi(Sr7s6MlV>}P0lfl`fLhZv;Ntm7@{{D(V0~g4wBo#!H(&sqmN_kRa`xn4 zEgz5@kShkYZ}*4I_{`i_%rpF5^r7p&F#a>THvmU3-u3GU~^!Q7xFG{*yKE;KEo28DIIk?+xt@<_`bPeB$b0{<$%KBh`g9 z!EA$bnH@Tg8H?tMYMFyTudw>3dy&uQRqz|MgnsZa_$+y^zlb;d5iowL!g&P^*kh;R z3B7~!+U)_J8<`s!9vvPv?y1R1S98GgsTaTt;GDbqVC|*}*oWd-DchpkqSrv{NbBIN zl-`lvkwM`>L5wsqG%|EH%%xVUZ_GE>f^R_IiEGgc(7V+N)C|;Yjo(CngF24!p?<_Q zU~XKIS>48k=1A7=|Hf;n&vF$Q3mFq#1AV~z^;ftBUWGAWKWQ&8Kl=sV0sXiCgOfn* z#F)o5=3y|m_PJRC*TKx(%v}9!{j6t(I5_A)>48$u32BmQ63k8eCH+f!6!X_s!}0W< z{Q<||>(p~#9Qy#crbP}%4!eiE32KM><&C4P&83((VJ`j?*k`XN#Rq>S=x_3C+}oyu z*G~VO``&l32lj$7!zfU{I2+WVT!Wi{_wNWe74!&v4$h=eGclJizPgUHsT(q@Z$oZF zZd!I)_QlMLnU?96>A9Tc&=DpkCz6GQk_Sr<1~Ua#m98qC1-+8JlApsgP@mccotOo_ zAB;KYfqu0cvNr@iwGVS2=JWy7j?|8%XcYbj)R)UbWr3!A5@(y}EgAziL1(Z(-&n+Y zmA-+Bg%yK3x^a*60e#ncVZ8Uo5f`1s9M$gdDRUTomai+kE~v%mHMkzu{X3WYGiF_$ zj8ELy#~NN6FkbTC%mVc&YjRjd3(OO@k%u7x@KIUN$EH5@IrwuKgMIlgotdeW59VS= zah`!btjhGa*M#SpH0=93m_?&jWlUx+VV*V#tfdO zPK542DJy?5wGLyX0ni^Fg@?d8$a4A*yq`va`fhJ7*(=$_9dv9 ztC>3r|IQ_#=BRh%RL;A0pI1*XMs8Kms^BW}@TQTb5xtZ4UWXIm#P86xsB6(S=vCaS zcwf=JqAt(~u7;E0rNm2#hM;FN3hiUU8f?nazBA-PT!rkyV^9Y`UUqinJ=L&kS z>Fxar?f~^dX9o3P_U_5B3SWFX&}(PSQa{E5P?UTM-|%gqf9EDR35=P1=4Bw5ALu38 z2R}i7&Mq@<`5erHjd|30PKF!km3%DnSmbAXxl^Ggs7GAPp7jWhIoH&>V9ad(&>lL0 zJ|Xie<1N=yb2fFsn)u4}AAG`mg#F zde9SUACexZe$2abomPvocBck)A=;w%#u8Ws=7egE_dyUhP(LxBGUqYwEXXU!n@F$E zEBG-^p+B)X^LmW$)tUGYos_+bdVfXEVR|I>NNRm@ zJyV%3PC5g;30w+Apb%mlH39TxI)B%-do!2|)JxY(pUS+1x-b*;A?$)@a?dag<)hqj zoa1iYv@6tSeuA&5Ij~x|`9(ek0CQb^%<3U}{HoC>(EyAE%ynJ2jVDjWCl$}ev-_Y! zu0yUtS%WfXWx2N*ckAPHzt>0jGq{$!HoOF5pfczG+zfgEto0c?G!He`*2ig4bwYn~ zHk4j;<0N$?*HPE^ zv<5Xt@9Dw#$_G&^@tM<0s0VlsTmf}MbwjmcwQy#);sm9eV?C)E4u}kh zV>P^S%q|@p85C{Yci0Zz1Do+@7$3SXG=`U$k*?3#T-O?6)dN(<<|0BgZjRC z!URya{u95`=dc~j%Z>&AYz+D?r-0W{9q)WlH}PZFq^*!C%alC|#z}8x-^?yyPXC(H zHKm=BowQ>mA4@%!TAp5>ekt=(=1S(V`88W%MQ%l|c3JJ~tUZyv~ z{moj2`coZxl&rN{yYqg^F(9%M^8%`XxmqnWgl*J@)$Q~K=#$oSVGXAvs7E-v;2c;7 zZ-X(G>u^6bD8JVG%2`durG0aKb9*y;GsnVo<}AIRdOy_)JY(D$10CU9F!!4bCvq<4 z<)C-`+tjzIiRp>y=ir3Q3BmmOJ()e3JF<5Wkxk1s%Qeg0O3(Eh;A`PJK9BQZo8!6n zbylm=OSYRj`zg!>yEAcTuorr6^vu}I*jJE=W|$7vJ9-Y>6S*gt4Ynz~DSQ)5gNNYL z(5Iow;mYB@Xx{z7oXcMGcfj1=bzl{^j@TdkAgGP6{TKCazs4HQ=b#tq7C4nzySai~ zP^0tN)C zVJX}XAH!{MJ$wkhFV=SR;ahs5?gC?i_Fz3mpVKXHF4!lr0GF^n^#AIrY76$CoC7gX zb2=T&YbwDe&XVep?vZw$*X-2n)J2(#GR{m?=Q5U_SU9n88#CBzL~2C3M!QCDiQN)2 zf79DN1oR0U56-f5zNY6w-2?iW?B{(o`f79xxF&ra{+iWoT(~z33k?g60_z#pDJsGH zoQJ9oXnjGA$>+s>#eJ{?^uVk2+BauTVGUAG1!F1#ucH1(pHcVDs?0;NC+#wDZ#6DD zm9zSq!q0fG)q3oAFiz5A&;as5?ceKD!ubuZQLbm}@F7_%FgV{O<}5 zmoR=AhPT`AW6W$Gd@DZoaglM6vEi}dH=!g{68fU>i=eOkBj)q?rWV--+~f5}tOkES zJw)c@)>_>=jQw2KTzg*ve-BFb<;GM=CcE56uZ{7MG4==G+Waf1$*3t-px@it>}Ajj z^l^Iq{PTM-UiuJDr>73fY@p>CZ}bG$FLT0$XmhT;TXI`+A7(zxtfP+nMe2)`=QKHo z^N-R$O6P)e;$DN5un20E)(Yx!&PaI*jFqfMPk~9PNvSx4o8N`YGM8okf`3q(*lKfU zg6lC$YR){{eZpF#H3B^f-RYU03f4jz<6}1$vCq<2Pp|VtuqJm8r=yGl`=89mjKlYU z`IZLTmqA@;HW-W4qpo%m=Thotv9H(s$X*HS7d7ENP%m`9QNwgk)VEQU^Blg1|MF#@ z^B3WXf+tW;|5wnEd2lu10?@Z)9l9V?5PF@yVYQ>-q2WROM_s8h=VYoo`S+U&Hx;T; zjpHm&<0gML_wT2f0kwm(?wnOn7e2=O{RP|v*WhjVnpwNu;7NEE?BU%--gg=L`9I8s z$|rxk3iP1rYqrkU42)&o12r9IofsSFG4Q_DZ{l7y28>zm0{^TJdJudbUE5r{dK~Ey z9F}`qoVf%3VpbpnG)-+~)(en!I?OmQ&p7;RF*Nz3x0kucvpZGs<`x9xSOpJ+- z2{fpIv4OD}(HYT>VBXdZ7KaxH^BjK({Sw5qnZisE54&%8UDPuwGOyBnq9z=m7sq_U z`lR~vQu?;egBM^DY(X1d4C={q!1|5P?3Lg;@jdT@G+(TT0p29C_-`?B*vKHR+ycE#8EDLznw9Chj>DR=HDz9- zP2lfjzNP=2F+G81;?G|RmVm+Xuh5WLY(AIj0oI|+b@UJDxBP-W(0#@GikrbNMZXli zoOn6W3G8t=FMeM9!PtYb-=e=oPl6?pC6Ou64vL{$xLf!)`c!7Zvv3o**BWbGgcn>L z%Us{sNUi!v!I5At_jSxZ(zl>LvpfB9Q$amSEj|v$I#mm*2K$zpYX{DOavhls85joE zO8xjPu(qncq^49#y|o3X(Jq4_;QMNb@1SpY0Y7K#Z2o=^xEHNwK3sRal&^vtfqSDd zkUEi?)8Ak%*!7n&yusI>N*zcoz&*{l-FwP<$^mBcoW`sVbtz*c`%QOKgMARpx$TE& z1jb2f5Y||I2D*UHff|Q3ApOJlKxuhtpm%(U|JdjHfAAZa2Ym!vnV zJb`a^KY9Bs_zX?~Yog}H*Dk$=*657w{a7EowMXw`LZM*Z zm>QnXsamq0izneT@H&_qJOVwS8K`p`W9q9=!?T{9fW9ylK7}m!{%|NbTtK&8r9khy z`d=SwNqI>ygWTGZv5oze#z58_ZbJ*ZGJIwDyXbe(jj)0_#P^5qXBzM6;n%4JxsR*2 z#z9TM`>#2;ju?OM1fNImG4opQmzB(=Q`2(oFrU2K|# z$$k^m?55z!-wJvZp5yEY^KkD|>#x=&jcZz?rKvM|PuSBt8q|694_FJ=b|`v9n$8c*umR7dXsf8iON4aS^Lan|5n z&=39xtKe_27UDkTT46Y#uesre}FwE_LN=Dxwb>`Oj`T(_jgUR z-sYd~m-E4WMi245V2pn>m{+~Qe4jg^HuMko_m&I0zT6$VJN9(^X*yNL$DK*K1ipbb z#chfohkIZsI2Xn9=kyUANgN4g6MPi^DE=S}0QIpaqfbWb!>-7#$mwtiGlbUSU+WBN zgu@Dl6}tWn0R6E;@X$p}ykZ9mUy}N&0t< zq0BkdtdL;JtljAi^Y0qrUs5A6u5+Kz*Pw^YoYOVqb98t67WE5Q0R3!_Hu9^gLW-Z~V_>GXk{Lx}5^RmEP8!ejgSM~@ zs&KBZ8uMkG>0_KT0b0Q)Ffl$cUbRBi3UiC+77u|zMT3gciFD#pm>i!R_kg*#qi;uj z`zrEP=-={8VnY5)Tu0t<+z)TY&-+cB@yIMsE)b?I!d zR%(sk-)Rio3i@l*1@#d3pgyGL|1~p{tyf$OYL2dbt|RU-*1SJ}Fc=%1Lcg1}+%Lge zow>?NYIEi!UT2@NnxJOn+OI~fKjnK+TX+i)F+da)(%=+0u`q-|* zW3w1Gf!C@QTng4L-PeYK&&3w-8e5la$hi*I;?9CvFbwn~HUQ&=6Txd`zGOhJf6qA5 zTu=Xwx||xh*U#(X?>!UDdDNlwSg1ki1vD43cK0#3hAg93+O=HG?gSVBYruHSYd;UH ztEqMS`>J`V&6nH{YGHbcj6=-L)yYl*{jn^@oGhD1-(CYBXuJ+sTVE?EnremwNS0XT7~ZGK7Zy612|J|By@rk!F>5i z{D<~*w1Zp0XIb6zGO)j6Jm|aY4Eo&ExK6@5QHqE3$IOqJjp>c)=Tgt58YUYijgMxQ z%q%$#9*3oH1B?QD>GqWDDbZ_bz0Um3^~f3Fp1apM-I)_qE=ymUxiqsFLfKHZH|Hwp z-M9oE1hsEHAm(#j>3w{NbDfO!9>t4wH0P>a1iRo*a1C9Nzap4_@-gSc9LvmEYr1L$ z*5}`XAHntDVNmzcZ?G8Vfbr2IkOue4Gr&Ksqxtv7vDVYnr}Q113D(*^DEy%CAiM$A zmG9ylaqDyMf%UpRpq{FCp&mF_+T3FtJp;#PkIfE;4X`M;C}(Zly-BTN3cX~*ncvzU zd{(lcu68zl4|4|fSGDaEz;1RO z!5B%M=~$=)>fjqeA4yr>|DFHf*FOX1E!)BTe=74aecyc3obf5Bhd;{a)tt~Z(K?(l zxcgp5aNX4Z@&K4W7`ywrUWOjp2-MV{1J}Z5@UR*4DHsi=r~LKE>yiDOGk8Y)jChAc zhr|&0v*Mo>i>v=1r&T|#`od}pt97i}vFeB_BdV;cw64-?6<@13y~6YgzZCycyt8O$ zQU65$pg-la*k`eo(Us9Ia2NB#_t2ZN1!qbnFmE#sRd3P{@1CH~*#3fB;AQ5f+k;_F zHU^A|2E+5*+2wF4n477ssB63L7)Kc!`lnjg2J738gC0ri(Z=#K;C6TkR)BSV z*Z zXp3NO!$;wdg0nhDheikUSky9H7heI&eT8cA)8S3f?{qFa4VB;x=5ZJ&eE|BNwxVSl z(>8}IU>f~L=HJFpcfh@HHGINci<>wj)BU~)sOOq@Jpt+<59U1>)ZNTayuPl5dPs~B ze8JSYtpoafJ_heY>vHB}w}W0vF()H^3T7|4&zjGKj)Z*Fk8~lV z8`Kni9h}*uHa;HgS*Z;6KtBYYYhe7<05*p=qa=0@AXF=^+9l<`JPV`ax@6@vGY4mzq zBW(=of5wdZn#`$hF?~D}hd9?=fi%-GW>m_;?t(Tb>_U4@WHB|hsN?#T9`7#0`rIBhS=wTXK zGPLBv(hGxi%8%`v^RWBI$;Qbaz{4Zzr0S$TgZt9=rPsr2nb$H~U~qPDHU+IYN2x_w zi?VN-L3<^2jH@}z*Ly%sO)s&p*>HH59zo;lfAG0kOHv0I4i>m4!#uEV_8|B>4d$F( zYw*3m8rN)auK!YI@+6@tb144wf! zNY>Jf&FowGgRT|*#l~mf)5B*RwF0W+rH;adoGUjTia;&*0qDkj!RI*Br$MGcW(oLK zCs!x;2Jz&HFceP4OX8mBJvfM&UGIa>ulGl7FfLXHdJNWrF^l<|vC(r-8O-a<_0-IV zfj#8LK9D&(nYFpt+KMI{kf#AN?wMCT{RX(izVdW~7s#LnZ z;`J4OFaEuFM$wESXBJ!)zbfc2%#Y>=ev{t#3eIFUh5D~C^W*d~sd0>k*O@mon>jEm zz#Pr|$6RMQGx5AP&Bqpjy|DV*y?3q4+4H%Deg*4k4{>gpo}+!>dUq&yC^sL}k<@8Y zxm51_vh#y_+~~5=!R(X!nFjj{oW)=|bcfs0SpMTFUu20(Hk@@h!ClwX0$2VQJ@KsUzJA_U?WQ-^1nbGSr6`U=Zjf=wI5uv=i9Z@*PZ1 zPEVelIy;!j`y9TerEpi~u1u3`li=LB>vGrS+LyJ*&2lQIKXoZno3K{np6cuFI=v3e z>w3etVC>`?)RJBeYhUWP%?p|bIu4;+f$_-cunWw)s)nit{URGU2W2k&1udABl7#ca z=LbF)W2dq3JX`{q!c5_foHP9b=&7s)r-5r$D`xaO1=qtb%nrW_%>7O;IK7}I{sD8o z??T^&W+Y}Ls#T~~VN&s=;v0)@EP5pINa9S;K+a;Z|_n@cy&rb2AtpM8JF2+|-_QV+rdQ<~zm{ zzJCPtL@%X(_c!p%az4T}MIvF$RMf3k339d1L z2N~VTxXOLV{pK++7k6!OA5_D%X09GYIFM(*fcK00jk>V9C$^P*>j%d1>H@~~?}GcH z{yU#xeSFp?oW=E1{3mvu-th=r5W66Ddh~Q&`NqK+Ys;8LJDYlSXJ%5Ef7Z{{&z;3g znVy-RnG@3|rpKkmaZ16psXvl`B%KT3Y#Glf*if>e@S#nW|JTlX;(W1L`st zvle^|6X*%P0@5&q-nY?k2{TuE!VSz6b^Ui=aPP@SMz!bq+0W1wjF~1v8eX7(&iKYS=N#~3*MM(0XID-9RZw^OhgpZN zE&ZV@Oot@Y!w+=|EaYr(KX&c%`_%*g)R*}seJNwX{Z_wFTjl`222)@$`~aUqF+DK; zOvix!B)`V^)vs48ngRNyZU*C6btl&jb?xzZ?Ph0YXBMXyr~l?mcAtl3*=5;la@XWO zgFDLZ2)re}j;;gN@Qw4I0b>=fqxCj@;68`e>D1iy*cwCWaXJ}{vEBrACN;hi@O3cP zv!}q?glnBXl?yrR$$H#4X7+^gLU{|1ETrpfWH8U#+`J#SMt%nBOWy0|Db|#YrJQ$h zF*DEKDSW5!#>kD4PO(l*QJ)=a6mJy2jd|bgirN*e1Dn=c7PTz80+k)8uYD=wQPHs-FIcF8z18Pw7U<9ap^ng9NJvn0tW2nP$9`lR-DElLrfnt39 zZ27b0-zfkK|jNZ zoC{C`)Ip2rx4IUtKXUyMHMs8lmVame&Njk{v?H}6^*U5cR!mkdtsKmXyW-FlhrT=T z-GMoK=Ioiad)n@Wdlv4gxwq!tgZmEdyJi0^`&%7ob>PZFS01{(rxzM6hD{dDH(OoMELY~5VlV6N6vWlsh58vAu-a%O0-kFd^LGkF1AbFCR#gYr+7 z?qD42J?jVh3lD4va)a*Oocl1om>b0+wb7G z&~bE?)DQa6{n$0jbxEz;T3>g(1!_jCAQp-RGgi#~o`tKyI#Vs`6_w#?=9%0J=8oof zOJEu353LQiLpk1?KE-{CEiU_f6eo%k&hwZTn-?1y9T{B}UKN}<+d14h{Cnv4(4+7c z^W59OFlJ8O1h0a#cfCHwmF8)WGRH}Oh4m2YBd&4gX08)&!C-K&bZ_+DG8R7yjM0yC zt`k@z_Fl41^v>aTg8g*@=VVuc&*3jnJLwAM-^NGY)8^mDg7u~hoQjXw`~Gim4^rPv zQ17!IFc?k(gZ&xQ+fRX4IV(Z!?a9I?3qKBj9G(@K6{#7k8FL1&XE?boH2~+c9*iH1 ze+OqJ&PvQ6u!rl+w8Yj_@B2KDZz z;TiBXv5(DIO0C|w%Gh=RxHhN@sSo-Z>s!AP-0$>uL|_ARy!8&buhau|M)xDvku>xO zCZ+WV>KyJTr$Li{&r)24-^rNC+{{{tK67==eqhWr3XJi+FMW=!Kc52jr&v?@9n?}& zptf`iR4k|%>;&*M<_tTGp>z8K= z>tDJH>;b+3oSShCvymIZubf@5GQBc=PUf7s3_-r5H%;A^e19*tDZ5q=Lqz@yE z&*Bv@mbGR(9bBuff$^YTqUPbBY5_apJLpl+Bk&2CTlu`c0md*L;7|CNvj@}?D!`@C z4EjPh7!UTLJPJ318j+?A*Fe`8bE~;<7QMpyj_fzFx7fPiU!b06Uz>W;`7jxr5nwF0 z621cUr#|p2e$jA2IGDra+GYHdfQO+PtmLd>>yO4WXM(SRx%h6llC$^J$E~;dJuYEZ z`eiT@3P7FE7~UGTKHc*(=VuaNoOLequf~Cz?^k$c)b-qV%^%!b^_p0tR-1MYRKqdmpjKt|B^A1d4MrhEi|NA_%PMTUF(c3df;KPPxJ{emeZTi z2&{ekysMABj~}g&c_kAg6C<;uv!fTqFACP3U*eGXC2@bz{Y4joGk1>z4Gq3;qr=w3 z*2Esz8s8eP0Vcv3uvZXEtS{(BIc-59$u);8KUdSB$eNR@DvFcLzruU*fqFrP2$6R$JlXbZUh z_W|pZAA!HWIh(rrV_>Xh%<@m!KXjsO3u@JDRk)UpD*qpI2cChKz*xw9@Lc>C>PbE; z#zYTN=Qg(b28^eE0zFj5R6m37SB3AG8TVgqVm{po)Gzgn?}s!ThKkHka8EI=9S66A z{sY%4eck4kAA`A~`TeJGCN!gFa3eg-Yzgll|86~4w^Lj28Z-gpX73+kCg+~$PxXGe z3hIGtnfc-qVEwoj^)K&hpZ$r{RXTFs!{xclbHk~7o0Ba~ElpJc{g%HnJMJB5RN5$* z(KM)ZQ0cj_1e`H98GK`mPU-4Hs}Hq5(Eh;see3rv*uP-^DF;tExZu!&L-xBkufRSS zQ%gbW4}M;I?1#Wm@LBfxp9$^gdox$k zGw>$pY4Xo2IH#Z{+y}-!*6@sd&V`EMiec->*Fv>$wO}^uTD*9FgYiiu90~sv`YEXA z4Gs+s`t91{ySWrPGP~)1*bU}=eotd9wJPJXop2LAa=lLGj3>h)Jd~FgUd}|{8Nqo} z`WouO|5#CtrOfZlNA0!K+pee5&yRqy%p&MX^fW3lD$sn}CfX)0j9(akEcRIJqv%J` zDv>HdZQR;oPdFXall5kv0=wvAQB$$krY5~U|1iI6Gn`1><0v zZ`T{Oigox4tqbX~F)sQHUI1sl8WZ&fYiv)@?{qhG1+~|&!5Wi(V4tT);0Ew{ab0p> zS7-Khdlv6~&q&WmI2w+wfFjOpvL?3>c0!j#7fyVdKy-9gu>ROf_f71Z*qNZ;U@$xi z6`(J3z4f3y$4mihwAOE3hw3vU$K0$Az0$Wb3w0mo^UVi)OOJxF%u;+AX41#&`fCo7 zEzg!;kM7eGd}gh$Jx*PDIjjYBpayUqU?V6~W6nWOFn98E!{~LZ4(4gd^<{^$hq5(b zTXI{ncS-M(XP`}Ko6_f#&j<7Morksn?qp7uJt02r*ur?V9PDc`W@{+VcqPJGmoyNAe`V_Lp?NK-EmujCD^n zFn^y#^dGBhGzafV*Yy2m|A#Sp7iLV7=7+HK;AqyKFpZ-l=|X ztK5uGh=RkR0c`zf-c_J>T4}$)tS717Hftp|)-dM@sQxEtMP%nQ8J_7TuO`vXm z1~_}gK6KZd%>|na)S>lCen3xz@s2)hHPhpmi{jVx1pl4ui1C_nk@Y@*raM60sU7%p zsUP`&`y6bBpWp$`lXLAU$uG(8$t)CeJHL;fB{dCwq~>9wU!VefiFeZY+dNnO+ghCd zr$4}W%A9R2^Z$&u8#0^MJ?A6N5jAgbj*nX(K}B@TUi4S0a~t=&cOGQcvi(Kxf#Tev z%%Y%%dQA41Y=c~bT#syz;2cxyNZY|Z{HF4o0!>0+oa>8wsySaj2x>d%t;Pvz4Nt-p zI0)uK+vwh~w%wa~EY<0$bxpq`d`Eb8WOk%ZtWGeW>HYZo@zIIV!FdINCHn3b57_!JrxH7Kf)s1dBy{bK!MjiCwjrsw-zW@9b|we>OKG2#43eq?lbbhsKm z5p%gW@T;jk>WwpAHIEoUkLhQy2J~QlNo`$SMSV<9kNTM&%1fXsGY+i<7iK5e|27VP z(iKn>Hi8;@JNOQafsA+6w)8KRfu7G^;MZ=2UqBtqz24k&GIQQ4fNQ1Rb@OojAMP(| zNya_KP^A>(UAO$*_rR}U9@rh!+4S#q$m@`|m%b*o0@pBgCgTXbtp1LD!JerLU^o6Z zYYe}`{q&W4pZa(9XT1&1Y5EA3fWAHZ+RYRFN5*$MncJ!NQZLl7)UaSaQ;%ei^x z&?9y!WT=T$3(wBJ# zE1&~h1eehR{3Tt4`pKPFum;aU&1}u=bf{BSC+LCnx+?&h^EbuMXQ%{Aa`g3F*GJPD73@zf?LLR9^QzRxz{Hl|47H()zl4|)Lq;T*EM z;kw~|PznCvJdV5J1=tRLZhmNfFu!1HXlv+4SO8zZN#T>iKZJguBG@8`r;Mr8IDA8% zB@!DP_^H&<=fX(P%lRQphV9Jh*aEi~-d<>)p|zvG6n0uhk@A~HRZJw@9V*YN9 z67=a8-BolEFdin}0*tYSGoS74$lH-!;a&Vzb;D|F>ie$8--7FJ9E`K9+o>72Kb!)_ z+}8U(1Mf>?iw8liVkMyQ&<^ivRaerITmuHNn&&fR9I-j|WI#dVFhSE#^IaohZ zXa1CPGOrC^8=fDTA2BD}1l{A^<82ac66=7aHpu7nW2!e1UKMpubWhj|{5ND{+1P8~ zjHU}=baZs|31&*(122VN3hxN*2+rv`zoIdbp9!u}<`>onrhxfb^}OnV z-ZY55Lf2w*GJQX;Q$G7o!e8`+=qWT$vL0bge;F7ro&l$Ux{-Uiaim|bK5brP+^JUN z^-$w@8oc)}%w3qd*3~zu&glX zCtg&xD2NeWEq^tLXN{xGr+uA#&5VtDg8nyit2;qWT8(W9m}@(S;tl8x&w;aZM#9~o zC*VE&{2#)4sLgx~<8bwc&d?v0f%@H>Fc5A7pIfzwOE_QaMKA|)e|{G31~n9Q7-L+Y zbM;Tx>}vQiPsp8+Q(GFG9vsYST9{lI%!-?poRu5_eZWHe3!uhyF}SX{rZvwr&!~Nz zLa(H8%TDn5V%rM*$m;Jc;bQoLI?zw>H@KF%?&O2s8gr0^P=|A^dxJ5=pKu*q54*wr zt{*dO&ja-ub0eSOzhNq5zjlxu_6;x%{*=EI!OoZzfE z*ACYRVC&D>^1NCN?ELCEkp)Q)(6cA3G8|68($%7mWntsH=d{yhV)? zje;KT-SOS=iZCuVF191OBU%Y|Ms`N(a{fV^NSnwl;ah@zXh>*C;InOsUqekX$hnyv z*BmBN2VMx@!;RoGYApX1^A=izn(-N6exz^5HQC-6^%&RXIdBVDud4~$>FIY(Qfu3d zXJ8Y(C4X`z;zQAgqOU|=iF^|NBsg2Tgc+xgg8f!%rRF-vfd1Hf@Cx~T%~d`Jdt{7> z%sJJu)D72z|DT$cahI>3@sr;5rC^L#1N1N$8|g=Iee~a$tDX$*8^&q&Gxdk6U@YZp zWqz)&M;-WohyNGE-sXuvLI#F`^^qhPi}|0N$yo;a6x8AMxvD+ALalc@J< zn8sMfR2A|nBv%N@K!3VRQgHD zC&7G_>r1aM{S)+w4=o)UoCRfF&c5E4;o0=F>4#xPW=3WzXGvM3tAnr5m`Sg`-di<5 zJ@nJSeZ$vIElqvY+|i%+7BELPpXiwBm|4Nu<@GZ4GSza`a+lEiaygi9_W)y5_q9Lp zc@^dt25Z_Z&RjW-dD{KKb!9knNUZIV!W5JjmKW+RQj4-zMQ^1(fy1Fc4bMJD!a_z!0 zm47+xqVH!o+?Rh}{&mckHSVq&sT%Q2+@Z0dv1j3q=pE7ZoF92H91I-{X60G)^v!40 zeNWv$AAq3=hJk2#J%qj}AL zo-BWl&h*e411;bzxCwA690S(Vtgp?6Pnnm#0iHk&vKQR?emkfSe(hPHj;&ra8r}mx z9s_zdeSbVy&vbqN7EiJ@K(*iloUgf>nqY;ENCD_bk8H~QYvdrOan zeo!-6GkIF-wBYQVXeOFj3NJ#3Y=_|doQBMIZ-MXmO3;sBJw!pvyzfmgJ{$pknFlx& zjFqi@sB60}tIOr_rcSA^LS4bee{*4dmEL#8SjJLnOBf{%VZ< zW7&^oJ2hiR#4sgh&~(*w>x?kHcIU#<=+fv-P);%8S)p!dUiBncGs%T=ppEjx=Gr!>a8U67 zFJ~&H@zX<~=4H(WJzXyC) zt^XPyJOJuj{=YARF_yZ5UIKN9ubDMq{51*m8Tfj-$EpKwWtPN9X3Vcku5&23=ZZot8IEO*o&tQ=WDPiyePaBZD=3oCYhVLCVBqceE1UVy?(gp;i9wP z$M}!&3W*AdN8^viC&nfQ_s;m(_*hA_Bw9IEIcBVMQ{<+|Fc`(0gIV+)x!;&8w`3lv z`_bL7jv36g;d6SddxF>Z5zbpzyY+hb?2Ur=K&{L=`#+$zmdBhA*E4h0*pb+giPVvd zA&g}%!#8Q%vATS9(C2(LeGaa5_O&=KrVUv4cZP_1Z*%Z@cot38n)q^XT~{yC`=xHy z1Ga%{cq{zB>J`?J%?oaZF8N*ZCow0&*!WNSz21V`pgU&`yXQ9p^<8Un_3(MB@4N0i z2gXZ!5d8VfQH_&~n>&H}vOkL+S@kxxLgS{(z#QGrxu)L;i(m+R4(i6nmq*hRYY%~% z(;Vmo>Q44Y)uiuy2dKH(gK19STDK5?;~wUxJ)e6%w?4Bz(~&cFKS+I$a+ZLxP**q( zs)03xS7AZPf|7agap}jU3*l3^A$db`7mP}cO2yK#^o6h*ZqMAFi9mm-n5&q(6lTLC z%zrS>alKb7uf;j*>ZjHlU6aizjOz|DlR{60@m-8L{64ehti}LUn0aEnPzY)=hd`bA z(SJQXA07GV$g#{SZJBEs_!JK24(9ZP7`GaeZ6l9yt)B>k!MxZ#)i~OCr5jMnX6oG8 z!I=kX{7gH*`rAh6$hn!uRHMP(mbPFV<;T|UWr{~*T^FwBwJX7#Y;FmX7 zG{-eBtj|n!ubEoo26z_qUm9CY2JfHy;4ARYF)$Te)6B15XP!^zc<1bTS9}EAXP41WZ=ZwD@KfOPVxF=3@an_!(6o+V zRvt~?;VS%GUFgfL#q3|_SXN0?NqDZf^9Ni!ABaB?uau}1_?t$>N5!|tw#P<8FWAT& zBKI`4==0%^@E@q`cZ3&*7Ka+cQD9s<9Gz}|{(dF{-W1GZZ^P_I?=wBix56dhx@rER z)_*5h=eh{q0OyTVfich$jM=TxXUa0coVR}T>gts=FPH>hL#R9y%+vL2jgQ*GIC@B4Wsb|d0&TNxv!B70xht7Ux+ymT z|K}O78?0mL9q?>Q_o-v(N3a*koU=Qq&FNz@C$pa5y|9)(DoR?xEV8Be@Rk6rH>e%i zAQrE|tc`oXb=c4MAaBqEG?rJ#7_0z8PZQ?pt>9c;J>0!u8E2%JpG^ek?oI)9aetS^ zuo8x+hNqT;8(k6H4lOe+ahP3;s{UiCZv-p= z=Kz_H_JBp;!=e5b3WvgD5@QnA7F}C(4BVBtE0Kz&VqL&l&S1~i2B@GJAXe*^sn{g|)fI@AM}QOkb}eO*n$ywK-R4Nbku z^}_W`Uz5-NB&M{Oo9zJgrf<=hMu2(c70lRG`*R(f!C9roNiW0Akby5i{mhSj{n{{} z_d$9CJHQ6!qMx3BdZ1BRuk=}Z0gRDdU+w_)+mGSD{pkRGzWM@O?`MPi*mtlAW-x2k z>%5qGA?Edd-aL39=RfJs>;n2S)mK`8o?vmVoZst8(9`GZryfv+^HF>*dQv;rBU2g9 zq^D~ubH9C-UxRP(;rLAM=6t9Kyp(z=3R)F;v>az*rt z=&`Y5V|T&^@H_(7E$1*-h*yZW0#5BkIltF!EH)@QC|VDOaDMOOa5bC)KXVSigy95%Y5=p z&OCVzjAh1y>!fkegW&zrH`+I9Kh(a+zR1Z?4R1_qW~(kLTvVuzV7BCr~YSLH}LSlU`C*?-D&jK`myy& z>|5G5h@m{E;KPy+OVpL#g;!t~SikEH+hI&`z zW@q3U_x}0-_QPqMhjKBz3Kck~$#`Z9ah7p}`m-Lelkg<}gU;J7*DiM#y#)iH6W%oA zcb~ua!MI`^81sAI9tYO#4}v+Ip32d%0n7tk_t(Sucs-4Q{Cs=#O>;@>4&EciOlnL` z!FcIK@EP&%^l_>?`8{0Y{Cz=-eC&9SN&sT@v@zuJ{IfLtH`ndHC>gO~!d<8BB zV-w@V4se7w^S46yk-j>$apUV_!L_a-7&l-u59W%iH8g=DSVa$m@%#W#-?YAC&%HG{ z`;s{Oky$EkMc5jK5s8L z51cJLUJH*e;H%FI@)ePGdlgX+9Vqy#bxTev;?m z2bc{jz~{goiSwWUBA^D;9$G_Ra8G{*27_^oe#(4|74{QXgx&NMmpooF@Qu6ow*d2I z^%QFl_J*mIy#?QaG3ylY_e;P!y=$UtiEisLganDaQNHz%OvUOqh z(PNp%f?oY)xn;RWiykf72-Z9Nd5qI$Q5P`Rn*ep_;p_*liQ7Se#F$;bj6Rw$sGI9) zd5hVSH*(hZE!kVLGtx8C15*PHK~j-qBv}^hHBo2U4(d!_famzcQ}NU&FdnRzu9t2P z(=yY7b5hP_?#d{5F!vx`KmX=@kBm*{FoSO*=iYw{YTB-cdg1S-9yuF+hD$i#tUtU3 zt~0&C=kr(axo%jZVW127Yjx#4ppV!4eFCUscLi&0mq#v-OfQ&T@O-J~OI-tDpbezt zTFzTsA73AT1*}WY;7nLvZsY~H5n6F>Z$HkOdl@#t>)`iy|1N^3!9DhW-l$w&E~vMi zD1M@N6Xr*$K|4R`1@JX^%_Dh{Ab0S!sD<@~f53lh9nW>duXCLp1>2x1ahNsN!7vD3 z2bS}|E3y$SNv)^`xSqH-x!zVRgFinQf{juczxp z&ciXUH;=dGsirrY9v<(HqT)rx^+K4>o+x&r*cF@|dIMPR{hya!uiy$$kFN%Y={4*H z%fZ%kn_T-tbOJhNVmZw7=1gbzj!MlXw97VF0O5DOv;0$)jc{KEBM4zup9)2P*2 zUth{BRIjDpFZVTd5MyrZA@1*8zK@!j*>p&=Tsy7U-1dlvoZM!FB8? zbWe5XWZ%M6FLJqCp=G8eCt5zA`3jb1mu8#hn&!?dIBSeApiGRDbz z&-6;v<9wYN;M)2Veu(~R-fu4u!L7k{2=SN$Y z(>rtm)J78Y+8IOn_uJq>cmveQ-vwtE%);+o0~(>;P&zNZ0AJO_+{E1Dun69PL(EgX z`1r-ay~iUE_;?H)z20i6UxRU$@m3l59hN`>YEm~m3ygoR2lb$P;UiE-G6x?7`nlDJ zLV2M;JFk&fBRDVfQ)UhuE72OoQ~PS*t=0SFdZw4a{I4gR4d%x~!TeD##xaz1^MBVm z^FQM$Ybc9BUEDvr6U?vmIMEUk^ccAQ8AG|&x%N4y=r4L2)Er!|tg#$}HQ;{ab7q~| z8nRlsn)wTyIcH4bb1*$NJytKjUjF`q{RL;0I;+&hr7tc$4kp7{r<`?41U@ePacP_1 z$Cesfs#NJxrCXJ1RqCIDf7pGd7d#62FeN@E=3 z@G|LBTE-lIzm7& znbzryjlSf}rx~DE$r#Jt6}2ZdDDOYlxJpnNKEX%rb7q`p{Nl$-P;+k!dI3tFC>iMa z&*1f6f&WT>|0poOG%vNju@d~~$Q<;`;3l{pzMv;S?aP>MPM@7QpZbozw|<->x+=RW z`&{O^%rEI*(%+`O<)p)RQl43*&$3OjP4fQ4{fRxGw?)0l5A(RWsky3$HqK+fyX+SX`(jW3r>d)U_Zp6Qin<{ zD!Hhn_q+G{(EOqK@5JAU_lfn1JrR8(dJ9|zyErGL8DzuR@FQ>+=l8nDWJ_d&T&*8x z)Ty0c3)b;2`j4mRuUQRh#0%jUa2@cOPzyZ7`9kKYtEh`z3f9%GgmXZl!#dn9=mF+n zdI2}VFjx^*9H&=`CUHsc&Ouh4sJ4q?ut$GIuI zj2}nun(MBqqgVQe+BA7z9v1aYV`@ug*Y2+O1a^r($(Ir@CC-Dt3;!;h49;yjHF0X<^}^Q+d%`~W9{MNx zC!Ft8CRGOa!AwqzTA7-co)?@y7tKU7d5Fbz;9D@)`xq`Mx+FOFPw%~2p|!KS!TX{V zeW7pSsW%VV0oIHj0rfifGOp_P zmtbK@&*hQ4BSCEPGw1IPq(ANwn2g_g1oQ&6t7`PZRRm)y{g&>#Q^5F5AHhiYky=@O z@VdWAZ{tn5n{w$)I#ZLGKRdEJf<5DMda2a2+&7Hb{V+z?$2A=Gfi-#KN43BYAP25h zLqJXT4A{&(lU~Jp1#4U~T^jRTG6--51S&Q}-IfX&s-huj1Eftq+BbC2ra z59$KyAy<;RkC(L?Sg9g)q*)dzu`ss5`Wac zk$)rS!*6)?2f%uED|?#Gg~s?;F9mx?tZQ5McHQ>*G$wS-GG_2~?4u9m7Z?eyL*B2h zbD5(5tHN`nI{X276uw?f6f`7{vXYYnim~ozMT7Z zcla3Eg4&XC(p0dvR~>4Db-|lqERfa|nIASf(J098UZq}m4!%BPx6$CWPeEyVcTE=R zg3r3o+%C9+dZX`&u~jYn1g_`Cg|25i!5C%_y+v2zl{Alk1+04*EBRil2fK!C0r#+L z@BpY=wuJHU4)`3H=XrhI8}0Qmo?gwo^aj}mS+(g3=?dwqQ&*>Uai(rAkxN_#t)OvX z!eh<^9}h#IPohtvcCt2E--kh6&a+Y;rSGm6K7o&c zw<@zJyC{20?v`Mt*1Mb;F^zd#>I}w^?oV4m-PG5hkHOq^Csp;Y*4f;9+;e7u@ssryYazx=o|)r);acyS=Q`qEIq>AbllCio3f^NW z=8;wB94DViV{GFjwWLnqzON6)nwxc|>dcMRx8pP6^XeK~4R6dLW;yykPX)CWKfBjI z3+o^UY6>HYk0`EgcV+m>a0O<*&5X{Bc8hh3JqwNEjRL>Gg}4JgkAEKj6DsCc%=e6y z8{j(7BYGfuAi4=YhPrS?&-u2=2Vb`K|;Kyuys&n$@M{o?)N?kgkWBjR7jzK%_fPL4)keq=rq zl~0e1504Md+R|I|BzyqFz<9v?$KDXv#T32%YS$NKF3L0 zqgXF9p6Ujzz#LP5XI(HiGhTTYJ_6TSwIAz&?csh<18z&7c4ubf_s6&Iz385~i23b9 z;Rm1vJi9WtGUxq%D!rJuf@^~P2j)q7{nQoHC)0u7!uvxl$+-9^y|mWiR)ev#8qz<^ z?9!8K?ai-II~oOk%?ZTa_c&ADxO6jp!0J(LpaWP-zAiY$_PS!zm}jVlHV*84HQyY` z><{B7|IBqQAJm=((d+vWRAd&fT8!~eTi}oAAJN~Kk@9GnN6Sor zw@-Qdl=7v^mtI$LUCF}*hYR$T>mzR!Z53@9X&L!E{CRjoXhY}?SY2Xu;5F+)zpq|c z{mJW!tqbP)>CH-FAZ-K2CFVne!PoH+Gg`f;^&c50UCaD7^RCOlSn6xMM34M;ws#}E zIXz$$jD@A34s|R1O)o|n&dRiAcQ1?wW3WZgfb%bnr>w!f6HK#tCz$WhgL$F;KM#UA zwrih0?y=zYosUOB4a}d@y~BLZdc5&dZ_u-KI&*XHWLBnokoT22`gky2R9911SC6vR zvH3sVqP}5l>00JG*#^`I+zZu*T=&kT)~n8a9(vsvCIfRp4g7|8_o6JMFG_!S?89SQ4sAJ96Fxln;lb*Msvr6V1|J@L_#UWqq|%Yi zM>ik+9GVqL#LQ#caKHq1Yac8~4 zz1JF!I*0Wkb&$%`jeK^@Jx0PZ*bnAOP4LM1(G>bXQC?A=dbV}B{xB0>2V?dhO8gMa zrhF*$P{=yHG166FY-Nn(dh{WEDfa1F&#oG-8rJ9MzpV(@KopFj{QaR4hl1~SKeJVa zz~&O0gEh>rajpLt{sI55wy+fDGKavvs9puV3PzS3S@Je;W@9)%oIgE2J#K$|nP{1) zKKK7=Rz;zrP!G^&(}4%R7M7p+76ia($Q7%MFY`yQW!-|&Zw19QAGpl)rg z_BYO&tU|A*YmYr@%V0I!2$kVfFn_LkvT6{6>n-#78w$oyp_8HD{0udr8898xF=jIV zyF9%d-sARP>2Fp8b>DV|wE7EDR}d>)%}fs0q|c~Jt1ET{Kg<>C6t7dfF}{i4>6QMM z-0QdKZ^1cqgW`kYU&0o!FJ(c&f`XplTGcGSS$^MmUrq@=E8Ys0$Ck%N!OG~$=xjI` zIT)OUsgJ2A4uVS1nt6eGEf+B3vL$__-JuewaUFtRi~SmSO&c;Ry(M01*IciozQy$M zbnv|2OdrPwnGZ5GlQomA;2O>|YX&{QLdv6=M>Bn44;;=O&UVgq&c&I5at>JQr>%ji z(^-K={U*MqhrznN*Xtu@tEey8^IQ=P>{c*`bnVkeWK6UhjAzaT`*NG%-Ec1`3+jT# zxz-P%Sbf?P*^$v%8@q9&l1+ZhDj zd)DPY1ABYblP&`NO|EIy;ubR-Wj9!V)9?Q{dOyw<`r~?I&NB(D z(XIr2{QK!6U9JBtb9TnLiAU2%)2lP9GbIq=pM=6(VeUHSx!T)heR?qb3)WCXf1h9`%XD(1dC&F(0`LA_%~WJlzy@K=F1^9nk=tpU5Hjiz@fiMP&T zq501*^y%(qUZ)=HBcNv89PF`MhmXnF=^W^ZFI+8tGm|$y0_$$wpb1#Vvz})x^#C-b zKH$GGKJwX^2Ws6L!5Byl-T%Yyt%t~XsvM|q)xk+_F6kOL9UcYs^_lPt+yMS;+o3IW zy6Zu`egO=Fg`l6-*vV&4kAX40_uXFng4Zu6f?q>o^BMz3Y?QC%IR$uVkO)EZxzUWJs1@}GunxjEo=~#(lB`7b2_HZWVIn2zxkn<~R!u602rI`q~ zHKeAYPw8~dop}X1!8f6A0!^x1xLhzJqXE>u*as08--&`A1zU(0(f@E_>o(I2MwXA#t5 zj)Ae1>-kgA93BMkomSvJ*dFxpxL)bUzZTqs&0(GZ_hn-#>vcYlw}4vqZ_Gl`M`PXX z0{Xwyy48x+SC@b~md~s4lDS4cUgn4CPrHuul;5P6ZA5rPcxGf~#NON$;9N`NBz15L zS<7GuYyoF8DFVL9*`+OEVr*j2lX89Z`rthARgqPZE#WQU32-e~@AG{)$mBjsFhSpr zd9``A9)Wqx@h~5D4K}VcCQy4)dr|N4dDYu+6PUjpGzM_s4|y_uIA zhH7wM?!Mfd^qh2sM1{nP!WD(z!aC@e>=(@aao&Dq=I8$fHL^9bt>Fb|iofP3*b80p z5vXF>H~)7%84l_K);-L%+?TvZT#uXwVm-~6Y6DcJkMn$}3C8YsK^wRO+;bO0H?Xg4 zB76a-aF&@q=|Zrd%Ki6jda2ZEs^nG4(>HA_r#`9Y^h(Zt7@Zl-MDQy!)^~qrR)LlM%+ zPqurU&-(!Q3|<1)w`(}hNuBO{G$iYF>P^+1+X63u`PmBa>(!*bW`6GdCGHQtuV2>{ z%+;*tnO}a)T)Ohiox2f?1^oZj%C7^x4E~?@Fn3xnvOm{E(1Vl)dsL$E7O0*51-rpm zNxe!>)1$>7<<#Et!CX(@?`fb1-Rsk*c%R~rK{e1j;JtIf$qNDv^8_FL;VI5T^qbA2 zRyqNGh1;{YdrM~3Z8t*!gUNk=)Gw^dSQEF7KJ`Dm->s>epn3n6qIPN?VUFPc=UVnT zs3{p28CR(vkwOM_8+}iEnVIRoaqY8z@l4K4dWT-o#+)guCtGjF;_%{d7tS0w5<3!W z9d8}<$_*+QRPY-tgZ|JPD!{w>@8;XO;# z$dHJ6xEew;crNd`yc)%86#t9fYIVOO^az!u_ugw_9HI`VMr9xWWnk^Vylt~*1%SSa z)8QsipIQ(8TD@E?-Sz1z&`02V>*r5l4<7FS z)c<_HlN`)u4(R*#KV8r~(4Vn5crUs38T-xx<0|h1Kf8Bb4eIaK=w5~mpax~kVeF(2 zz&uY~!T4%76f0h=cvpJOp8F{r z0^5VN*jVZqy}ZUF-+*z0>(CRRr^p^#;}!3}+u>~(93C8w178}%QoBOCLSMoK;S0hg zVNz&PaK6D4p(jFv;RWab1K~QT2}%0aLwxx6gJ2akJ!=a$GdW~CXFvISbt$!{w_yx) z26M*i@qI1_@8LhdoUks`1ow1jF%XGfk3r6Z*y)AFa~TO0g> z^C5j&H2B`H8X*hLnfQa&VL=`-?w!6ob9v@^_yVrYUYi}6 z8=0%b83!Fe{mcK~8i}=%nlKz(hpe4i-_uuVK34i<>0n*-y)-^FKU0r3ewqQ+H(V!- znf|wa=#RS^tcjTCpUS*hub1@^>jT!+)tS^eC&4X{IGH$EoB5S`?$nxGXNR{{0@w_qgP0i8krPE-0s?Wu8&r?Jvx_y>%! zAA?t*2V|iM{c`5^#(~X2ZAtCsNBl!KG1qa*e=Nvb5X{zHl(&e?=CxoSR7=_j-ji*> zxMv;O&~&htd@Y_x;~VoW|IRo^-ARv8&lho z+k)BcYnUY%%7(IsAVM$h72q5q>l$023G6n+AzcH;dHE1ln_BFsG{t+vvBoF8TxBMsqqbr~98SaUET2YD3G=|8D^`<-2j9w~Dli zj0=woG=cj<_fY{Z7jnOPoc>3j%_G#J8bej^nfARgr`)1X2&#bp@0p-hs2;qZ9ty9w z-b}T0*QF=GHR&ZdL~nw%LVK*u2MfWR+OILEE(d;(sqg_9Q+>c3Y-=BCQuY#=i(6w= zhxff~PH$^%u%>6+tB2E=*}cme^F!c%W}RJ+rm^w{yq$iHeVTufIa+^Lqxuf)^*s&r zM?J~8Fy>ZoXW!0tXRgxj)b7+C=B7J0w=rx^Y))(|+!oA-yEt)i;`hSe3r|m+j!U3> z;zIE3OXpf{f+ndZsc)cLx*Hkw943K2o-Us)pS>h^Np5_0eDL`Yb3lJ7`lZNgrDxc+ z>3(>NI@MpuV{VjPd8eBIp6$ zLxt4x{s!wh`Y(nuxA!ja`;~`<%)tBy)XL2RM=>+ec8TC$e zEWL-G&)GKKHoh^oka>!2@0FRU6FHm}I*P%Tz1 z$iX~=z;muVQ?7h|`JiU=Ui`iI(b&=0J+KZ2&{MyXvoHUF$WpoFb4d4>(hF?o}*voJ8*rO#i_lqtFxZsalp76yrvFUqbN0OK_rc!#rKzQ`w~3XO`?!_?H($z4~kz-wu(+;tF{wwNAS*Onhn{1ABkt!<11{cw+gKFPtL zZrvQc(lxv~^*PrWe{ElbK00Fx>#mo9HIEC5Ul7b^eYp6;#pl8>=n55J0jSZKG$z6Q zbu_(y73otRn;V&;$HCJxqEv{j;~hI-2^FG=zs? zIJAOSKp(hYcLpTDHO{r*S5QMR7E?2725NV%71dxC7^@k>8Jij_nTw^E*R7w@HOBAh z|Kr!x0JT^@8$%_S1Mw2)R*eT^t54y2C=JHedXJoQQVG;-zhHjb3i@{n!CCPi!&}af zJDFkP@hgF59XS~}X-|dzY;*smV0>zB>?{YLL;HD4g8Sml;9lu{st#i9rYjil-h@B; zvlE{Mf7VC;Gk(KKoPFv&V(-%R$?I{otxG!FEX zxD&2mCebEzc4I)-#9plc!bk4!kFfKYS`cvemVC|ZS@6}q}L@0pLV2*!7i5r4BrN+75KkApi;vcw> zv$ee5GoUZr3~D7_E8~GT@vNH5>Z$Ov*T~rBBk-Auz{PMYR0nesdv^57{B!&tDo_)G zGX_4QJI=M}YVdnlKbaSqM|bUl$cgZYp!Twmne*SES9Aeuwi;^h#w%)!JO|#Thr^uv zVla+z-}XJ!i(rgo3^eTcuwY%)S8A=o{u=*WZF~awb6eLipYh)tC+XYL6VeRyPN)g* zgzupF$>u@tj`cjX#eX@^z#Pf@PG5tup0yEuo?bK8F~7fFh0fqTsD@AjtjW9skAU~V zZ}1+t{$0r&)M2?{xf`-KWS>eum9|z_4r(Q91+#Qro2|`#17CoCaM$XkP$gL<`5Ej0 zjqoes{Pg+hYME-8m(wo?p35RRR^Ti``_3nsy5@G2NXsh2+t z#ssdJc_s3KIf@p;&V`T3IMtn816>zqgFlDs-Dda*T!Y=?&AnZ_?7!;`dyDT4&Qtdp zvhJoo+&a@hcn{3)&O#r549*5~`d6Vcv;@6SGpXAy1Fwb8of@zCpxzdHSsQTv$5hV0 z?FHsb#wX4;>J8IF(?jkXdR6t6uAraMJk@@gUd4J9Q>QQy z=Jy*z9V|K+^i6udn#ZaS-V?qj+#=EnJDduH{PCIKykO@u zd5-8gkf7fG5quZEL4z2$A+zJEf$!P>)*)l-$LUqv4_+JBd)FUxsY^jE zUrotp)ph!L@P6F|`W4lptr_%#X3+M(^Q+XJH^A?7U)d99oOm&)Rr~t)GTYX8at8gm zuF>jlUX$kk`2d#D6Ko&L8O$xQCKm_wRadI8MoK7{7vTYr0&CVT*U zsqy*jndg*CluJ}kRu6nX@21{OwP#Mqtjw%T&1}tVJ$NJcMy^Xym%!ht2CwGgdaLii z_0(L_nuvXsk28NljX)i^2kZyearNvM;SjjKEClylud_9*4PgB5edBZNKCRwojPHCJ zdmb+YpKI4QbJV8vIoD#&{JHqS^EprPN__f-g=eSRao@^6D{&j;Y&PXpI@wLtwQ<}c>W##!!J=YyW4OP~qp zxx1;@O+igbf0CZEkHCA;z7=aT)+W>#+;2O;Fi;ydJ_~BT+`oD$^$Gkz-H!N;Kr>@TrD z$nTAhUF(~Gv1)rT7r6*rlYH)`!t-EHhH=FdH~{9Z1+W~{#eIIQxA`oq2k9+Ub5?Ux z*Kut!hpL1p)pgo(b_ret)m!O>iDmfqOx(g6rU8U|e+(*atU_b2zFoL*^FP zz}e~D!rj7mhVDeAs2@_lXae4k)*Y+Bb<8ozO6s zjokh5>}PN<`+!Kg?2^FGOpIAd=0%<16!XzeivZ-e)jes9-$WBGp20PHvL{Z`jg zfAPLO1>7I4>t&0wMei`b!#HC#GykiA=kWDP_Da5$c#BHhY97@VFHRXYpgoZ;6s*EMI%Zf(Ln;A#4W%xm?&`~I3s zoXWX5dQ!drYvR4~b;R&cn$!4PU&`4i>dq_RD^PbfXEK&K1Fix4Lhgl@^rETjJP7sS zd3XqnOP+*ra5Xd0%hJP`Uz8v80?eil;M5bR23pB(JhuKE=0xVdf8$fNo*k?y#0cu- z>gfOT1@z_&I%6dJvX(IK@?vHTYy{&iKkK782X7S?$Utjq$t;%B;ZpdEKEG$-0jLMY zW9F)TA@Eig|s7d3zMwLAgiVKfW|bIO0{<@ML@H^xZj_dA#wXz#4OP2PXU zp+C%rWAG6;!@ydMF_a#B?^kP~=7e4gbq3>Y@5MEsmQW8aqfbgdR3Kcgbn_e{)vm4Y3=7*-by;)!fAlh)<)RMvKAYk;fxL z!b8IAL+e9dfcwjZ@Bw|8YISA6J=~wgnB0ZV_}ka>;mHq!wb>lWHCX*=6+Nr=)3~1a zSr3tMlDfaznZAp5^o6RWHiiUe4Hzq>i_$^gi8_;UO<5RPG&Jb(EuYIQP^1&2`oKso%dEyq|eLqqltpcwWhCnb(4Tskzy?**%M8A6lndr`N;P z^r74b@4-5_HG6BecCL1AK17NlMO9!uT*~>?=2)>4vA`dp&S*S1qS%OFP5P6WLN_v( z`7@XeAA$80_tb50cIfPo`POC3$JLu{4CHgZDY7ZjvSiDWJxld0b*$vElBWoD9nZG4 z&*5Wm555+@qz8RGXX@A&QXlq(_l4WR51}7|*(h~Gb%S#^jESuKF9GlEa_}j$Cx@YP zA7gey4w6GakxU!M*-E7zPi6Ihr1mJHQ@HwI%B%=J^?P z&S&u;Sqr_K-c0Kb?i2o9WAOR3hHQ*(Y_*U12Y-Vx?Qp0DdV8GPqi5I}Ukt2E8-q^* zV+r?L^EtJcb3kvwc>1y40Q-YWfpw2yHDPnr zW}x3u?N0xy^)F*Bua_~1v557Y888Iw6FR|%x}GtWF_Y_z@su&sGB94N1$r*69l9R* zZ~Y#J!8K_pxVE~Eu4ewu;OO9}Ue=3YbaZsEf9wwL=4AC3!!1HBg1q3*5`PBXuD;AS zoWLCJQeb@;X)EZNTtq*ddzb5uI=9d5e7qH3gZtJd_zQl88#%8|Ey>=3UDSfTeoJ5? zxaYe+x`r9U9|$_s4+Qn)(>T{RSie}yTz~aq)XUY&eUkYkqtaNsMW_=$>97wc< zU4^>}r$fC&y&#ryMggUo#J6yD^6H>Z1*=waR%%wNVY*>@D_lg6@Eqtuzjk>j2d$WC zYi@UH(W$`<6xUvB9bR{9vunX?>uYRUtZ5JrT69;(_t`c!P)AlHG7j1T%Rt@6Sn5qs z@j?3ij7!Xmtf`OVq=U*Z z2&{3aE4p{7F}hEfS z>tlU-8d$s5GczkZD?B$kH|j?i*2LDtG$Zwc?FHKl>XxiqvJZR*qhShUphBq%rOK5o zSMq^^2MS(*vfzB)tKsYT*YR7SLaah;60;y$!8~;2JHecOC1;cxJMCuH!)B-g);8yX zwOsS#a^Tu-55-yZDx1@`g-^jegF1)2p?(XmQYEw;S)lwGclZKVBO2E1k#r1jb})sQRdk zx74|uJ*5Y80aT_x(KzaPm=krR`V!nP z)e5W!`kZ|N7cqlJ|K%k5vD~Y@U;O{{fEnjh$X3X<$h63;Nv#RaxO^$~QtG|rd&$S4 zFZ>9ei&-~S7ZvJI>SI_237DOpoxV16ZQu!OooSu9kaOnFWOhUk*bFIX#cbr-%$YG} zwQs>aSMA=s^#HWO3-7*v2Of8|YU4ot(K9$t)%7L}*0rsLyFQuAx!+n_`4LLd*LDY_ z!8*S&)jrNXsS&CXvW8qOTrI4jZcnK_r5=PHC3}?geCh$8_6qJPrfYnWw9(6Q}}%z0E^>Zr?K=zUjVK#`Xari zhd~dadXl@!XuGIMpYONYmo+hKjDIpeav5w_=1U}1t{keDy%&WW(KZEtU zcVRwwO^kEYkIbih7VXJZKlYlK6WYITF6C?!^DlkZSK*;?J?{?I^!&OJVD9xIoC4O} z{($$vnyP)*#$YEQ0n@?Q$?Ks{)Y{Tz;Qry?cO^$Lem17t3dVlc)jHstbPYDvQKRz= zh^t{vY);URI5sjiat#=V8rPPE;mjp6f7k@ZoNp9=Bk%@{pobv}jDjlm5Pc_Vl5F!&6(}R_5$h%v8jcwZE!XCnszY%Y&SS#_dYNWGDmX1^LjX FiK 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°zJ|+rW!B=Tp#o)EdcM?rr=uQTBj$h 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�Xvuko|a&=4Vax!Er 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˘y3Q=v!s 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 I|2hKy1@EjJX8-^I literal 0 HcmV?d00001 diff --git a/essential/sound/004-white-noise-44-1-16bit.wav b/essential/sound/004-white-noise-44-1-16bit.wav new file mode 100644 index 0000000000000000000000000000000000000000..f0d50a80344f1599752c1f848401306992b6f227 GIT binary patch literal 5292044 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 z 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𝔥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%0AoJmQWdE=7JO7pw# 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

    o@{$xW zr$Edb#X_4S?ij;j4oAQ86(P1-|67p^`J3Uk;=(@$;0dtXB5n52eEUSR%WjbaUV^rX zTx2=x9^-$n0@~4vuQ=cqz~^E zBATRR3NI<^X7zsMjV&o&pwy;Pxd;~LG_owTQPKe`kU!;$Q z(^12#&nHK=3>h}HMunT~wT!pBE_12p{W#MpWuFhEPn>93i>hyLrVb4ft z>rJad&8{`B_sQUm5N)S#P4I06!VOIOmJoHMZE0pa#i8fh*js3b-Xr%tq{#VwOS;NF zx0xC9Wm5c#`3%)cgL#OqWOB`Ar(xU;wmmGZEDY_eym0#jP9^FyjDnjZI+@~uFx@SG zQ(P{y%;EQ#F5avmC&uW4P^uig70Qm@xTXp1j0|L@yL1(v;S7clLhJw889eQtTi8kq zn%GR+G1W9sg0>t=v%HIlcYn<-hU{nD7rhm>m~gv`WiJZOQ%!n-$^!y#gEy$|E;Oax zC8uvyt&i5h-WF*rGJO1Ua0{zcZE4V`d!T-Ee=Ikd@n>wJo#rG`1F0b`7M-b*QCU7Q zK)qY5W;B57hA}~>^AoKO8(s5WZM3PgkNH26QfC`iF!aTM4tzJdt+hD&5twP^|JKTP zTi-hRu0MA{(R=~vjQvXyE#_yke?!PG2%a=K=t!^P8+&)N~hhbqafK+mD(_JGZ z11>Ep57uhzdW`(0M0g(N4-cQ56&ehWM=yXD7Q#lf4%nW6yyS}PjGg#)A0YQ;2{pY2 zyJ1g8rD|Z?k@`u-Pvm+hKY-&20#)wYgt1k_!iw#;hHeeNtRH~BvAWmEp%4&+>vL

    ue);2ScYWsE=!OJ9Az&eZ` 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�Xw(m$Eo`rhDe}>2<2F$Mn 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 z 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