Skip to content

Commit 4be51fc

Browse files
Merge pull request #1734 from AllenNeuralDynamics/production_testing
[update main] 2026-04-07
2 parents 6922cb9 + 29d090c commit 4be51fc

5 files changed

Lines changed: 938 additions & 67 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Dynamic Foraging Task
1+
# Dynamic Foraging Task
22

33
A [Bonsai](https://bonsai-rx.org/) workflow for lick-based foraging experiments, with a [PyQt](https://wiki.python.org/moin/PyQt) frontend for visualizing performance and modifying task parameters.
44

src/foraging_gui/Foraging.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
PlotV,
8989
)
9090
from foraging_gui.warning_widget import WarningWidget
91+
import csv
92+
9193

9294
logger = logging.getLogger(__name__)
9395
logger.root.handlers.clear() # clear handlers so console output can be configured
@@ -1824,17 +1826,11 @@ def _GetApprovedAINDProjectNames(self):
18241826
)
18251827
return []
18261828

1827-
def parse_setting_csv_file(self, csv_file) -> dict:
1828-
settings = {}
1829-
with open(csv_file, 'r', encoding='utf-8') as f:
1830-
for line in f:
1831-
line = line.strip()
1832-
if not line:
1833-
continue
1834-
if ',' in line:
1835-
key, value = line.split(',', 1)
1836-
settings[key.strip()] = value.strip()
1837-
return settings
1829+
def parse_setting_csv_file(self, csv_file: str) -> dict:
1830+
with open(csv_file, newline='') as csvfile:
1831+
reader = csv.reader(csvfile)
1832+
return {rows[0]:rows[1] for rows in reader}
1833+
18381834
def _GetSettings(self):
18391835
"""
18401836
Load the settings that are specific to this computer
@@ -7275,6 +7271,10 @@ def _generate_upload_manifest(self):
72757271
self.VideoFolder.replace("\\", "/")
72767272
]
72777273

7274+
# Determine sci email
7275+
sci = self._GetInfoFromSchedule(self.behavior_session_model.subject, "PI")
7276+
sci_email = "svc_aind_behavior@alleninstitute.org" if not sci else get_user_email(sci)
7277+
72787278
# Define contents of manifest file
72797279
contents = {
72807280
"acquisition_datetime": self.behavior_session_model.date,
@@ -7299,6 +7299,7 @@ def _generate_upload_manifest(self):
72997299
"schedule_time": schedule_time,
73007300
"project_name": self.Metadata_dialog.ProjectName.currentText(),
73017301
"script": {},
7302+
"user_email": sci_email
73027303
}
73037304

73047305
# Define filename of manifest
@@ -7324,6 +7325,21 @@ def _generate_upload_manifest(self):
73247325
+ "Please alert the mouse owner, and report on github.",
73257326
)
73267327

7328+
def get_user_email(username: str) -> str:
7329+
domain = ms_active_directory.ADDomain("corp.alleninstitute.org")
7330+
domain_username = getpass.getuser()
7331+
session = domain.create_session_as_user(
7332+
domain_username,
7333+
authentication_mechanism=ldap3.SASL,
7334+
sasl_mechanism=ldap3.GSSAPI,
7335+
)
7336+
7337+
ad_user = session.find_user_by_name(username, attributes_to_lookup=["mail"])
7338+
if ad_user is None:
7339+
raise ValueError(f"User '{username}' not found in Active Directory.")
7340+
return ad_user.all_attributes["mail"]
7341+
7342+
73277343
def validate_aind_username(
73287344
username: str,
73297345
domain: str = "corp.alleninstitute.org",

src/foraging_gui/settings_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ class BonsaiSettingsModel(BaseModel):
135135
default=8,
136136
description="Gain for the body camera"
137137
)
138+
139+
video_file_format: Literal["mp4", "mkv"] = Field(default="mkv", description="File format to write video files to.")
140+
138141
ffmpeg_output_args: str = Field() # required field so no default
139142
ffmpeg_input_args: str = Field() # required field so no default
140143

0 commit comments

Comments
 (0)