-
Notifications
You must be signed in to change notification settings - Fork 0
/
folder_naming_specs.py
163 lines (132 loc) · 4.95 KB
/
folder_naming_specs.py
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import logging
from pathlib import Path
from .file import File
from .parsers2p.parser2pRSP import Parser2pRSP
class FolderNamingSpecs:
"""The class :class:`FolderNamingSpecs` represents the naming convention
of the files and folders in which the experimental data is stored.
Attributes
----------
folder_name : str
Name of the folder containing the experimental
data generated by suite2p and registers2p
config: dict
Dictionary containing the configuration parameters
mouse_line : str
Name of the mouse line (e.g. 'CX')
mouse_id : str
Mouse id (e.g. '95_2')
hemisphere : str
Hemisphere of the brain (e.g. 'hL')
brain_region : str
Brain region (e.g. 'V1')
monitor_position : str
Monitor position (e.g. 'monitor_front')
fov : str, optional
Field of view (e.g. 'fov1')
cre : str, optional
Cre line (e.g. 'Sst-IRES-Cre')
"""
def __init__(
self,
folder_name: str,
config: dict,
):
self.original_config = config
self.folder_name = folder_name
logging.info(f"Parsing folder name: {folder_name}")
self.parse_name()
self.mouse_line = self._parser.info["mouse_line"]
self.mouse_id = self._parser.info["mouse_id"]
self.hemisphere = self._parser.info["hemisphere"]
self.brain_region = self._parser.info["brain_region"]
self.monitor_position = self._parser.info["monitor_position"]
try:
self.fov = self._parser.info["fov"]
except KeyError:
self.fov = None
try:
self.cre = self._parser.info["cre"]
except KeyError:
self.cre = None
self.paths = [
self._parser.get_path_to_experimental_folder(),
self._parser.get_path_to_stimulus_AI_schedule_files(),
self._parser.get_path_to_serial2p(),
]
self.allen_dff_file_path = self._parser.get_path_to_allen_dff_file()
def parse_name(self) -> None:
"""Parses the folder name and evaluates the parameters `mouse_line`,
`mouse_id`, `hemisphere`, `brain_region`, `monitor_position.
Other parameters might be parsed depending on the project.
Raises
------
ValueError
if the parser specified in the config file is
not implemented
"""
if self.original_config["parser"] == "Parser2pRSP":
logging.debug("Parsing folder name using Parser2pRSP")
self._parser = Parser2pRSP(self.folder_name, self.original_config)
else:
logging.error(
f"Parser {self.original_config['parser']} \
not supported"
)
raise ValueError(
f"Parser {self.original_config['parser']} \
not supported"
)
def extract_all_file_names(self) -> None:
"""Recursively searches files in the given folder.
It also locates the allen_dff file and the serial2p files.
Raises:
FileNotFoundError: if the allen_dff is not present
FileNotFoundError: if the serial2p folder is not present
Returns:
list: of :class:`File` containing all read files with
their path and extension.
"""
logging.info("Extracting all file names")
self.all_files = []
if self.original_config["use-allen-dff"]:
logging.info("Using allen dff file")
if self.allen_dff_file_path.exists():
self.all_files.append(
File(
name=self.allen_dff_file_path.name,
path=self.allen_dff_file_path,
)
)
else:
logging.info("No allen dff file found")
raise FileNotFoundError(
"No allen dff file found. Is this path correct: "
+ f"{self.allen_dff_file_path}?"
)
else:
logging.info("Not using allen dff file")
for path in self.paths:
if path.exists():
self.search_file_paths(path)
else:
logging.info(f"No files found in {path}")
raise FileNotFoundError(
f"No files found in {path}. Is it correct?"
)
for file in self.all_files:
logging.info(
f"Filename found and stored: {file.name}, "
+ f"its path is {file.path}"
)
def search_file_paths(self, path: Path) -> None:
not_saved_file_paths = 0
for i in path.glob("**/*"):
try:
self.all_files.append(File(i.name, i))
except ValueError:
not_saved_file_paths += 1
pass
logging.info(
f"Discarded {not_saved_file_paths} file paths from {path}"
)