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

◆ collect_and_compare_files()

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.

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 

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

◆ compare()

def compareDQMOutput.compare (   base_dir,
  pr_dir,
  output_dir,
  files,
  pr_number,
  test_number,
  release_format 
)

Definition at line 25 of file compareDQMOutput.py.

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 

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

◆ generate_summary_html()

def compareDQMOutput.generate_summary_html (   output_dir,
  pr_list,
  summary_dir 
)

Definition at line 91 of file compareDQMOutput.py.

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;referencenorm=False;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 

References str.

◆ get_file_pairs()

def compareDQMOutput.get_file_pairs (   base_dir,
  pr_dir 
)

Definition at line 51 of file compareDQMOutput.py.

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 

References genParticles_cff.map.

Referenced by collect_and_compare_files().

◆ upload()

def compareDQMOutput.upload (   files)

Definition at line 76 of file compareDQMOutput.py.

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 

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

◆ upload_to_gui()

def compareDQMOutput.upload_to_gui (   output_dir,
  num_procs 
)

Definition at line 63 of file compareDQMOutput.py.

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 

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

Variable Documentation

◆ args

compareDQMOutput.args

Definition at line 150 of file compareDQMOutput.py.

◆ COMPARISON_RESULTS

compareDQMOutput.COMPARISON_RESULTS

Definition at line 10 of file compareDQMOutput.py.

◆ default

compareDQMOutput.default

Definition at line 141 of file compareDQMOutput.py.

◆ description

compareDQMOutput.description

Definition at line 138 of file compareDQMOutput.py.

◆ help

compareDQMOutput.help

Definition at line 141 of file compareDQMOutput.py.

◆ parser

compareDQMOutput.parser

Definition at line 138 of file compareDQMOutput.py.

◆ pr_number

compareDQMOutput.pr_number

Definition at line 153 of file compareDQMOutput.py.

◆ required

compareDQMOutput.required

Definition at line 145 of file compareDQMOutput.py.

◆ type

compareDQMOutput.type

Definition at line 144 of file compareDQMOutput.py.

FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
compareDQMOutput.upload_to_gui
def upload_to_gui(output_dir, num_procs)
Definition: compareDQMOutput.py:63
min
T min(T a, T b)
Definition: MathUtil.h:58
join
static std::string join(char **cmd)
Definition: RemoteFile.cc:17
cms::dd::split
std::vector< std::string_view > split(std::string_view, const char *)
compareDQMOutput.upload
def upload(files)
Definition: compareDQMOutput.py:76
compareDQMOutput.collect_and_compare_files
def collect_and_compare_files(base_dir, pr_dir, output_dir, num_procs, pr_number, test_number, release_format)
Definition: compareDQMOutput.py:12
str
#define str(s)
Definition: TestProcessor.cc:48
createfilelist.int
int
Definition: createfilelist.py:10
edm::print
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
compareDQMOutput.generate_summary_html
def generate_summary_html(output_dir, pr_list, summary_dir)
Definition: compareDQMOutput.py:91
genParticles_cff.map
map
Definition: genParticles_cff.py:11
compare
bool compare(const P &i, const P &j)
Definition: BDHadronTrackMonitoringAnalyzer.cc:203
compareDQMOutput.get_file_pairs
def get_file_pairs(base_dir, pr_dir)
Definition: compareDQMOutput.py:51