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
|
import re
import json
from roof.arguments import roof_get_args
from roof.defaults import roof_default_paths, roof_raw_data_types
class RoofConfig:
def __init__(self, config=None):
self.args = roof_get_args()
self.config_file = self.get_arg('config', 'roof.json') if config is None else config
with open(self.config_file) as json_file:
self.cfg = json.load(json_file)
self.path = self.get_opt('data', 'base_path', './')
self.planes = self.get_opt('hardware', 'planes', 1)
self.modules = self.get_opt('hardware', 'modules', 0)
self.streams = self.get_opt('network', 'streams', self.modules if self.modules else 1)
self.bit_depth = self.get_opt('hardware', 'bit_depth', 8)
self.sample_rate = self.get_opt('hardware', 'sample_rate', 0)
self.imaging_rate = self.get_opt('hardware', 'imaging_rate', 0)
self.fan_bins = self.modules * self.get_opt('hardware', 'channels_per_module', 16)
self.fan_projections = self.get_opt('hardware', 'samples_per_rotation', (self.sample_rate / self.imaging_rate) if (self.imaging_rate and self.sample_rate) else 1000)
if self.args.number is None: self.args.number = 0 if self.args.benchmark else self.planes
# Consistency and default mode
if (self.args.plane is not None) and (self.args.plane > self.planes):
raise ValueError("Only {} planes in configuration, but the plane {} is requested".format(self.planes, self.args.plane))
n_modes = (int(self.args.gui) + int(self.args.track) + int(0 if self.args.write is None else 1))
if n_modes > 1:
raise ValueError("GUI, Control, and Write modes are mutualy incompatible")
elif n_modes == 0:
self.args.write = "raw_sinograms"
def get_arg(self, arg, default = None):
ret = getattr(self.args, arg)
return ret if ret is not None else default
def get_opt(self, group, item, default = None):
if self.cfg.get(group, {}).get(item) != None:
return self.cfg[group][item]
else:
return default
def get_roof_path(self, data_type):
subpath = self.get_opt('data', data_type)
if subpath is None: subpath = roof_default_paths[data_type]
if subpath is None: raise "Unknown data type %s is requested" % subpath
return subpath if subpath.startswith('/') else self.path + '/' + subpath
def get_roof_glob(self, data_type):
path = self.get_roof_path(data_type)
if path is None: return None
globre = re.compile('%.?(\d+)[luid]')
return globre.sub('*', path)
def get_writer_type(self):
if self.args.output and re.search('/dev/null$', self.args.output): return None
return None if self.args.benchmark else self.args.write if self.args.write else 'raw_sinograms'
def get_writer_path(self):
data_type = self.get_writer_type()
if data_type is not None:
path = self.args.output if self.args.output is not None else self.get_roof_path(data_type)
if self.args.format: path = re.sub('\.([^.]+)$', '.' + self.args.format, path)
return path
return None
def check_writer_type_is_raw_or_none(self):
data_type = self.get_writer_type()
data_path = self.get_writer_path()
return (data_type is None) or ((data_type in roof_raw_data_types) and re.search('\.raw$', data_path))
def check_writer_type_is_raw(self):
data_type = self.get_writer_type()
return (data_type is not None) and self.check_writer_type_is_raw_or_none()
|