File indexing completed on 2026-06-17 07:50:55
0001
0002 """
0003 Simple client for EICrecon managed PODIO processor.
0004 Submits a file processing request and listens for a response.
0005 """
0006
0007 import zmq
0008 import json
0009 import sys
0010 import argparse
0011 import time
0012 from pathlib import Path
0013
0014
0015 def main():
0016 parser = argparse.ArgumentParser(description='Submit file to EICrecon managed PODIO processor')
0017 parser.add_argument('input_file', help='Input file path')
0018 parser.add_argument('output_file', help='Output file path')
0019 parser.add_argument('--socket', default='/tmp/eicrecon_managed.sock',
0020 help='Socket path (default: /tmp/eicrecon_managed.sock)')
0021 parser.add_argument('--timeout', type=int, default=300,
0022 help='Timeout in seconds (default: 300)')
0023
0024 args = parser.parse_args()
0025
0026
0027 if not Path(args.input_file).exists():
0028 print(f"Error: Input file '{args.input_file}' does not exist")
0029 sys.exit(1)
0030
0031
0032 context = zmq.Context()
0033 socket = context.socket(zmq.REQ)
0034
0035 try:
0036
0037 socket_address = f"ipc://{args.socket}"
0038 print(f"Connecting to {socket_address}...")
0039 socket.connect(socket_address)
0040
0041
0042 socket.setsockopt(zmq.RCVTIMEO, args.timeout * 1000)
0043 socket.setsockopt(zmq.SNDTIMEO, 5000)
0044
0045
0046 request = {
0047 "input_file": str(Path(args.input_file).absolute()),
0048 "output_file": str(Path(args.output_file).absolute())
0049 }
0050
0051 print(f"Submitting request:")
0052 print(f" Input: {request['input_file']}")
0053 print(f" Output: {request['output_file']}")
0054
0055
0056 socket.send_string(json.dumps(request))
0057
0058
0059 start_time = time.time()
0060 print("Waiting for processing to complete...")
0061
0062 try:
0063
0064 response_str = socket.recv_string()
0065 response = json.loads(response_str)
0066
0067 elapsed = time.time() - start_time
0068 print(f"\n[{elapsed:.1f}s] Response received:")
0069 print(f" Status: {response.get('status', 'unknown')}")
0070
0071 if 'message' in response:
0072 print(f" Message: {response['message']}")
0073
0074 if 'events_processed' in response:
0075 print(f" Events processed: {response['events_processed']}")
0076
0077
0078 status = response.get('status', '')
0079 if status == 'completed':
0080 print(f"\n✓ Processing completed successfully!")
0081 print(f" Total time: {elapsed:.1f}s")
0082 print(f" Output file: {response.get('output_file', args.output_file)}")
0083 elif status == 'error':
0084 print(f"\n✗ Processing failed!")
0085 print(f" Error: {response.get('message', 'Unknown error')}")
0086 sys.exit(1)
0087 else:
0088 print(f"\n? Unexpected status: {status}")
0089 sys.exit(1)
0090
0091 except zmq.Again:
0092 print(f"\nTimeout after {args.timeout} seconds")
0093 sys.exit(1)
0094 except KeyboardInterrupt:
0095 print(f"\nInterrupted by user")
0096 sys.exit(1)
0097 except json.JSONDecodeError as e:
0098 print(f"\nError parsing response: {e}")
0099 print(f"Raw response: {response_str}")
0100 sys.exit(1)
0101
0102 except zmq.ZMQError as e:
0103 print(f"ZMQ Error: {e}")
0104 sys.exit(1)
0105 except Exception as e:
0106 print(f"Unexpected error: {e}")
0107 sys.exit(1)
0108 finally:
0109 socket.close()
0110 context.term()
0111
0112
0113 if __name__ == "__main__":
0114 main()