ATLAS Offline Software
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 '''
7 Write a copy of a ByteStream file with updated metadata
8 '''
9 
10 import sys
11 import argparse
12 import logging
13 import eformat
14 import libpyevent_storage as EventStorage
15 
16 
17 # This mapping was found in a comment in PyUtils.MetaReader
18 beam_type_dict = {
19  'none': 0,
20  'protons': 1,
21  'ions': 2
22 }
23 
24 
25 def get_parser():
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 
72 def 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 
161 if '__main__' in __name__:
162  sys.exit(main())
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
trigbs_updateBSMetadata.main
def main()
Definition: trigbs_updateBSMetadata.py:72
vtune_athena.format
format
Definition: vtune_athena.py:14
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
confTool.parse_args
def parse_args()
Definition: confTool.py:36
str
Definition: BTagTrackIpAccessor.cxx:11
trigbs_updateBSMetadata.get_parser
def get_parser()
Definition: trigbs_updateBSMetadata.py:25