summaryrefslogtreecommitdiffstats
path: root/tests/roof.py
blob: 1941aa8fc2afb0ba421bdeaa7447d326f56365ce (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 gi
import re
import sys
import json
import argparse


gi.require_version('Ufo', '0.0') 
from gi.repository import Ufo
from gi.repository import GObject

class RoofConfig:
    def __init__(self, args, config="roof.json"):
        self.streams = 1
        self.bit_depth = 8
        self.convert = False if ((not args.output) or (re.compile('\.raw$').search(args.output))) else True
        self.build = "raw" if args.noroof else "ufo" if self.convert else "sino"

        with open(config) as json_file:
            cfg = json.load(json_file)
            if cfg.get("network", {}).get("streams") != None:
                self.streams = cfg["network"]["streams"]
            elif cfg.get("hardware", {}).get("modules") != None:
                self.streams = cfg["setup"]["modules"]

            if cfg.get("hardware", {}).get("bit_depth") != None:
                self.bit_depth = cfg["hardware"]["bit_depth"]

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--config',   dest="config", default="roof.json", help="ROOF configuration (JSON)")
parser.add_argument('-o', '--output',   dest="output", default=None, help="Output file")
parser.add_argument('-n', '--number',   dest="number", default=None, type=int, help="Specify number of frames to capture (limits number of captured frames irrespective of further filtering)")
parser.add_argument('-p', '--plane',    dest="plane",  default=None, type=int, help="Only process the specified detector plane (indexed from 1)")
parser.add_argument(      '--no-roof',  dest="noroof", default=False, type=bool, help="Disable ROOF, only network testing (no sinogram building, store linearly)")
#parser.add_argument('-r', '--raw',    dest="raw",    default=False, type=bool, help="Store raw data, ignore processed")
#parser.add_argument('-v', '--visualize', dest='visualize', default=False, type=bool, help="Visualize data")
args = parser.parse_args()


cfg = RoofConfig(args, args.config)

pm  = Ufo.PluginManager()
graph = Ufo.TaskGraph()
scheduler = Ufo.Scheduler()

if args.output is None:
    print ("Starting ROOF using NULL writter")
    write = pm.get_task('null')
    if args.number is None: args.number = 0
else:
    print ("Starting ROOF streaming to {}".format(args.output))
    write = pm.get_task('write')
    write.set_properties(filename=args.output)
    if args.number is None: args.number = 5

build = pm.get_task('roof-build')
build.set_properties(config=args.config, number=args.number, build=cfg.build)

plane = pm.get_task('roof-plane') if args.plane else None
if plane: plane.set_properties(plane=args.plane)

for id in range(cfg.streams):
    read = pm.get_task('roof-read') 
    read.set_properties(config=args.config, id=id)
    graph.connect_nodes(read, build)
    build.bind_property('stop', read, 'stop', GObject.BindingFlags.DEFAULT)

#read_task.set_properties(path='/home/data/*.tif', start=10, number=100)
#graph.connect_nodes_full(read, write, 0)

if plane:
    graph.connect_nodes(build, plane)
    graph.connect_nodes(plane, write)
else:
    graph.connect_nodes(build, write)



scheduler.run(graph)