CMS 3D CMS Logo

compare_using_files.py
Go to the documentation of this file.
1 #! /usr/bin/env python3
2 
10 
11 
12 from __future__ import print_function
13 def getInfoFromFilename(filename):
14  prefix,sample,cmssw_release,tier = filename[:-5].split("__")[:5]
15  run=int(prefix.split("_")[-1][1:])
16  return run,sample,cmssw_release,tier
17 
18 from sys import argv,exit
19 import os
20 
21 # Default Configuration Parameters ---------------------------------------------
22 
23 stat_test="Chi2"
24 test_threshold=1e-5
25 
26 
27 #run="1"
28 
29 dir_name=""
30 outdir_name=""
31 
32 compare=False
33 report=False
34 
35 do_pngs=False
36 
37 black_list_str=""
38 
39 #-------------------------------------------------------------------------------
40 
41 from optparse import OptionParser
42 
43 parser = OptionParser(usage="usage: %prog file1 file2 [options]")
44 
45 
46 #parser.add_option("-r","--run ",
47  #action="store",
48  #dest="run",
49  #default=run,
50  #help="The run to be checked \n(default is %s)" %run)
51 
52 parser.add_option("-d","--dir_name",
53  action="store",
54  dest="dir_name",
55  default=dir_name,
56  help="The 'directory' to be checked in the DQM \n(default is %s)" %dir_name)
57 
58 parser.add_option("-o","--outdir_name",
59  action="store",
60  dest="outdir_name",
61  default=outdir_name,
62  help="The directory where the output will be stored \n(default is %s)" %outdir_name)
63 
64 parser.add_option("-p","--do_pngs",
65  action="store_true",
66  dest="do_pngs",
67  default=False,
68  help="Do the pngs of the comparison (takes 50%% of the total running time) \n(default is %s)" %False)
69 
70 parser.add_option("--no_successes",
71  action="store_true",
72  dest="no_successes",
73  default=False,
74  help="Do not draw successes. Default is False.")
75 
76 parser.add_option("-P","--pickle",
77  action="store",
78  dest="pklfile",
79  default="",
80  help="Pkl file of the dir structure ")
81 
82 parser.add_option("--sample",
83  action="store",
84  dest="sample",
85  default="Sample",
86  help="The name of the sample to be displayed")
87 
88 parser.add_option("--metas",
89  action="store",
90  dest="metas",
91  default="",
92  help="The Metas describing the two files (separated by @@@)")
93 
94 parser.add_option("-t","--test_threshold",
95  action="store",
96  dest="test_threshold",
97  default=test_threshold,
98  help="Threshold for the statistical test \n(default is %s)" %test_threshold)
99 
100 parser.add_option("-s","--stat_test",
101  action="store",
102  dest="stat_test",
103  default=stat_test,
104  help="Statistical test (KS or Chi2) \n(default is %s)" %stat_test)
105 
106 parser.add_option("-C","--compare",
107  action="store_true",
108  dest="compare",
109  default=compare,
110  help="Make the comparison \n(default is %s)" %compare)
111 
112 parser.add_option("-R","--Report",
113  action="store_true",
114  dest="report",
115  default=report,
116  help="Make the html report \n(default is %s)" %report)
117 
118 parser.add_option("--specify_run",
119  action="store_true",
120  dest="specify_run",
121  default=False,
122  help="Append the run number to the output dir for data")
123 
124 
125 parser.add_option("-B","--black_list",
126  action="store",
127  dest="black_list",
128  default=black_list_str,
129  help="Blacklist elements. form is name@hierarchy_level (i.e. HLT@1) \n(default is %s)" %black_list_str)
130 
131 
132 parser.add_option("--hash_name",
133  action="store_true",
134  dest="hash_name",
135  default=False,
136  help="Set if you want to minimize & hash the output HTML files.")
137 
138 parser.add_option("--use_black_file",
139  action="store_true",
140  dest="blacklist_file",
141  default=False,
142  help="Use a black list file of histograms located @ /RelMon/data")
143 
144 parser.add_option("--standalone",
145  action="store_true",
146  dest="standalone",
147  default=False,
148  help="Makes CSS files accessible over HTTP")
149 
151 
152  if "RELMON_SA" in os.environ:
153  black_list_file="../data/blacklist.txt"
154  else:
155  black_list_file="%s/src/Utilities/RelMon/data/blacklist.txt"%(os.environ["CMSSW_BASE"])
156  bListFile = open(black_list_file,'r') black_listed_histograms = bListFile.read()
157  bListFile.close()
158 
159  histogramArray = black_listed_histograms.split("\n")
160  histogramArray.remove("") #remove the last element which is empty line
161  newarray = []
162  for elem in histogramArray:
163  tmp = elem.split("/") #screw windows as it is being run on lxbuild machines with Linux
164  tmp.insert(1,"Run summary") #insert "Run summary" dir in path as in ROOT files they exists but user haven't defined them
165  newarray.append(("/").join(tmp))
166  return newarray
167 
168 
169 (options, args) = parser.parse_args()
170 
171 if len(args)!=2 and options.compare:
172  print("Wrong number of RootFiles specified (%s)" %len(args))
173  print(args)
174 
175 #-------------------------------------------------------------------------------
176 original_pickle_name=""
177 if options.compare:
178 
179  if "RELMON_SA" in os.environ:
180  import definitions
181  from dqm_interfaces import DirID,DirWalkerFile,string2blacklist
182  from dirstructure import Directory
183  else:
184  import Utilities.RelMon.definitions as definitions
185  from Utilities.RelMon.dqm_interfaces import DirID,DirWalkerFile,string2blacklist
186  from Utilities.RelMon.dirstructure import Directory
187 
188  import pickle
189  from os import mkdir,chdir,getcwd
190  from os.path import exists
191 
192  #-------------------------------------------------------------------------------
193  # Guess Releases and sample from filename
194  rootfilename1,rootfilename2 = args
196  run1=-1
197  sample1=''
198  cmssw_release1=''
199  tier1=''
200  run2=-1
201  sample2=''
202  cmssw_release2=''
203  tier2=''
205  if options.metas=='':
206  run1,sample1,cmssw_release1,tier1= getInfoFromFilename(rootfilename1)
207  run2,sample2,cmssw_release2,tier2= getInfoFromFilename(rootfilename2)
208  else:
209  print("Reading meta from commandline")
210  sample1=sample2=options.sample
211  cmssw_release1,cmssw_release2=options.metas.split('@@@')
212  options.standalone = True
213 
214  # check if the sample is the same
215  if sample1!=sample2:
216  print("I am puzzled. Did you choose two different samples?")
217  #exit(1)
218  sample = sample1
220  # check if the run is the same
221  if run1!=run2:
222  print("I am puzzled. Did you choose two different runs?")
223 # exit(1)
224  run=run1
226  fulldirname=options.outdir_name
227  if len(fulldirname)==0:
228  fulldirname=options.dir_name
229  if len(fulldirname)==0:
230  fulldirname="%s_%s_%s" %(sample1,cmssw_release1,cmssw_release2)
231 
232 
233  black_list=string2blacklist(options.black_list)
234 
235  if options.blacklist_file:
236  black_listed = blackListedHistos()
237  else:
238  black_listed = []
239 
240 #-------------------------------------------------------------------------------
241 
242  print("Analysing Histograms located in directory %s at: " %options.dir_name)
243  for filename in rootfilename1,rootfilename2:
244  print(" o %s" %filename)
245 
246 
247  if len(black_list)>0:
248  print("We have a Blacklist:")
249  for dirid in black_list:
250  print(" o %s" %dirid)
251 
252  # Set up the fake directory structure
253  directory=Directory(options.dir_name)
254  dirwalker=DirWalkerFile(fulldirname,
255  options.dir_name,
256  rootfilename1,rootfilename2,
257  run,
258  black_list,
259  options.stat_test,
260  options.test_threshold,
261  not options.no_successes,
262  options.do_pngs,
263  set(black_listed)
264  )
265 
266  # Start the walker
267  outdir_name=options.outdir_name
268  if run>1 and options.specify_run:
269  outdir_name+="_%s" %run
270  fulldirname+="_%s" %run
271  print("+"*30)
272  print("Output Directory will be ", outdir_name)
273  options.outdir_name=outdir_name
274  if not exists(outdir_name) and len(outdir_name )>0:
275  mkdir(outdir_name)
276  if len(outdir_name)>0:
277  chdir(outdir_name)
278  dirwalker.walk()
279 
280  run = dirwalker.run
281 
282 
283  # Fetch the directory from the walker
284  directory=dirwalker.directory
285 
286  # Set some meta for the page generation
287  directory.meta.sample1=sample1
288  directory.meta.sample2=sample2
289  directory.meta.run1=run1
290  directory.meta.run2=run2
291  directory.meta.release1=cmssw_release1
292  directory.meta.release2=cmssw_release2
293  directory.meta.tier1=tier1
294  directory.meta.tier2=tier2
295 
296  # Print a summary Report on screen
297  directory.print_report(verbose=True)
299  # Remove this DQM FW reminescence.
300  directory.prune("Run summary")
301 
302  # Dump the directory structure on disk in a pickle
303  original_pickle_name="%s.pkl" %fulldirname
304  print("Pickleing the directory as %s in dir %s" %(original_pickle_name,getcwd()))
305  output = open(original_pickle_name,"wb")
306  pickle.dump(directory, output, -1)# use highest protocol available for the pickle
307  output.close()
308 
309 #-------------------------------------------------------------------------------
310 if options.report:
311 
312  if "RELMON_SA" in os.environ:
313  from directories2html import directory2html
314  from dirstructure import Directory
315  else:
316  from Utilities.RelMon.directories2html import directory2html
317  from Utilities.RelMon.dirstructure import Directory
318 
319  from os.path import exists
320  from os import chdir,mkdir
321  import os
322  import pickle
323 
324  pickle_name=options.pklfile
325  if len(options.pklfile)==0:
326  pickle_name=original_pickle_name
327 
328  print("Reading directory from %s" %(pickle_name))
329  ifile=open(pickle_name,"rb")
330  directory=pickle.load(ifile)
331  ifile.close()
332 
333  if not options.compare:
334  if not os.path.exists(options.outdir_name):
335  mkdir(options.outdir_name)
336 
337  if exists(options.outdir_name) and len(directory.name)==0:
338  chdir(options.outdir_name)
339 
340  # Calculate the results of the tests for each directory
341  print("Calculating stats for the directory...")
342  directory.calcStats()
343 
344  print("Producing html...")
345  directory2html(directory, options.hash_name, options.standalone)
346 
347 if not (options.report or options.compare):
348  print("Neither comparison nor report to be executed. A typo?")
349 
350 
351 
def getInfoFromFilename(filename)
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def directory2html(directory, hashing, standalone, depth=0)
static std::string join(char **cmd)
Definition: RemoteFile.cc:19
def mkdir(path)
Definition: eostools.py:251
def string2blacklist(black_list_str)