7 Write a copy of a ByteStream file with updated metadata
14 import libpyevent_storage
as EventStorage
26 parser = argparse.ArgumentParser(usage=
'%(prog)s [options] FILE',
28 formatter_class=
lambda prog: argparse.HelpFormatter(prog, max_help_position=36, width=100))
29 parser.add_argument(
'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',
68 help=
'Increase output verbosity')
74 logging.basicConfig(stream=sys.stdout,
75 format=
'%(levelname)-8s %(message)s',
76 level=logging.DEBUG
if args.verbose
else logging.INFO)
79 logging.info(
'Reading events from %s and metadata from %s', args.file, args.copyFrom)
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)
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()
98 logging.debug(
'Input metadata_basic = %s', metadata_basic)
99 logging.debug(
'Input metadata_extra = %s', metadata_extra)
103 metadata_basic[
'runNumber'] = args.runNumber
105 metadata_basic[
'triggerType'] = args.triggerType
106 if args.detectorMask:
107 metadata_basic[
'detectorMask'] = args.detectorMask
109 metadata_basic[
'beamType'] = beam_type_dict[args.beamType]
111 metadata_basic[
'beamEnergy'] = args.beamEnergy
113 metadata_extra[
'Stream'] = args.stream
115 metadata_extra[
'Project'] = args.projectTag
117 metadata_extra[
'LumiBlock'] = args.lumiBlock
119 logging.debug(
'Updated metadata_basic = %s', metadata_basic)
120 logging.debug(
'Updated metadata_extra = %s', metadata_extra)
123 file_name_base = args.outputName
124 if not file_name_base:
126 ptag = metadata_extra[
'Project']
127 runno = metadata_basic[
'runNumber']
128 stream = metadata_extra[
'Stream']
129 lbn = metadata_extra[
'LumiBlock']
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)
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)
149 logging.info(
'Writing file %s', output_stream.current_filename().
replace(
'.writing',
'.data'))
152 nmax = args.numEvents
or -1
153 for event
in input_stream:
155 if nmax >= 0
and ievt > nmax:
157 logging.debug(
'Writing event %d', ievt)
158 output_stream.write(event)
161 if '__main__' in __name__: