summaryrefslogtreecommitdiffstats
path: root/tests/roof/config.py
blob: 8f72014dfa57bc21bb94b6b278b5804dae7659ea (plain)
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
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):
        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()