CMS 3D CMS Logo

Functions | Variables
compareDQMOutput Namespace Reference

Functions

def collect_and_compare_files (base_dir, pr_dir, output_dir, num_procs, pr_number, test_number, release_format)
 
def compare (base_dir, pr_dir, output_dir, files, pr_number, test_number, release_format)
 
def generate_summary_html (output_dir, pr_list, summary_dir)
 
def get_file_pairs (base_dir, pr_dir)
 
def upload (files)
 
def upload_to_gui (output_dir, num_procs)
 

Variables

 args
 
 COMPARISON_RESULTS
 
 default
 
 description
 
 help
 
 parser
 
 pr_number
 
 required
 
 type
 

Function Documentation

def compareDQMOutput.collect_and_compare_files (   base_dir,
  pr_dir,
  output_dir,
  num_procs,
  pr_number,
  test_number,
  release_format 
)

Definition at line 12 of file compareDQMOutput.py.

References dqmMemoryStats.float, get_file_pairs(), and FastTimerService_cff.range.

12 def collect_and_compare_files(base_dir, pr_dir, output_dir, num_procs, pr_number, test_number, release_format):
13  files = get_file_pairs(base_dir, pr_dir)
14 
15  threads = []
16  for _ in range(num_procs):
17  thread = Thread(target=compare, args=(base_dir, pr_dir, output_dir, files, pr_number, test_number, release_format))
18  thread.start()
19  threads.append(thread)
20 
21  [thread.join() for thread in threads]
22 
23  COMPARISON_RESULTS.sort(key=lambda k: float(k['workflow']))
24 
def collect_and_compare_files(base_dir, pr_dir, output_dir, num_procs, pr_number, test_number, release_format)
def get_file_pairs(base_dir, pr_dir)
def compareDQMOutput.compare (   base_dir,
  pr_dir,
  output_dir,
  files,
  pr_number,
  test_number,
  release_format 
)

Definition at line 25 of file compareDQMOutput.py.

References createfilelist.int, join(), edm.print(), and cms::dd.split().

25 def compare(base_dir, pr_dir, output_dir, files, pr_number, test_number, release_format):
26  while files:
27  try:
28  file_name = files.pop()
29  command = ['compareHistograms.py', '-b', os.path.join(base_dir, file_name), \
30  '-p', os.path.join(pr_dir, file_name), '-o', output_dir, '-n', pr_number, '-t', test_number, '-r', release_format]
31  print('Running comparison:')
32  print(' '.join(command))
33 
34  output = subprocess.check_output(command)
35 
36  output_elements = output.split('\n')[1:]
37  base_output_filename = output_elements[0]
38  pr_output_filename = output_elements[1]
39  run_nr = base_output_filename.split('_')[2].lstrip('R').lstrip('0')
40  output_numbers = output_elements[2].split(' ')
41 
42  workflow = os.path.basename(os.path.dirname(os.path.join(base_dir, file_name))).split('_')[0]
43  base_dataset = '/' + '/'.join(base_output_filename.rstrip('.root').split('__')[1:])
44  pr_dataset = '/' + '/'.join(pr_output_filename.rstrip('.root').split('__')[1:])
45 
46  COMPARISON_RESULTS.append({'workflow': workflow, 'base_dataset': base_dataset, 'pr_dataset': pr_dataset, 'run_nr': run_nr,\
47  'changed_elements': int(output_numbers[0]), 'removed_elements': int(output_numbers[1]), 'added_elements': int(output_numbers[2])})
48  except Exception as ex:
49  print('Exception comparing two root files: %s' % ex)
50 
std::vector< std::string_view > split(std::string_view, const char *)
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
def compare(base_dir, pr_dir, output_dir, files, pr_number, test_number, release_format)
static std::string join(char **cmd)
Definition: RemoteFile.cc:17
def compareDQMOutput.generate_summary_html (   output_dir,
  pr_list,
  summary_dir 
)

Definition at line 91 of file compareDQMOutput.py.

References str.

