ATLAS Offline Software
Loading...
Searching...
No Matches
trigbs_updateBSMetadata.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'''
7Write a copy of a ByteStream file with updated metadata
8'''
9
10import sys
11import argparse
12import logging
13import eformat
14import libpyevent_storage as EventStorage
15
16
17# This mapping was found in a comment in PyUtils.MetaReader
18beam_type_dict = {
19 'none': 0,
20 'protons': 1,
21 'ions': 2
22}
23
24
26 parser = argparse.ArgumentParser(usage='%(prog)s [options] FILE',
27 description=__doc__,
28 formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=36, width=100))
29 parser.add_argument('file',
30 metavar='FILE',
31 help='input ByteStream file')
32 parser.add_argument('--outputName', '-o',
33 metavar='NAME', action='store',
34 help='Output file name base. If not specified, created automatically from metadata')
35 parser.add_argument('--copyFrom', '-c',
36 metavar='FILE', action='store',
37 help='Copy metadata from other ByteStream file')
38 parser.add_argument('--numEvents', '-n',
39 metavar='NUM', action='store', type=int,
40 help='Copy only first NUM events from input to output')
41 parser.add_argument('--runNumber', '-r',
42 metavar='NUM', action='store', type=int,
43 help='Change run number')
44 parser.add_argument('--stream', '-s',
45 metavar='NAME', action='store',
46 help='Change stream name')
47 parser.add_argument('--projectTag', '-p',
48 metavar='TAG', action='store',
49 help='Change project tag')
50 parser.add_argument('--beamType', '-b',
51 metavar='TYPE', action='store',
52 choices=beam_type_dict.keys(),
53 help='Change beam type, possible values are: %(choices)s')
54 parser.add_argument('--beamEnergy', '-e',
55 metavar='ENERGY', action='store', type=int,
56 help='Change beam energy')
57 parser.add_argument('--lumiBlock', '-l',
58 metavar='LB', action='store', type=int,
59 help='Change lumi block number')
60 parser.add_argument('--triggerType', '-t',
61 metavar='TT', action='store', type=int,
62 help='Change trigger type')
63 parser.add_argument('--detectorMask', '-m',
64 metavar='MASK', action='store', type=int,
65 help='Change detector mask')
66 parser.add_argument('--verbose', '-v',
67 action='store_true',
68 help='Increase output verbosity')
69 return parser
70
71
72def main():
73 args = get_parser().parse_args()
74 logging.basicConfig(stream=sys.stdout,
75 format='%(levelname)-8s %(message)s',
76 level=logging.DEBUG if args.verbose else logging.INFO)
77
78 if args.copyFrom:
79 logging.info('Reading events from %s and metadata from %s', args.file, args.copyFrom)
80 else:
81 logging.info('Reading events and metadata from %s', args.file)
82 meta_input = args.copyFrom if args.copyFrom else args.file
83 reader = EventStorage.pickDataReader(meta_input)
84 input_stream = eformat.istream(args.file)
85
86 # Read metadata from input file
87 metadata_basic = {} # arguments for eformat.ostream
88 metadata_extra = {} # metadata passed as dictionary
89 metadata_basic['runNumber'] = reader.runNumber()
90 metadata_basic['triggerType'] = reader.triggerType()
91 metadata_basic['detectorMask'] = reader.detectorMask()
92 metadata_basic['beamType'] = reader.beamType()
93 metadata_basic['beamEnergy'] = reader.beamEnergy()
94 metadata_extra['Stream'] = reader.stream()
95 metadata_extra['Project'] = reader.projectTag()
96 metadata_extra['LumiBlock'] = reader.lumiblockNumber()
97
98 logging.debug('Input metadata_basic = %s', metadata_basic)
99 logging.debug('Input metadata_extra = %s', metadata_extra)
100
101 # Change metadata
102 if args.runNumber:
103 metadata_basic['runNumber'] = args.runNumber
104 if args.triggerType:
105 metadata_basic['triggerType'] = args.triggerType
106 if args.detectorMask:
107 metadata_basic['detectorMask'] = args.detectorMask
108 if args.beamType:
109 metadata_basic['beamType'] = beam_type_dict[args.beamType]
110 if args.beamEnergy:
111 metadata_basic['beamEnergy'] = args.beamEnergy
112 if args.stream:
113 metadata_extra['Stream'] = args.stream
114 if args.projectTag:
115 metadata_extra['Project'] = args.projectTag
116 if args.lumiBlock:
117 metadata_extra['LumiBlock'] = args.lumiBlock
118
119 logging.debug('Updated metadata_basic = %s', metadata_basic)
120 logging.debug('Updated metadata_extra = %s', metadata_extra)
121
122 # Create new file name
123 file_name_base = args.outputName
124 if not file_name_base:
125 # Get the name elements
126 ptag = metadata_extra['Project']
127 runno = metadata_basic['runNumber']
128 stream = metadata_extra['Stream']
129 lbn = metadata_extra['LumiBlock']
130 # Build the name
131 file_name_list = []
132 file_name_list.append(ptag if ptag else 'data')
133 file_name_list.append('{:08d}'.format(runno if runno else 0))
134 file_name_list.append(stream if stream else 'unknown_stream')
135 file_name_list.append('lb{:04d}'.format(lbn if lbn else 0))
136 file_name_base = '.'.join(file_name_list)
137
138 # Write the new file
139 metadata_extra_strings = ['{:s}={:s}'.format(k, str(v)) for k, v in metadata_extra.items()]
140 output_stream = eformat.ostream(
141 core_name = file_name_base,
142 run_number = metadata_basic['runNumber'],
143 trigger_type = metadata_basic['triggerType'],
144 detector_mask = metadata_basic['detectorMask'],
145 beam_type = metadata_basic['beamType'],
146 beam_energy = metadata_basic['beamEnergy'],
147 meta_data_strings = metadata_extra_strings)
148
149 logging.info('Writing file %s', output_stream.current_filename().replace('.writing', '.data'))
150
151 ievt = 0
152 nmax = args.numEvents or -1
153 for event in input_stream:
154 ievt+=1
155 if nmax >= 0 and ievt > nmax:
156 break
157 logging.debug('Writing event %d', ievt)
158 output_stream.write(event)
159
160
161if '__main__' in __name__:
162 sys.exit(main())
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310