diff options
Diffstat (limited to 'bin/chroma-server')
-rwxr-xr-x | bin/chroma-server | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/bin/chroma-server b/bin/chroma-server new file mode 100755 index 0000000..9cd8e47 --- /dev/null +++ b/bin/chroma-server @@ -0,0 +1,57 @@ +#!/usr/bin/env python +#--*-python-*- + +import sys +import optparse +import zmq +from chroma import Simulation +from chroma.tools import enable_debug_on_crash +from chroma.loader import load_geometry_from_string + +class ChromaServer(object): + '''A ZeroMQ socket server which listens for incoming Photons objects + and replies with propagated Photons. + + :param address: Socket address on which to listen + :param detector: Detector to progagate photons in + ''' + def __init__(self, address, detector): + # set up zeromq socket + self.address = address + self.context = zmq.Context() + self.socket = self.context.socket(zmq.REP) + self.socket.bind(address) + + # set up simulation + self.detector = detector + self.sim = Simulation(self.detector) + + def serve_forever(self): + '''Listen for photons, propagate them, and return the final states.''' + while True: + photons_in = self.socket.recv_pyobj() + print 'Processing', len(photons_in), 'photons' + + # propagate in chroma simulation + photons_end = self.sim.simulate(photons_in, keep_photons_end=True).next() + + # return final photon vertices to client + self.socket.send_pyobj(photons_end) + + +if __name__ == '__main__': + enable_debug_on_crash() + parser = optparse.OptionParser('%prog <detector> <options>') + parser.add_option('--address', dest='address', default='tcp://*:5024') + options, args = parser.parse_args() + + if len(args) < 1: + sys.exit(parser.format_help()) + + print 'reticulating splines...' + detector = load_geometry_from_string(args[0]) + + print 'starting chroma server listening on', options.address + server = ChromaServer(options.address, detector) + server.serve_forever() + |