91 def generate_summary_html(output_dir, pr_list, summary_dir):
92  template_file_path = os.path.join(os.getenv('CMSSW_BASE'), 'src', 'DQMServices', 'FileIO', 'scripts', 'dqm-histo-comparison-summary-template.html')
93  if not os.path.isfile(template_file_path):
94  template_file_path = os.path.join(os.getenv('CMSSW_RELEASE_BASE'), 'src', 'DQMServices', 'FileIO', 'scripts', 'dqm-histo-comparison-summary-template.html')
95  template_file = open(template_file_path, 'r')
96  result = template_file.read()
97 
98  result = result.replace('$PR_LIST$', pr_list)
99 
100  table_items = ''
101  total_changes = 0
102 
103  for comp in COMPARISON_RESULTS:
104  total_changes += comp['removed_elements'] + comp['added_elements'] + comp['changed_elements']
105  baseline_count = comp['changed_elements'] + comp['removed_elements']
106  pr_count = comp['changed_elements'] + comp['added_elements']
107  overlay_count = baseline_count
108 
109  # Make urls
110  base_url = 'https://cmsweb.cern.ch/dqm/dev/start?runnr=%s;dataset%%3D%s;sampletype%%3Doffline_relval;workspace%%3DEverything;' % (comp['run_nr'], comp['base_dataset'])
111  pr_url = 'https://cmsweb.cern.ch/dqm/dev/start?runnr=%s;dataset%%3D%s;sampletype%%3Doffline_relval;workspace%%3DEverything;' % (comp['run_nr'], comp['pr_dataset'])
112  overlay_url = 'https://cmsweb.cern.ch/dqm/dev/start?runnr=%s;dataset%%3D%s;referenceshow%%3Dall;referenceobj1%%3Dother::%s::;sampletype%%3Doffline_relval;workspace%%3DEverything;' \
113  % (comp['run_nr'], comp['pr_dataset'], comp['base_dataset'])
114 
115  table_items += ' <tr>\n'
116  table_items += ' <td><a href="%s" target="_blank">%s baseline GUI</a><span> (%s)</span></td>\n' % (base_url, comp['workflow'], baseline_count)
117  table_items += ' <td><a href="%s" target="_blank">%s pr GUI</a><span> (%s)</span></td>\n' % (pr_url, comp['workflow'], pr_count)
118  table_items += ' <td><a href="%s" target="_blank">%s overlay GUI</a><span> (%s)</span></td>\n' % (overlay_url, comp['workflow'], overlay_count)
119  table_items += ' <td><span class="removed">-%s</span><span class="added">+%s</span><span class="changed">%s</span></td>\n' \
120  % (comp['removed_elements'], comp['added_elements'], comp['changed_elements'])
121  table_items += ' </tr>\n'
122 
123  result = result.replace('$TOTAL_CHANGES$', str(total_changes))
124  result = result.replace('$NUMBER_OF_WORKFLOWS$', str(len(COMPARISON_RESULTS)))
125  result = result.replace('$PER_WORKFLOW_LIST$', table_items)
126  template_file.close()
127 
128  # Write output
129  result_file_path = os.path.join(summary_dir, 'dqm-histo-comparison-summary.html')
130  if os.path.dirname(result_file_path):
131  if not os.path.exists(os.path.dirname(result_file_path)):
132  os.makedirs(os.path.dirname(result_file_path))
133  summary_file = open(result_file_path, 'w')
134  summary_file.write(result)
135  summary_file.close()
136 
def generate_summary_html(output_dir, pr_list, summary_dir)
#define str(s)
def compareDQMOutput.get_file_pairs (   base_dir,
  pr_dir 
)

Definition at line 51 of file compareDQMOutput.py.

References genParticles_cff.map.

Referenced by collect_and_compare_files().

51 def get_file_pairs(base_dir, pr_dir):
52  base_files = glob.glob(os.path.join(base_dir, '*.*_*/DQM_*.root'))
53  pr_files = glob.glob(os.path.join(pr_dir, '*.*_*/DQM_*.root'))
54 
55  # Remove base directories and leave
56  # only parts of paths that are same
57  base_files = map(lambda x: os.path.relpath(x, base_dir), base_files)
58  pr_files = map(lambda x: os.path.relpath(x, pr_dir), pr_files)
59 
60  # Find intersection
61  return [value for value in base_files if value in pr_files]
62 
def get_file_pairs(base_dir, pr_dir)
def compareDQMOutput.upload (   files)

Definition at line 76 of file compareDQMOutput.py.

References join(), and edm.print().

76 def upload(files):
77  while files:
78  try:
79  file = files.pop()
80  command = ['visDQMUpload.py', 'https://cmsweb.cern.ch/dqm/dev', file]
81  print('Uploading output:')
82  print(' '.join(command))
83 
84  subprocess.call(command)
85  print('')
86  except Exception as ex:
87  # This might throw when another thread pops the last filename immediately after this one
88  # started the loop. In this case this exception can be safely ignored.
89  print('Exception uploading a file: %s' % ex)
90 
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
static std::string join(char **cmd)
Definition: RemoteFile.cc:17
def compareDQMOutput.upload_to_gui (   output_dir,
  num_procs 
)

Definition at line 63 of file compareDQMOutput.py.

References min(), edm.print(), and FastTimerService_cff.range.

63 def upload_to_gui(output_dir, num_procs):
64  base_files = glob.glob(os.path.join(output_dir, 'base/*.root'))
65  pr_files = glob.glob(os.path.join(output_dir, 'pr/*.root'))
66 
67  files = base_files + pr_files
68 
69  print('Files to be uploaded:')
70  print(files)
71 
72  for _ in range(min(num_procs, len(files))):
73  thread = Thread(target=upload, args=(files,))
74  thread.start()
75 
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
def upload_to_gui(output_dir, num_procs)
T min(T a, T b)
Definition: MathUtil.h:58

Variable Documentation

compareDQMOutput.args

Definition at line 150 of file compareDQMOutput.py.

compareDQMOutput.COMPARISON_RESULTS

Definition at line 10 of file compareDQMOutput.py.

compareDQMOutput.default

Definition at line 141 of file compareDQMOutput.py.

compareDQMOutput.description

Definition at line 138 of file compareDQMOutput.py.

compareDQMOutput.help

Definition at line 141 of file compareDQMOutput.py.

compareDQMOutput.parser

Definition at line 138 of file compareDQMOutput.py.

compareDQMOutput.pr_number

Definition at line 153 of file compareDQMOutput.py.

compareDQMOutput.required

Definition at line 145 of file compareDQMOutput.py.

compareDQMOutput.type

Definition at line 144 of file compareDQMOutput.py.