ATLAS Offline Software
CheckSteps.py
Go to the documentation of this file.
1 #
2 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 #
4 
5 '''
6 Definitions of post-exec check steps in Trigger ART tests
7 '''
8 
9 import os
10 import re
11 import subprocess
12 import json
13 import glob
14 
15 from TrigValTools.TrigValSteering.Step import Step, get_step_from_list
16 from TrigValTools.TrigValSteering.ExecStep import ExecStep
17 from TrigValTools.TrigValSteering.Common import art_input_eos, art_input_cvmfs, running_in_CI
18 
19 class RefComparisonStep(Step):
20  '''Base class for steps comparing a file to a reference'''
21 
22  def __init__(self, name):
23  super(RefComparisonStep, self).__init__(name)
24  self.reference = None
25  self.ref_test_name = None
26  self.input_file = None
27  self.explicit_reference = False # True if reference doesn't exist at configuration time
28 
29  def configure(self, test):
30  if self.reference and self.ref_test_name:
31  self.misconfig_abort('Both options "reference" and "ref_test_name" used. Use at most one of them.')
32 
33  if not self.reference and not self.ref_test_name:
34  self.ref_test_name = test.name
35 
36  if self.reference is not None:
37  # Do nothing if the reference will be produced later
38  if self.explicit_reference:
39  return super(RefComparisonStep, self).configure(test)
40  # Do nothing if the reference exists
41  if os.path.isfile(self.reference):
42  return super(RefComparisonStep, self).configure(test)
43  # Try to find the file in DATAPATH
44  full_path = subprocess.check_output('find_data.py {}'.format(self.reference), shell=True).decode('utf-8').strip()
45  if os.path.isfile(full_path):
46  self.log.debug('%s using reference %s', self.name, full_path)
47  self.reference = full_path
48  return super(RefComparisonStep, self).configure(test)
49  else:
50  self.log.warning(
51  '%s failed to find reference %s - wrong path?',
52  self.name, self.reference)
53  return super(RefComparisonStep, self).configure(test)
54 
55  if self.input_file is None:
56  self.misconfig_abort('input_file not specified')
57 
58  branch = os.environ.get('AtlasBuildBranch') # Available after asetup
59  if branch:
60  branch = branch.split('--')[0] # experimental nightlies, e.g. main--mainGAUDI
61  if not branch:
62  branch = os.environ.get('gitlabTargetBranch') # Available in CI
63  if not branch:
64  jobName = os.environ.get('JOB_NAME') # Available in nightly build system (ATR-21836)
65  if jobName:
66  branch = jobName.split('_')[0].split('--')[0]
67  if not branch:
68  msg = 'Cannot determine the branch name, all variables are empty: AtlasBuildBranch, gitlabTargetBranch, JOB_NAME'
69  if self.required:
70  self.misconfig_abort(msg)
71  else:
72  self.log.warning(msg)
73  branch = 'UNKNOWN_BRANCH'
74 
75  sub_path = '{}/ref/{}/test_{}/'.format(
76  test.package_name, branch, self.ref_test_name)
77  ref_eos = art_input_eos + sub_path + self.input_file
78  ref_cvmfs = art_input_cvmfs + sub_path + self.input_file
79  if os.path.isfile(ref_eos) and os.access(ref_eos, os.R_OK):
80  self.log.debug('%s using reference from EOS: %s',
81  self.name, ref_eos)
82  self.reference = ref_eos
83  elif os.path.isfile(ref_cvmfs) and os.access(ref_cvmfs, os.R_OK):
84  self.log.debug('%s using reference from CVMFS: %s',
85  self.name, ref_cvmfs)
86  self.reference = ref_cvmfs
87  else:
88  self.log.warning('%s failed to find reference %s in %s or %s',
89  self.name, sub_path + self.input_file,
90  art_input_eos, art_input_cvmfs)
91  self.reference = None
92 
93  return super(RefComparisonStep, self).configure(test)
94 
95 
96 class InputDependentStep(Step):
97  '''Base class for steps executed only if the input file exists'''
98 
99  def __init__(self, name=None):
100  super(InputDependentStep, self).__init__(name)
101  self.input_file = None
102 
103  def run(self, dry_run=False):
104  if self.input_file is None:
105  self.log.error('%s misconfiguration - no input file specified',
106  self.name)
107  self.result = 1
108  if self.auto_report_result:
109  self.report_result()
110  return self.result, '# (internal) {} -> failed'.format(self.name)
111 
112  if not dry_run and not os.path.isfile(self.input_file):
113  self.log.debug('Skipping %s because %s does not exist',
114  self.name, self.input_file)
115  self.result = 0
116  return self.result, '# (internal) {} -> skipped'.format(self.name)
117 
118  return super(InputDependentStep, self).run(dry_run)
119 
120 
121 class LogMergeStep(Step):
122  '''Merge several log files into one for post-processing'''
123 
124  def __init__(self, name='LogMerge'):
125  super(LogMergeStep, self).__init__(name)
126  self.log_files = None
127  self.extra_log_regex = None
128  self.merged_name = 'athena.merged.log'
129  self.warn_if_missing = True
130 
131  def configure(self, test):
132  if self.log_files is None:
133  self.log_files = []
134  for step in test.exec_steps:
135  self.log_files.append(step.name)
136  # Protect against infinite loop
137  if self.merged_name in self.log_files:
138  self.misconfig_abort(
139  'output log name %s is same as one of the input log names.'
140  ' This will lead to infinite loop, aborting.', self.merged_name)
141  super(LogMergeStep, self).configure(test)
142 
144  if self.extra_log_regex:
145  files = os.listdir('.')
146  r = re.compile(self.extra_log_regex)
147  match_files = filter(r.match, files)
148  for f in match_files:
149  self.log_files.append(f)
150 
151  def merge_logs(self):
152  try:
153  with open(self.merged_name, 'w', encoding='utf-8') as merged_file:
154  for log_name in self.log_files:
155  if not os.path.isfile(log_name):
156  if self.warn_if_missing:
157  self.log.warning('Cannot open %s', log_name)
158  merged_file.write(
159  '### WARNING Missing {} ###\n'.format(log_name))
160  continue
161  with open(log_name, encoding='utf-8') as log_file:
162  merged_file.write('### {} ###\n'.format(log_name))
163  # temporary workaround to ignore false positives in AOD->DAOD log parsing
164  # FIXME: drop AODtoDAOD once test_trigAna_AODtoDAOD_run2_build.py is migrated to Derivation_tf
165  if log_name == 'log.Derivation' or log_name == 'log.AODtoDAOD':
166  for line in log_file:
167  merged_file.write(line.replace('Selected dynamic Aux', 'Selected Dynamic Aux'))
168  else:
169  for line in log_file:
170  merged_file.write(line)
171  return 0
172  except OSError as e:
173  self.log.error('%s merging failed due to OSError: %s',
174  self.name, e.strerror)
175  return 1
176 
177  def run(self, dry_run=False):
178  self.process_extra_regex()
179  # Sort log files by modification time
180  self.log_files.sort(key=lambda f : os.path.getmtime(f) if os.path.isfile(f) else 0)
181  self.log.info('Running %s merging logs %s into %s',
182  self.name, self.log_files, self.merged_name)
183  if dry_run:
184  self.result = 0
185  else:
186  self.result = self.merge_logs()
187  return self.result, '# (internal) {} in={} out={}'.format(self.name, self.log_files, self.merged_name)
188 
189 
190 class RootMergeStep(Step):
191  '''
192  Merge root files with hadd. Parameters are:
193  input_file - file(s) to be merged
194  merged_file - output file name
195  rename_suffix - if merged_file exists, it is renamed by adding this suffix
196  '''
197 
198  def __init__(self, name='RootMerge'):
199  super(RootMergeStep, self).__init__(name)
200  self.input_file = None
201  self.merged_file = None
202  self.rename_suffix = None
203  self.executable = 'hadd'
204 
205  def configure(self, test=None):
206  self.args += ' ' + self.merged_file + ' ' + self.input_file
207  super(RootMergeStep, self).configure(test)
208 
209  def run(self, dry_run=False):
210  file_list_to_check = self.input_file.split()
211  if os.path.isfile(self.merged_file) and self.rename_suffix:
212  old_name = os.path.splitext(self.merged_file)
213  new_name = old_name[0] + self.rename_suffix + old_name[1]
214  self.executable = 'mv {} {}; {}'.format(self.merged_file, new_name, self.executable)
215  if new_name in file_list_to_check:
216  file_list_to_check.remove(new_name)
217  file_list_to_check.append(self.merged_file)
218  self.log.debug('%s checking if the input files exist: %s', self.name, str(file_list_to_check))
219  if not dry_run:
220  for file_name in file_list_to_check:
221  if len(glob.glob(file_name)) < 1:
222  self.log.warning('%s: file %s requested to be merged but does not exist', self.name, file_name)
223  self.result = 1
224  return self.result, '# (internal) {} in={} out={} -> failed'.format(self.name, self.input_file, self.merged_file)
225  return super(RootMergeStep, self).run(dry_run)
226 
227 
228 class ZipStep(Step):
229  '''Compress a large log file'''
230 
231  def __init__(self, name='Zip'):
232  super(ZipStep, self).__init__(name)
233  self.zip_output = None
234  self.zip_input = None
235  self.executable = 'tar'
236  self.args = '-czf'
237  self.output_stream = Step.OutputStream.STDOUT_ONLY
238 
239  def configure(self, test=None):
240  self.args += ' '+self.zip_output+' '+self.zip_input
241  # Remove the file after zipping
242  self.args += ' && rm ' + self.zip_input
243  super(ZipStep, self).configure(test)
244 
245 
246 class CheckLogStep(Step):
247  '''Execute CheckLog looking for errors or warnings in a log file'''
248 
249  def __init__(self, name):
250  super(CheckLogStep, self).__init__(name)
251  self.executable = 'check_log.py'
252  self.log_file = None
253  self.check_errors = True
254  self.check_warnings = False
255  self.config_file = None
256  self.args = '--showexcludestats'
257  # The following three are updated in configure() if not set
258  self.required = None
259  self.auto_report_result = None
260  self.output_stream = None
261 
262  def configure(self, test):
263  if self.config_file is None:
264  if test.package_name == 'TrigP1Test':
265  self.config_file = 'checklogTrigP1Test.conf'
266  elif test.package_name == 'TrigValTools':
267  self.config_file = 'checklogTrigValTools.conf'
268  else:
269  self.config_file = 'checklogTriggerTest.conf'
270  if self.log_file is None:
271  if len(test.exec_steps) == 1:
272  self.log_file = test.exec_steps[0].name+'.log'
273  else:
274  self.log_file = 'athena.log'
275  if self.check_errors:
276  self.args += ' --errors'
277  if self.check_warnings:
278  self.args += ' --warnings'
279 
280  errors_only = self.check_errors and not self.check_warnings
281  if self.output_stream is None:
282  self.output_stream = Step.OutputStream.FILE_AND_STDOUT if errors_only else Step.OutputStream.FILE_ONLY
283  if self.auto_report_result is None:
284  self.auto_report_result = errors_only
285  if self.required is None:
286  self.required = errors_only
287 
288  self.args += ' --config {} {}'.format(self.config_file, self.log_file)
289 
290  super(CheckLogStep, self).configure(test)
291 
292 
294  '''Execute RegTest comparing a log file against a reference'''
295 
296  def __init__(self, name='RegTest'):
297  super(RegTestStep, self).__init__(name)
298  self.regex = 'REGTEST'
299  self.executable = 'diff'
300  self.input_base_name = 'athena'
301  self.auto_report_result = True
302  self.output_stream = Step.OutputStream.FILE_AND_STDOUT
303 
304  def configure(self, test):
305  self.input_file = self.input_base_name+'.regtest'
306  RefComparisonStep.configure(self, test)
307  self.args += ' -U 2 -b {} {}'.format(self.input_file, self.reference)
308  Step.configure(self, test)
309 
310  def prepare_inputs(self):
311  log_file = self.input_base_name+'.log'
312  if not os.path.isfile(log_file):
313  self.log.error('%s input file %s is missing', self.name, log_file)
314  return False
315  with open(log_file, encoding='utf-8') as f_in:
316  matches = re.findall('({}.*).*$'.format(self.regex),
317  f_in.read(), re.MULTILINE)
318  with open(self.input_file, 'w', encoding='utf-8') as f_out:
319  for line in matches:
320  linestr = str(line[0]) if type(line) is tuple else line
321  f_out.write(linestr+'\n')
322  return True
323 
324  def rename_ref(self):
325  try:
326  if self.reference:
327  new_name = os.path.basename(self.reference) + '.new'
328  else:
329  new_name = os.path.basename(self.input_file) + '.new'
330  os.rename(self.input_file, new_name)
331  self.log.debug('Renamed %s to %s', self.input_file, new_name)
332  except OSError:
333  self.log.warning('Failed to rename %s to %s',
334  self.input_file, new_name)
335 
336  def run(self, dry_run=False):
337  if not dry_run and not self.prepare_inputs():
338  self.log.error('%s failed in prepare_inputs()', self.name)
339  self.result = 1
340  if self.auto_report_result:
341  self.report_result()
342  return self.result, '# (internal) {} -> failed'.format(self.name)
343  if self.reference is None:
344  self.log.error('Missing reference for %s', self.name)
345  if not dry_run:
346  self.rename_ref()
347  self.result = 999
348  if self.auto_report_result:
349  self.report_result()
350  return self.result, '# (internal) {} -> failed'.format(self.name)
351  retcode, cmd = super(RegTestStep, self).run(dry_run)
352  if not dry_run:
353  self.rename_ref()
354  return retcode, cmd
355 
356 
358  '''Execute RootComp comparing histograms against a reference'''
359 
360  def __init__(self, name='RootComp'):
361  super(RootCompStep, self).__init__(name)
362  self.input_file = 'expert-monitoring.root'
363  self.executable = 'rootcomp.py'
364  self.auto_report_result = True
365 
366  def configure(self, test):
367  RefComparisonStep.configure(self, test)
368  if running_in_CI():
369  # drawing the diff output may be slow and is not needed for CI
370  self.args += ' --noRoot --noPS'
371  self.args += ' {} {}'.format(self.reference, self.input_file)
372  Step.configure(self, test)
373 
374  def run(self, dry_run=False):
375  if self.reference is None:
376  if not os.path.isfile(self.input_file):
377  self.log.debug(
378  'Skipping %s because both reference and input are missing',
379  self.name)
380  self.result = 0
381  return self.result, '# (internal) {} -> skipped'.format(self.name)
382  else: # input exists but reference not
383  self.log.error('Missing reference for %s', self.name)
384  self.result = 999
385  if self.auto_report_result:
386  self.report_result()
387  return self.result, '# (internal) {} -> failed'.format(self.name)
388  retcode, cmd = super(RootCompStep, self).run(dry_run)
389  return retcode, cmd
390 
391 
393  '''Execute the PerfMon ntuple post-processing'''
394 
395  def __init__(self, name='PerfMon'):
396  super(PerfMonStep, self).__init__(name)
397  self.input_file = None
398  self.executable = 'perfmon.py'
399  self.args = '-f 0.90'
400 
401  def configure(self, test):
402  if not self.input_file:
403  num_athenaHLT_steps = sum([1 for step in test.exec_steps if step.type == 'athenaHLT'])
404  if num_athenaHLT_steps > 0:
405  self.input_file = 'athenaHLT_workers/athenaHLT-01/ntuple.pmon.gz'
406  else:
407  self.input_file = 'ntuple.pmon.gz'
408  self.args += ' '+self.input_file
409  super(PerfMonStep, self).configure(test)
410 
411 
412 class TailStep(Step):
413  '''Copy the last N lines of a log file into a separate file'''
414 
415  def __init__(self, name='Tail'):
416  super(TailStep, self).__init__(name)
417  self.log_file = 'athena.log'
418  self.output_name = None
419  self.executable = 'tail'
420  self.num_lines = 5000
421  self.output_stream = Step.OutputStream.STDOUT_ONLY
422 
423  def configure(self, test):
424  if self.output_name is None:
425  split = os.path.splitext(self.log_file)
426  self.output_name = split[0]+'.tail'
427  if len(split) > 1:
428  self.output_name += split[1]
429  self.args += ' -n {:d}'.format(self.num_lines)
430  self.args += ' '+self.log_file
431  self.args += ' >'+self.output_name
432  super(TailStep, self).configure(test)
433 
434 
435 class DownloadRefStep(Step):
436  '''Execute art.py download to get results from previous days'''
437 
438  def __init__(self, name='DownloadRef'):
439  super(DownloadRefStep, self).__init__(name)
440  self.executable = 'art.py'
441  self.args = 'download'
442  self.artpackage = None
443  self.artjobname = None
444  self.timeout = 20*60
445  self.required = True
446  self.auto_report_result = True
447 
448  def configure(self, test):
449  if not self.artpackage:
450  self.artpackage = test.package_name
451  if not self.artjobname:
452  self.artjobname = 'test_'+test.name+'.py'
453  self.args += ' '+self.artpackage+' '+self.artjobname
454  super(DownloadRefStep, self).configure(test)
455 
456 
458  '''Execute histSizes.py to count histograms in a ROOT file'''
459 
460  def __init__(self, name='HistCount'):
461  super(HistCountStep, self).__init__(name)
462  self.input_file = 'expert-monitoring.root'
463  self.executable = 'histSizes.py'
464  self.args = '-t'
465 
466  def configure(self, test):
467  self.args += ' '+self.input_file
468  super(HistCountStep, self).configure(test)
469 
470 
472  '''
473  Execute chainDump.py to print trigger counts from histograms to text files
474  '''
475 
476  def __init__(self, name='ChainDump'):
477  super(ChainDumpStep, self).__init__(name)
478  self.input_file = 'expert-monitoring.root'
479  self.executable = 'chainDump.py'
480  self.args = '--json --yaml'
481 
482  def configure(self, test):
483  self.args += ' -f '+self.input_file
484  super(ChainDumpStep, self).configure(test)
485 
486 
488  '''
489  Execute chainComp.py to compare counts from chainDump.py to a reference
490  '''
491 
492  def __init__(self, name='ChainComp'):
493  super(ChainCompStep, self).__init__(name)
494  self.input_file = 'chainDump.yml'
496  self.executable = 'chainComp.py'
497  self.args = ''
498  self.auto_report_result = True
499  self.output_stream = Step.OutputStream.FILE_AND_STDOUT
500  self.depends_on_exec = True # skip if ExecSteps failed
501 
502  def configure(self, test):
503  if not self.reference_from_release:
504  RefComparisonStep.configure(self, test)
505  if self.reference:
506  self.args += ' -r ' + self.reference
507  # else chainComp.py finds the reference in DATAPATH on its own
508  self.args += ' ' + self.input_file
509  Step.configure(self, test)
510 
511 
512 class TrigTestJsonStep(Step):
513  '''Execute trig-test-json.py to create extra-results.json file'''
514 
515  def __init__(self, name='TrigTestJson'):
516  super(TrigTestJsonStep, self).__init__(name)
517  self.executable = 'trig-test-json.py'
518 
519 
521  '''
522  Execute checkFile and checkxAOD for POOL files.
523  executable and input_file can have multiple comma-separated values
524  '''
525 
526  def __init__(self, name='CheckFile'):
527  super(CheckFileStep, self).__init__(name)
528  self.input_file = 'AOD.pool.root,ESD.pool.root,RDO_TRIG.pool.root'
529  self.executable = 'checkFile.py,checkxAOD.py'
530  self.__executables__ = None
531  self.__input_files__ = None
532 
533  def configure(self, test):
534  # Skip the check if all test steps are athenaHLT (no POOL files)
535  test_types = [step.type for step in test.exec_steps]
536  num_athenaHLT = sum(1 for tt in test_types if tt == 'athenaHLT')
537  if num_athenaHLT == test_types:
538  self.log.debug('%s will be skipped because all exec steps use athenaHLT')
539  self.__executables__ = None
540  self.__input_files__ = None
541  return
542  self.__executables__ = self.executable.split(',')
543  self.__input_files__ = self.input_file.split(',')
544  super(CheckFileStep, self).configure(test)
545 
546  def run(self, dry_run=False):
547  ret_codes = []
548  commands = []
549  for f in self.__input_files__:
550  for ex in self.__executables__:
551  self.executable = ex
552  self.input_file = f
553  self.args = f
554  ex_base = ex.split('.')[0:-1]
555  self.log_file_name = f + '.' + ''.join(ex_base)
556  ret, cmd = super(CheckFileStep, self).run(dry_run)
557  ret_codes.append(ret)
558  commands.append(cmd)
559 
560  # Merge executed commands for logging
561  merged_cmd = ''
562  if len(commands) == 1:
563  merged_cmd = commands[0]
564  else:
565  for cmd in commands:
566  if '(internal)' not in cmd:
567  merged_cmd += cmd+'; '
568  if len(merged_cmd) == 0:
569  merged_cmd = commands[-1]
570 
571  return max(ret_codes), merged_cmd
572 
573 
574 class ZeroCountsStep(Step):
575  '''
576  Check if all counts are zero.
577  input_file can have multiple comma-separated values
578  '''
579 
580  def __init__(self, name='ZeroCounts'):
581  super(ZeroCountsStep, self).__init__(name)
582  self.input_file = 'HLTChain.txt,HLTTE.txt,L1AV.txt'
583  self.auto_report_result = True
584  self.required = True
585  self.__input_files__ = None
586 
587  def configure(self, test=None):
588  self.__input_files__ = self.input_file.split(',')
589 
590  def check_zero_counts(self, input_file):
591  if not os.path.isfile(input_file):
592  self.log.debug(
593  'Skipping %s for %s because the file does not exist',
594  self.name, input_file)
595  return -1
596  lines_checked = 0
597  with open(input_file, encoding='utf-8') as f_in:
598  for line in f_in.readlines():
599  split_line = line.split()
600  lines_checked += 1
601  if int(split_line[-1]) != 0:
602  return 0 # at least one non-zero count
603  if lines_checked == 0:
604  self.log.error('Failed to read counts from %s', input_file)
605  return 1 # all counts are zero
606 
607  def run(self, dry_run=False):
608  results = []
609  for input_file in self.__input_files__:
610  results.append(self.check_zero_counts(input_file))
611 
612  self.result = max(results)
613  cmd = '# (internal) {} for {}'.format(self.name, self.__input_files__)
614  if self.result < 0:
615  cmd = '# (internal) {} -> skipped'.format(self.name)
616  self.result = 0
617  return self.result, cmd
618  self.log.info('Running %s step', self.name)
619  if self.auto_report_result:
620  self.report_result()
621  return self.result, cmd
622 
623 
624 class MessageCountStep(Step):
625  '''Count messages printed inside event loop'''
626 
627  def __init__(self, name='MessageCount'):
628  super(MessageCountStep, self).__init__(name)
629  self.executable = 'messageCounter.py'
630  self.log_regex = r'(athena\.(?!.*tail).*log$|athenaHLT:.*\.out$|^log\.(.*to.*|Derivation))'
631  self.skip_logs = []
632  self.start_pattern = r'(HltEventLoopMgr|AthenaHiveEventLoopMgr).*INFO Starting loop on events'
633  self.end_pattern = r'(HltEventLoopMgr.*INFO All events processed|AthenaHiveEventLoopMgr.*INFO.*Loop Finished)'
634  self.print_on_fail = None
635  self.thresholds = {}
636  self.auto_report_result = True
637  self.depends_on_exec = True # skip if ExecSteps failed
638 
639  def configure(self, test):
640  self.args += ' -s "{:s}"'.format(self.start_pattern)
641  self.args += ' -e "{:s}"'.format(self.end_pattern)
642  if self.print_on_fail is None:
643  self.print_on_fail = self.required
644  if self.print_on_fail:
645  self.args += ' --saveAll'
646 
647  max_events = test.exec_steps[0].max_events if isinstance(test.exec_steps[0], ExecStep) else 0
648  if 'WARNING' not in self.thresholds:
649  self.thresholds['WARNING'] = 0
650  if 'INFO' not in self.thresholds:
651  self.thresholds['INFO'] = max_events
652  if 'DEBUG' not in self.thresholds:
653  self.thresholds['DEBUG'] = 0
654  if 'VERBOSE' not in self.thresholds:
655  self.thresholds['VERBOSE'] = 0
656  if 'other' not in self.thresholds:
657  self.thresholds['other'] = max_events
658  super(MessageCountStep, self).configure(test)
659 
660  def run(self, dry_run=False):
661  files = os.listdir('.')
662  r = re.compile(self.log_regex)
663  log_files = [f for f in filter(r.match, files) if f not in self.skip_logs]
664  if not log_files and not dry_run:
665  self.log.error('%s found no log files matching the pattern %s', self.name, self.log_regex)
666  self.result = 1
667  if self.auto_report_result:
668  self.report_result()
669  return self.result, '# (internal) {} -> failed'.format(self.name)
670  self.args += ' ' + ' '.join(log_files)
671  auto_report = self.auto_report_result
672  self.auto_report_result = False
673  ret, cmd = super(MessageCountStep, self).run(dry_run)
674  self.auto_report_result = auto_report
675  if ret != 0:
676  self.log.error('%s failed', self.name)
677  self.result = 1
678  if self.auto_report_result:
679  self.report_result()
680  return self.result, cmd
681 
682  for log_file in log_files:
683  json_file = 'MessageCount.{:s}.json'.format(log_file)
684  if self.print_on_fail:
685  all_json_file = 'Messages.{:s}.json'.format(log_file)
686  if not os.path.isfile(json_file):
687  self.log.warning('%s cannot open file %s', self.name, json_file)
688  with open(json_file) as f:
689  summary = json.load(f)
690  for level, threshold in self.thresholds.items():
691  if summary[level] > threshold:
692  self.result += 1
693  self.log.info(
694  '%s Number of %s messages %s in %s is higher than threshold %s',
695  self.name, level, summary[level], log_file, threshold)
696  if self.print_on_fail:
697  self.log.info('%s Printing all %s messages from %s', self.name, level, log_file)
698  with open(all_json_file) as af:
699  all_msg = json.load(af)
700  for msg in all_msg[level]:
701  print(msg.strip()) # noqa: ATL901
702 
703  if self.auto_report_result:
704  self.report_result()
705  return self.result, cmd
706 
707 
708 def produces_log(step):
709  '''
710  Helper function checking whether a Step output_stream value
711  indicates that it will produce a log file
712  '''
713  return step.output_stream == Step.OutputStream.FILE_ONLY or \
714  step.output_stream == Step.OutputStream.FILE_AND_STDOUT
715 
716 
718  '''
719  Create the default list of check steps for a test. The configuration
720  depends on the package name and the type of exec steps (athena or
721  athenaHLT or transforms).
722  '''
723 
724  check_steps = []
725 
726  # Log merging
727  if len(test.exec_steps) == 1:
728  exec_step = test.exec_steps[0]
729  if exec_step.type == 'athenaHLT' and produces_log(exec_step):
730  logmerge = LogMergeStep()
731  logmerge.merged_name = 'athena.log'
732  logmerge.log_files = ['athenaHLT.log']
733  nforks = 1 if exec_step.forks is None else exec_step.forks
734  for n in range(1, 1+nforks):
735  logmerge.log_files.append('athenaHLT:{:02d}.out'.format(n))
736  logmerge.log_files.append('athenaHLT:{:02d}.err'.format(n))
737  check_steps.append(logmerge)
738  else:
739  logmerge = LogMergeStep()
740  logmerge.merged_name = 'athena.log'
741  logmerge.log_files = []
742  for exec_step in test.exec_steps:
743  if not produces_log(exec_step):
744  continue
745  logmerge.log_files.append(exec_step.get_log_file_name())
746  if exec_step.type == 'athenaHLT':
747  logmerge.extra_log_regex = 'athenaHLT:.*(.out|.err)'
748  check_steps.append(logmerge)
749  log_to_check = None
750  log_to_zip = None
751  if len(check_steps) > 0 and isinstance(check_steps[-1], LogMergeStep):
752  log_to_check = check_steps[-1].merged_name
753  log_to_zip = check_steps[-1].merged_name
754 
755  # Reco_tf log merging
756  reco_tf_steps = [step for step in test.exec_steps if step.type in ['Reco_tf', 'Trig_reco_tf', 'Derivation_tf']]
757  if len(reco_tf_steps) > 0:
758  reco_tf_logmerge = LogMergeStep('LogMerge_Reco_tf')
759  reco_tf_logmerge.warn_if_missing = False
760  # FIXME: drop AODtoDAOD once test_trigAna_AODtoDAOD_run2_build.py is migrated to Derivation_tf
761  tf_names = ['HITtoRDO', 'Overlay', 'RDOtoRDOTrigger', 'RAWtoESD', 'ESDtoAOD',
762  'PhysicsValidation', 'RAWtoALL',
763  'BSRDOtoRAW', 'DRAWCOSTtoNTUPCOST', 'AODtoNTUPRATE', 'Derivation', 'AODtoDAOD']
764  reco_tf_logmerge.log_files = ['log.'+tf_name for tf_name in tf_names]
765  if not get_step_from_list('LogMerge', check_steps):
766  for step in reco_tf_steps:
767  reco_tf_logmerge.log_files.append(step.get_log_file_name())
768  reco_tf_logmerge.merged_name = 'athena.merged.log'
769  log_to_zip = reco_tf_logmerge.merged_name
770  if log_to_check is not None:
771  reco_tf_logmerge.log_files.append(log_to_check)
772  log_to_check = reco_tf_logmerge.merged_name
773  log_to_check = reco_tf_logmerge.merged_name
774  check_steps.append(reco_tf_logmerge)
775 
776  # Histogram merging for athenaHLT forks
777  num_athenaHLT_steps = sum([1 for step in test.exec_steps if step.type == 'athenaHLT'])
778  if num_athenaHLT_steps > 0:
779  histmerge = RootMergeStep('HistMerge')
780  histmerge.merged_file = 'expert-monitoring.root'
781  histmerge.input_file = 'athenaHLT_workers/*/expert-monitoring.root expert-monitoring-mother.root'
782  histmerge.rename_suffix = '-mother'
783  check_steps.append(histmerge)
784 
785  # CheckLog for errors
786  checklog = CheckLogStep('CheckLog')
787  if log_to_check is not None:
788  checklog.log_file = log_to_check
789  check_steps.append(checklog)
790 
791  # CheckLog for warnings
792  checkwarn = CheckLogStep('Warnings')
793  checkwarn.check_errors = False
794  checkwarn.check_warnings = True
795  if log_to_check is not None:
796  checkwarn.log_file = log_to_check
797  check_steps.append(checkwarn)
798 
799  # MessageCount
800  msgcount = MessageCountStep('MessageCount')
801  for logmerge in [step for step in check_steps if isinstance(step, LogMergeStep)]:
802  msgcount.skip_logs.append(logmerge.merged_name)
803  check_steps.append(msgcount)
804 
805  # Tail (probably not so useful these days)
806  tail = TailStep()
807  if log_to_check is not None:
808  tail.log_file = log_to_check
809  check_steps.append(tail)
810 
811  # Histogram-based steps
812  check_steps.append(RootCompStep())
813  check_steps.append(ChainDumpStep())
814  check_steps.append(HistCountStep())
815 
816  # ZeroCounts
817  check_steps.append(ZeroCountsStep())
818 
819  # Extra JSON
820  check_steps.append(TrigTestJsonStep())
821 
822  # CheckFile
823  check_steps.append(CheckFileStep())
824 
825  # Zip the merged log (can be large and duplicates information)
826  if log_to_zip is not None:
827  zip_step = ZipStep()
828  zip_step.zip_input = log_to_zip
829  zip_step.zip_output = log_to_zip+'.tar.gz'
830  check_steps.append(zip_step)
831 
832  # return the steps
833  return check_steps
834 
835 
836 def add_step_after_type(step_list, ref_type, step_to_add):
837  '''
838  Insert step_to_add into step_list after the last step of type ref_type.
839  If the list has no steps of type ref_type, append step_to_add at the end of the list.
840  '''
841  index_to_add = -1
842  for index, step in enumerate(step_list):
843  if isinstance(step, ref_type):
844  index_to_add = index+1
845  if index_to_add > 0:
846  step_list.insert(index_to_add, step_to_add)
847  else:
848  step_list.append(step_to_add)
grepfile.info
info
Definition: grepfile.py:38
python.TrigValSteering.CheckSteps.CheckLogStep.configure
def configure(self, test)
Definition: CheckSteps.py:262
python.TrigValSteering.CheckSteps.CheckLogStep.auto_report_result
auto_report_result
Definition: CheckSteps.py:259
python.TrigValSteering.CheckSteps.CheckLogStep
Definition: CheckSteps.py:246
python.TrigValSteering.CheckSteps.add_step_after_type
def add_step_after_type(step_list, ref_type, step_to_add)
Definition: CheckSteps.py:836
python.TrigValSteering.CheckSteps.RefComparisonStep
Definition: CheckSteps.py:19
python.TrigValSteering.CheckSteps.HistCountStep.args
args
Definition: CheckSteps.py:464
AtlasMcWeight::decode
double decode(number_type binnedWeight)
Convert weight from unsigned to double.
Definition: AtlasMcWeight.cxx:32
python.TrigValSteering.CheckSteps.InputDependentStep.result
result
Definition: CheckSteps.py:107
python.TrigValSteering.CheckSteps.ZipStep
Definition: CheckSteps.py:228
python.TrigValSteering.CheckSteps.default_check_steps
def default_check_steps(test)
Definition: CheckSteps.py:717
python.TrigValSteering.CheckSteps.MessageCountStep.configure
def configure(self, test)
Definition: CheckSteps.py:639
python.TrigValSteering.CheckSteps.PerfMonStep.args
args
Definition: CheckSteps.py:399
python.TrigValSteering.CheckSteps.InputDependentStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:103
python.TrigValSteering.CheckSteps.RegTestStep
Definition: CheckSteps.py:293
python.TrigValSteering.CheckSteps.RegTestStep.prepare_inputs
def prepare_inputs(self)
Definition: CheckSteps.py:310
python.TrigValSteering.CheckSteps.MessageCountStep.log_regex
log_regex
Definition: CheckSteps.py:630
python.TrigValSteering.CheckSteps.LogMergeStep.extra_log_regex
extra_log_regex
Definition: CheckSteps.py:127
python.TrigValSteering.CheckSteps.MessageCountStep.end_pattern
end_pattern
Definition: CheckSteps.py:633
python.TrigValSteering.CheckSteps.TailStep.num_lines
num_lines
Definition: CheckSteps.py:420
python.TrigValSteering.CheckSteps.ZipStep.configure
def configure(self, test=None)
Definition: CheckSteps.py:239
max
#define max(a, b)
Definition: cfImp.cxx:41
python.TrigValSteering.CheckSteps.LogMergeStep.result
result
Definition: CheckSteps.py:184
python.TrigValSteering.CheckSteps.TrigTestJsonStep
Definition: CheckSteps.py:512
vtune_athena.format
format
Definition: vtune_athena.py:14
python.TrigValSteering.CheckSteps.MessageCountStep.start_pattern
start_pattern
Definition: CheckSteps.py:632
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
python.TrigValSteering.CheckSteps.LogMergeStep.log_files
log_files
Definition: CheckSteps.py:126
python.TrigValSteering.CheckSteps.HistCountStep.__init__
def __init__(self, name='HistCount')
Definition: CheckSteps.py:460
python.TrigValSteering.CheckSteps.DownloadRefStep.artjobname
artjobname
Definition: CheckSteps.py:443
python.TrigValSteering.CheckSteps.TailStep.__init__
def __init__(self, name='Tail')
Definition: CheckSteps.py:415
python.TrigValSteering.CheckSteps.RegTestStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:336
python.TrigValSteering.CheckSteps.RegTestStep.auto_report_result
auto_report_result
Definition: CheckSteps.py:301
python.TrigValSteering.CheckSteps.LogMergeStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:177
python.TrigValSteering.CheckSteps.RootMergeStep.configure
def configure(self, test=None)
Definition: CheckSteps.py:205
python.TrigValSteering.CheckSteps.ZeroCountsStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:607
python.TrigValSteering.CheckSteps.ChainCompStep.auto_report_result
auto_report_result
Definition: CheckSteps.py:498
python.TrigValSteering.CheckSteps.CheckLogStep.executable
executable
Definition: CheckSteps.py:251
python.TrigValSteering.CheckSteps.MessageCountStep.auto_report_result
auto_report_result
Definition: CheckSteps.py:636
python.TrigValSteering.CheckSteps.ChainDumpStep
Definition: CheckSteps.py:471
python.TrigValSteering.CheckSteps.MessageCountStep
Definition: CheckSteps.py:624
python.TrigValSteering.CheckSteps.LogMergeStep.__init__
def __init__(self, name='LogMerge')
Definition: CheckSteps.py:124
python.TrigValSteering.CheckSteps.ChainDumpStep.executable
executable
Definition: CheckSteps.py:479
python.TrigValSteering.CheckSteps.RootMergeStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:209
python.TrigValSteering.CheckSteps.CheckLogStep.args
args
Definition: CheckSteps.py:256
python.TrigValSteering.CheckSteps.MessageCountStep.skip_logs
skip_logs
Definition: CheckSteps.py:631
python.TrigValSteering.CheckSteps.TailStep.log_file
log_file
Definition: CheckSteps.py:417
python.TrigValSteering.CheckSteps.ChainCompStep.configure
def configure(self, test)
Definition: CheckSteps.py:502
python.TrigValSteering.CheckSteps.CheckFileStep.__init__
def __init__(self, name='CheckFile')
Definition: CheckSteps.py:526
python.TrigValSteering.CheckSteps.RootCompStep.configure
def configure(self, test)
Definition: CheckSteps.py:366
python.TrigValSteering.CheckSteps.LogMergeStep.merge_logs
def merge_logs(self)
Definition: CheckSteps.py:151
python.TrigValSteering.CheckSteps.DownloadRefStep.args
args
Definition: CheckSteps.py:441
python.TrigValSteering.CheckSteps.LogMergeStep.configure
def configure(self, test)
Definition: CheckSteps.py:131
python.TrigValSteering.CheckSteps.InputDependentStep
Definition: CheckSteps.py:96
python.TrigValSteering.Step.get_step_from_list
def get_step_from_list(step_name, step_list)
Definition: Step.py:230
python.TrigValSteering.CheckSteps.DownloadRefStep.configure
def configure(self, test)
Definition: CheckSteps.py:448
python.TrigValSteering.CheckSteps.RootCompStep.auto_report_result
auto_report_result
Definition: CheckSteps.py:364
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
python.TrigValSteering.CheckSteps.RegTestStep.__init__
def __init__(self, name='RegTest')
Definition: CheckSteps.py:296
python.TrigValSteering.CheckSteps.ChainCompStep.__init__
def __init__(self, name='ChainComp')
Definition: CheckSteps.py:492
python.TrigValSteering.Common.running_in_CI
def running_in_CI()
Definition: Common.py:78
python.TrigValSteering.CheckSteps.RootMergeStep.result
result
Definition: CheckSteps.py:223
python.TrigValSteering.CheckSteps.HistCountStep.executable
executable
Definition: CheckSteps.py:463
python.TrigValSteering.CheckSteps.ChainDumpStep.configure
def configure(self, test)
Definition: CheckSteps.py:482
python.TrigValSteering.CheckSteps.MessageCountStep.thresholds
thresholds
Definition: CheckSteps.py:635
python.TrigValSteering.CheckSteps.DownloadRefStep.artpackage
artpackage
Definition: CheckSteps.py:442
covarianceTool.filter
filter
Definition: covarianceTool.py:514
python.TrigValSteering.CheckSteps.DownloadRefStep.required
required
Definition: CheckSteps.py:445
python.TrigValSteering.CheckSteps.RootCompStep.executable
executable
Definition: CheckSteps.py:363
python.TrigValSteering.CheckSteps.RefComparisonStep.ref_test_name
ref_test_name
Definition: CheckSteps.py:25
python.TrigValSteering.CheckSteps.MessageCountStep.executable
executable
Definition: CheckSteps.py:629
python.TrigValSteering.CheckSteps.ZipStep.__init__
def __init__(self, name='Zip')
Definition: CheckSteps.py:231
python.TrigValSteering.CheckSteps.CheckFileStep.configure
def configure(self, test)
Definition: CheckSteps.py:533
python.TrigValSteering.CheckSteps.MessageCountStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:660
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
python.TrigValSteering.CheckSteps.LogMergeStep.merged_name
merged_name
Definition: CheckSteps.py:128
python.TrigValSteering.CheckSteps.RootCompStep.result
result
Definition: CheckSteps.py:380
python.TrigValSteering.CheckSteps.ChainCompStep.executable
executable
Definition: CheckSteps.py:496
python.TrigValSteering.CheckSteps.RegTestStep.regex
regex
Definition: CheckSteps.py:298
python.TrigValSteering.CheckSteps.produces_log
def produces_log(step)
Definition: CheckSteps.py:708
python.TrigValSteering.CheckSteps.HistCountStep.configure
def configure(self, test)
Definition: CheckSteps.py:466
python.TrigValSteering.CheckSteps.PerfMonStep.executable
executable
Definition: CheckSteps.py:398
python.TrigValSteering.CheckSteps.InputDependentStep.input_file
input_file
Definition: CheckSteps.py:101
python.TrigValSteering.CheckSteps.ZeroCountsStep
Definition: CheckSteps.py:574
python.TrigValSteering.CheckSteps.ChainDumpStep.__init__
def __init__(self, name='ChainDump')
Definition: CheckSteps.py:476
python.TrigValSteering.CheckSteps.MessageCountStep.depends_on_exec
depends_on_exec
Definition: CheckSteps.py:637
python.TrigValSteering.CheckSteps.PerfMonStep.__init__
def __init__(self, name='PerfMon')
Definition: CheckSteps.py:395
python.TrigValSteering.CheckSteps.DownloadRefStep.auto_report_result
auto_report_result
Definition: CheckSteps.py:446
python.TrigValSteering.CheckSteps.RegTestStep.executable
executable
Definition: CheckSteps.py:299
python.TrigValSteering.CheckSteps.CheckFileStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:546
python.TrigValSteering.CheckSteps.TailStep.executable
executable
Definition: CheckSteps.py:419
python.TrigValSteering.CheckSteps.PerfMonStep
Definition: CheckSteps.py:392
python.TrigValSteering.CheckSteps.ChainCompStep
Definition: CheckSteps.py:487
python.TrigValSteering.CheckSteps.CheckLogStep.check_errors
check_errors
Definition: CheckSteps.py:253
python.TrigValSteering.CheckSteps.PerfMonStep.configure
def configure(self, test)
Definition: CheckSteps.py:401
python.TrigValSteering.CheckSteps.ZipStep.output_stream
output_stream
Definition: CheckSteps.py:237
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.TrigValSteering.CheckSteps.TailStep.configure
def configure(self, test)
Definition: CheckSteps.py:423
run
Definition: run.py:1
python.TrigValSteering.CheckSteps.RefComparisonStep.input_file
input_file
Definition: CheckSteps.py:26
python.TrigValSteering.CheckSteps.RegTestStep.rename_ref
def rename_ref(self)
Definition: CheckSteps.py:324
python.TrigValSteering.CheckSteps.TailStep.output_name
output_name
Definition: CheckSteps.py:418
python.TrigValSteering.CheckSteps.RootCompStep.run
def run(self, dry_run=False)
Definition: CheckSteps.py:374
python.TrigValSteering.CheckSteps.ZipStep.executable
executable
Definition: CheckSteps.py:235
python.TrigValSteering.CheckSteps.MessageCountStep.__init__
def __init__(self, name='MessageCount')
Definition: CheckSteps.py:627
python.TrigValSteering.CheckSteps.RefComparisonStep.__init__
def __init__(self, name)
Definition: CheckSteps.py:22
python.TrigValSteering.CheckSteps.DownloadRefStep.__init__
def __init__(self, name='DownloadRef')
Definition: CheckSteps.py:438
python.TrigValSteering.CheckSteps.RootCompStep
Definition: CheckSteps.py:357
python.TrigValSteering.CheckSteps.TailStep.output_stream
output_stream
Definition: CheckSteps.py:421
python.TrigValSteering.CheckSteps.RootMergeStep.rename_suffix
rename_suffix
Definition: CheckSteps.py:202
python.TrigValSteering.CheckSteps.RegTestStep.result
result
Definition: CheckSteps.py:339
python.TrigValSteering.CheckSteps.InputDependentStep.__init__
def __init__(self, name=None)
Definition: CheckSteps.py:99
python.TrigValSteering.CheckSteps.LogMergeStep.process_extra_regex
def process_extra_regex(self)
Definition: CheckSteps.py:143
python.TrigValSteering.CheckSteps.CheckFileStep.log_file_name
log_file_name
Definition: CheckSteps.py:555
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
python.TrigValSteering.CheckSteps.RootMergeStep.merged_file
merged_file
Definition: CheckSteps.py:201
python.TrigValSteering.CheckSteps.TrigTestJsonStep.executable
executable
Definition: CheckSteps.py:517
python.TrigValSteering.CheckSteps.DownloadRefStep.executable
executable
Definition: CheckSteps.py:440
python.TrigValSteering.CheckSteps.CheckFileStep.__input_files__
__input_files__
Definition: CheckSteps.py:531
python.TrigValSteering.CheckSteps.ChainCompStep.output_stream
output_stream
Definition: CheckSteps.py:499
python.TrigValSteering.CheckSteps.ZipStep.zip_input
zip_input
Definition: CheckSteps.py:234
python.TrigValSteering.CheckSteps.RootMergeStep.__init__
def __init__(self, name='RootMerge')
Definition: CheckSteps.py:198
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:79
python.TrigValSteering.CheckSteps.CheckLogStep.output_stream
output_stream
Definition: CheckSteps.py:260
python.TrigValSteering.CheckSteps.RootMergeStep.executable
executable
Definition: CheckSteps.py:203
python.TrigValSteering.CheckSteps.CheckLogStep.check_warnings
check_warnings
Definition: CheckSteps.py:254
python.TrigValSteering.CheckSteps.RegTestStep.output_stream
output_stream
Definition: CheckSteps.py:302
python.TrigValSteering.CheckSteps.CheckLogStep.required
required
Definition: CheckSteps.py:258
python.TrigValSteering.CheckSteps.RegTestStep.configure
def configure(self, test)
Definition: CheckSteps.py:304
python.TrigValSteering.CheckSteps.ZeroCountsStep.configure
def configure(self, test=None)
Definition: CheckSteps.py:587
python.TrigValSteering.CheckSteps.ChainCompStep.args
args
Definition: CheckSteps.py:497
Trk::open
@ open
Definition: BinningType.h:40
python.TrigValSteering.CheckSteps.ZipStep.zip_output
zip_output
Definition: CheckSteps.py:233
python.TrigValSteering.CheckSteps.MessageCountStep.print_on_fail
print_on_fail
Definition: CheckSteps.py:634
python.TrigValSteering.CheckSteps.ZeroCountsStep.auto_report_result
auto_report_result
Definition: CheckSteps.py:583
python.TrigValSteering.CheckSteps.DownloadRefStep.timeout
timeout
Definition: CheckSteps.py:444
python.TrigValSteering.CheckSteps.TrigTestJsonStep.__init__
def __init__(self, name='TrigTestJson')
Definition: CheckSteps.py:515
python.TrigValSteering.CheckSteps.TailStep
Definition: CheckSteps.py:412
python.TrigValSteering.CheckSteps.ZipStep.args
args
Definition: CheckSteps.py:236
python.TrigValSteering.CheckSteps.CheckFileStep.args
args
Definition: CheckSteps.py:553
python.TrigValSteering.CheckSteps.HistCountStep
Definition: CheckSteps.py:457
python.TrigValSteering.CheckSteps.ChainCompStep.reference_from_release
reference_from_release
Definition: CheckSteps.py:495
python.TrigValSteering.CheckSteps.CheckFileStep.executable
executable
Definition: CheckSteps.py:529
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
python.TrigValSteering.CheckSteps.RootMergeStep
Definition: CheckSteps.py:190
python.TrigValSteering.CheckSteps.CheckLogStep.log_file
log_file
Definition: CheckSteps.py:252
python.TrigValSteering.CheckSteps.RootMergeStep.input_file
input_file
Definition: CheckSteps.py:200
python.TrigValSteering.CheckSteps.DownloadRefStep
Definition: CheckSteps.py:435
python.TrigValSteering.CheckSteps.MessageCountStep.result
result
Definition: CheckSteps.py:666
python.TrigValSteering.CheckSteps.ZeroCountsStep.required
required
Definition: CheckSteps.py:584
python.TrigValSteering.CheckSteps.CheckLogStep.__init__
def __init__(self, name)
Definition: CheckSteps.py:249
str
Definition: BTagTrackIpAccessor.cxx:11
python.TrigValSteering.CheckSteps.ZeroCountsStep.input_file
input_file
Definition: CheckSteps.py:582
python.TrigValSteering.CheckSteps.RegTestStep.input_base_name
input_base_name
Definition: CheckSteps.py:300
dbg::print
void print(std::FILE *stream, std::format_string< Args... > fmt, Args &&... args)
Definition: SGImplSvc.cxx:70
python.TrigValSteering.CheckSteps.LogMergeStep
Definition: CheckSteps.py:121
python.TrigValSteering.CheckSteps.ChainDumpStep.args
args
Definition: CheckSteps.py:480
python.TrigValSteering.CheckSteps.ChainCompStep.depends_on_exec
depends_on_exec
Definition: CheckSteps.py:500
python.TrigValSteering.CheckSteps.RefComparisonStep.reference
reference
Definition: CheckSteps.py:24
python.TrigValSteering.CheckSteps.CheckFileStep.__executables__
__executables__
Definition: CheckSteps.py:530
python.TrigValSteering.CheckSteps.LogMergeStep.warn_if_missing
warn_if_missing
Definition: CheckSteps.py:129
python.TrigValSteering.CheckSteps.ZeroCountsStep.__init__
def __init__(self, name='ZeroCounts')
Definition: CheckSteps.py:580
python.TrigValSteering.CheckSteps.ZeroCountsStep.__input_files__
__input_files__
Definition: CheckSteps.py:585
python.TrigValSteering.CheckSteps.RefComparisonStep.configure
def configure(self, test)
Definition: CheckSteps.py:29
error
Definition: IImpactPoint3dEstimator.h:70
python.TrigValSteering.CheckSteps.ZeroCountsStep.check_zero_counts
def check_zero_counts(self, input_file)
Definition: CheckSteps.py:590
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.TrigValSteering.CheckSteps.CheckFileStep
Definition: CheckSteps.py:520
python.TrigValSteering.CheckSteps.ZeroCountsStep.result
result
Definition: CheckSteps.py:612
python.TrigValSteering.CheckSteps.RefComparisonStep.explicit_reference
explicit_reference
Definition: CheckSteps.py:27
python.TrigValSteering.CheckSteps.RootCompStep.__init__
def __init__(self, name='RootComp')
Definition: CheckSteps.py:360
python.TrigValSteering.CheckSteps.CheckLogStep.config_file
config_file
Definition: CheckSteps.py:255