forked from SjulsonLab/RPi4_behavior_boxes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun_remi_self_admin_task.py
More file actions
134 lines (114 loc) · 4.49 KB
/
run_remi_self_admin_task.py
File metadata and controls
134 lines (114 loc) · 4.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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()