ATLAS Offline Software
Loading...
Searching...
No Matches
ros-hitstats-to-json.py
Go to the documentation of this file.
1#!/usr/bin/env python
2#
3# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
4#
5
6# This script parses outputs of HLTMPPU ROS hit simulation, converts them
7# to JSON and appends to extra-results.json
8
9import logging
10import re
11import sys
12import os.path
13import json
14from collections import OrderedDict
15from enum import IntEnum
16
17
18class LastUpdatedOrderedDict(OrderedDict):
19 'Store items in the order the keys were last added'
20
21 def __setitem__(self, key, value):
22 if key in self:
23 del self[key]
24 OrderedDict.__setitem__(self, key, value)
25
26
27class LookUpDict(IntEnum):
28 'Defines columns in hitstats file'
29 ROS_NAME = 0
30 NUM_ROBS = 1
31 TOTAL_HITS_PER_EVT = 2
32 TOTAL_ROB_FRAC_PER_EVT = 3
33 TOTAL_BYTES_PER_EVT = 4
34 NOBLD_HITS_PER_EVT = 5
35 NOBLD_ROB_FRAC_PER_EVT = 6
36 NOBLD_BYTES_PER_EVT = 7
37 EVBLD_HITS_PER_EVT = 8
38 EVBLD_ROB_FRAC_PER_EVT = 9
39 EVBLD_BYTES_PER_EVT = 10
40
41
42def get_lines(pattern, filename):
43 if not os.path.isfile(filename):
44 logging.warning("Cannot open file {}".format(filename))
45 return None
46 with open(filename) as logfile:
47 lines = re.findall("{}.*$".format(pattern),
48 logfile.read(), re.MULTILINE)
49 if len(lines) == 0:
50 logging.warning("Could not find pattern \"{}\" in file {}".format(pattern, filename))
51 return None
52 return lines
53
54
55def split_lines(pattern, lines):
56 result = []
57 for line in lines:
58 split_result = []
59 for token in re.split(pattern, line):
60 token = token.replace(' ', '')
61 if not token == '':
62 split_result.append(token)
63 result.append(split_result)
64 return result
65
66
67def main():
68 logging.basicConfig(stream=sys.stdout,
69 format='%(levelname)-8s %(message)s',
70 level=logging.INFO)
71
72 ros_stats = LastUpdatedOrderedDict()
73
74 lines = get_lines(r'^\s*ROS-', 'ros_hitstats_reject.txt')
75 table = split_lines(r'\||,', lines)
76
77 for row in table:
78 name = row[LookUpDict.ROS_NAME]
79 hit_rate = row[LookUpDict.TOTAL_ROB_FRAC_PER_EVT]
80 data_rate = row[LookUpDict.TOTAL_BYTES_PER_EVT]
81 ros_stats[name] = LastUpdatedOrderedDict({
82 'hits-per-evt': hit_rate,
83 'kbytes-per-evt': float(data_rate)/1000
84 })
85
87 output_file = 'extra-results.json'
88 if os.path.isfile(output_file):
89 with open(output_file) as f:
90 data.update(json.load(f, object_pairs_hook=LastUpdatedOrderedDict))
91
92 data.update({'ros-stats': ros_stats})
93
94 with open(output_file, 'w') as f:
95 json.dump(data, f, indent=4)
96
97
98if "__main__" in __name__:
99 sys.exit(main())
get_lines(pattern, filename)