|
7 | 7 | from typing import Optional |
8 | 8 |
|
9 | 9 | from .constants import rhino_paths, localization_files, montage_files, \ |
10 | | - subject_files, session_files, ramulator_files, \ |
| 10 | + subject_files, session_files, ramulator_files, elemem_files, \ |
11 | 11 | PYFR_SUBJECT_CODE_PREFIXES |
12 | 12 | from .util import get_root_dir |
13 | 13 | # from .warnings import MultiplePathsFoundWarning |
@@ -80,6 +80,8 @@ def __init__(self, subject: Optional[str] = None, |
80 | 80 |
|
81 | 81 | self._paths = rhino_paths |
82 | 82 |
|
| 83 | + self.system_version = self._determine_system_version() |
| 84 | + |
83 | 85 | @property |
84 | 86 | def path_info(self): |
85 | 87 | return self._paths |
@@ -109,6 +111,21 @@ def subject_files(self): |
109 | 111 | """ All files that vary only by subject """ |
110 | 112 | return subject_files |
111 | 113 |
|
| 114 | + def _determine_system_version(self): |
| 115 | + elemem_wildcard = self._paths["elemem_session_folder"][0].rstrip('*') |
| 116 | + |
| 117 | + subject_montage = self.subject |
| 118 | + if self.montage != '0': |
| 119 | + subject_montage = "_".join([self.subject, self.montage]) |
| 120 | + |
| 121 | + elemem_path = elemem_wildcard.format(subject=subject_montage, |
| 122 | + experiment=self.experiment, |
| 123 | + session=self.session) |
| 124 | + if os.path.exists(os.path.join(self.rootdir, elemem_path)): |
| 125 | + return 4.0 |
| 126 | + else: |
| 127 | + return 3.0 # only 4.0 is matched on, but may want to fully implement |
| 128 | + |
112 | 129 | def find(self, data_type): |
113 | 130 | """ |
114 | 131 |
|
@@ -148,18 +165,29 @@ def _lookup_file(self, data_type): |
148 | 165 | timestamped_dir = None |
149 | 166 |
|
150 | 167 | # Only check the host_pc folder if necessary |
151 | | - if data_type in ramulator_files: |
152 | | - folder_wildcard = self._paths['ramulator_session_folder'][0] |
153 | | - ramulator_session_folder = folder_wildcard.format( |
154 | | - subject=subject_montage, experiment=self.experiment, |
155 | | - session=self.session) |
156 | | - |
157 | | - timestamped_dir = self._get_most_recent_ramulator_folder( |
158 | | - ramulator_session_folder) |
159 | | - |
160 | | - # The user can also just request the folder |
161 | | - if data_type == 'ramulator_session_folder': |
162 | | - return timestamped_dir |
| 168 | + if data_type in ramulator_files or data_type in elemem_files: |
| 169 | + if self.system_version == 4.0: # system 4 |
| 170 | + folder_wildcard = self._paths['elemem_session_folder'][0] |
| 171 | + elemem_session_folder = folder_wildcard.format( |
| 172 | + subject=subject_montage, experiment=self.experiment, |
| 173 | + session=self.session) |
| 174 | + |
| 175 | + timestamped_dir = self._get_most_recent_elemem_folder(elemem_session_folder) |
| 176 | + |
| 177 | + if data_type == 'elemem_session_folder': |
| 178 | + return timestamped_dir |
| 179 | + else: # system 3 (don't think will work for systems 1 and 2) |
| 180 | + folder_wildcard = self._paths['ramulator_session_folder'][0] |
| 181 | + ramulator_session_folder = folder_wildcard.format( |
| 182 | + subject=subject_montage, experiment=self.experiment, |
| 183 | + session=self.session) |
| 184 | + |
| 185 | + timestamped_dir = self._get_most_recent_ramulator_folder( |
| 186 | + ramulator_session_folder) |
| 187 | + |
| 188 | + # The user can also just request the folder |
| 189 | + if data_type == 'ramulator_session_folder': |
| 190 | + return timestamped_dir |
163 | 191 |
|
164 | 192 | expected_path = self._find_single_path(paths_to_check, |
165 | 193 | protocol=self.protocol, |
@@ -203,6 +231,27 @@ def _get_most_recent_ramulator_folder(self, base_folder_path): |
203 | 231 |
|
204 | 232 | return latest_directory |
205 | 233 |
|
| 234 | + def _get_most_recent_elemem_folder(self, base_folder_path): |
| 235 | + timestamped_directories = glob.glob(os.path.join(self.rootdir, base_folder_path)) |
| 236 | + |
| 237 | + # start of directory should be subject code |
| 238 | + timestamped_directories = [ |
| 239 | + d for d in timestamped_directories |
| 240 | + if os.path.isdir(d) and os.path.basename(d)[:len(self.subject)] == self.subject |
| 241 | + ] |
| 242 | + |
| 243 | + # sort such that most recent appears first |
| 244 | + timestamped_directories = sorted(timestamped_directories)[::-1] |
| 245 | + |
| 246 | + if len(timestamped_directories) == 0: |
| 247 | + raise RuntimeError("No timestamped folder found in elemem folder.") |
| 248 | + |
| 249 | + # only return the values from the final "/" to the end |
| 250 | + latest = timestamped_directories[0] |
| 251 | + latest_directory = latest[latest.rfind("/") + 1:] |
| 252 | + |
| 253 | + return latest_directory |
| 254 | + |
206 | 255 | def _find_single_path(self, paths, **kwargs): |
207 | 256 | final_paths = [] |
208 | 257 | for path in paths: |
|
0 commit comments