5Transformation script to pick events from ATLAS files (RAW/BS, ESD, AOD, DAOD, EVNT, HITS) using acmd filter-files.
11from PyJobTransforms.trfExceptions
import TransformExecutionException
17msg_log = logging.getLogger(
'EventPick_tf')
21 Subclass scriptExecutor to handle dynamic ATLAS file types in the graph.
22 Parses the event file locally and passes a formatted Python list literal to acmd.
25 supported_inputs = [
'BSFiles',
'ESDFiles',
'AODFiles',
'DAODFiles',
'EVNTFiles',
'HITSFiles']
26 supported_outputs = [f
"{t.replace('Files', '')}_PICKED" for t
in supported_inputs]
27 super().
__init__(name=name, exe=
"acmd", inData=supported_inputs, outData=supported_outputs)
38 input_key = next((k
for k
in self.conf.argdict
if k.startswith(
'input')
and k.endswith(
'Files')),
None)
39 output_key = next((k
for k
in self.conf.argdict
if k.startswith(
'output')
and k.endswith(
'File')),
None)
41 if not input_key
or not output_key:
42 raise TransformExecutionException(
"Execution failed: Missing required input files or output file specification.")
45 in_match = re.match(
r"input([A-Z_]+)Files", input_key)
46 out_match = re.match(
r"output([A-Z_]+)_PICKEDFile", output_key)
48 in_type = in_match.group(1)
if in_match
else None
49 out_type = out_match.group(1)
if out_match
else None
51 if in_type != out_type:
52 msg = f
"Data Mismatch Error: Input type '{in_type}' does not match output type '{out_type}'! Execution aborted."
54 raise TransformExecutionException(msg)
57 input_files = self.conf.argdict[input_key].value
58 output_file = self.conf.argdict[output_key].value[0]
59 event_list_file = self.conf.argdict[
'eventList'].value[0]
64 with open(event_list_file,
'r')
as f:
67 if not line
or line.startswith(
'#'):
70 if ',' in line
or ' ' in line:
72 tokens = [int(x)
for x
in re.split(
r'[,\s]+', line)
if x]
73 events.append(tuple(tokens))
75 events.append(int(line))
78 selection_expr = str(events)
79 msg_log.info(f
"Successfully parsed {len(events)} events from {event_list_file}")
80 except Exception
as e:
81 raise TransformExecutionException(f
"Failed to read/parse event list file '{event_list_file}': {str(e)}")
85 "acmd",
"filter-files",
87 "-o", str(output_file)
88 ] + [str(f)
for f
in input_files]
90 msg_log.info(f
"Graph verification passed ({in_type}Files -> {out_type}_PICKED).")
91 msg_log.info(f
"Dynamically generated command: {' '.join(self._cmd)}")
94if __name__ ==
'__main__':
96 trf = transform(executor=executor_set, description=
'Pick specific events from multiple ATLAS formats.')
99 trf.parser.add_argument(
'--inputBSFiles', nargs=
'+', type=trfArgClasses.argFactory(trfArgClasses.argBSFile, io=
'input', type=
'BS'), help=
'RAW/BS inputs')
100 trf.parser.add_argument(
'--inputAODFiles', nargs=
'+', type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'input', type=
'AOD'), help=
'AOD inputs')
101 trf.parser.add_argument(
'--inputDAODFiles', nargs=
'+', type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'input', type=
'DAOD'), help=
'DAOD inputs')
102 trf.parser.add_argument(
'--inputESDFiles', nargs=
'+', type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'input', type=
'ESD'), help=
'ESD inputs')
103 trf.parser.add_argument(
'--inputEVNTFiles', nargs=
'+', type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'input', type=
'EVNT'), help=
'EVNT inputs')
104 trf.parser.add_argument(
'--inputHITSFiles', nargs=
'+', type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'input', type=
'HITS'), help=
'HITS inputs')
106 trf.parser.add_argument(
'--outputBS_PICKEDFile', nargs=1, type=trfArgClasses.argFactory(trfArgClasses.argBSFile, io=
'output', type=
'BS_PICKED'), help=
'RAW/BS output')
107 trf.parser.add_argument(
'--outputAOD_PICKEDFile', nargs=1, type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'output', type=
'AOD_PICKED'), help=
'AOD output')
108 trf.parser.add_argument(
'--outputDAOD_PICKEDFile', nargs=1, type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'output', type=
'DAOD_PICKED'), help=
'DAOD output')
109 trf.parser.add_argument(
'--outputESD_PICKEDFile', nargs=1, type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'output', type=
'ESD_PICKED'), help=
'ESD output')
110 trf.parser.add_argument(
'--outputEVNT_PICKEDFile', nargs=1, type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'output', type=
'EVNT_PICKED'), help=
'EVNT output')
111 trf.parser.add_argument(
'--outputHITS_PICKEDFile', nargs=1, type=trfArgClasses.argFactory(trfArgClasses.argPOOLFile, io=
'output', type=
'HITS_PICKED'), help=
'HITS output')
113 trf.parser.add_argument(
'--eventList', nargs=1, type=trfArgClasses.argFactory(trfArgClasses.argFile, io=
'input'), required=
True, help=
'Event List text file')
116 trf.appendToExecutorSet(acmd_executor)
118 trf.parseCmdLineArgs(sys.argv[1:])
121 sys.exit(trf.exitCode)
preExecute(self, *args, **kwargs)
__init__(self, name="AcmdFilterFiles")