12 from optparse
import OptionParser
18 from subprocess
import call,PIPE
19 from multiprocessing
import Pool
25 if os.environ.has_key(
"RELMON_SA"):
26 import definitions
as definitions
27 from dqm_interfaces
import DirWalkerFile,string2blacklist,DirWalkerFile_thread_wrapper
28 from dirstructure
import Directory
29 from directories2html
import directory2html,make_summary_table
30 from utils
import ask_ok, unpickler, make_files_pairs
33 from Utilities.RelMon.dqm_interfaces
import DirWalkerFile,string2blacklist,DirWalkerFile_thread_wrapper
34 from Utilities.RelMon.dirstructure
import Directory
35 from Utilities.RelMon.directories2html
import directory2html,make_summary_table
36 from Utilities.RelMon.utils
import ask_ok, unpickler, make_files_pairs
42 namebase=os.path.basename(filename)
43 return namebase.split(
"__")[1]
46 namebase=os.path.basename(filename)
47 return namebase.split(
"__")[2]
50 namebase=os.path.basename(filename)
51 return namebase.split(
"__")[0].
split(
"_")[2]
58 skim = skim[:skim.rfind(
'-v')]
59 return "%s_%s"%(run,skim)
62 namebase = os.path.basename(filename)
63 return namebase.split(
"__")[2].
split(
"-")[1]
69 if len(ref_filenames)*len(test_filenames)==0:
70 print "Empty reference and test filenames lists!"
77 for ref, test
in zip(
map(os.path.basename,ref_filenames),
map(os.path.basename,test_filenames)):
84 print " ## sample 1: %s vs sample 2: %s"%(ref_sample, test_sample)
86 if ref_sample!=test_sample:
87 print "Files %s and %s do not seem to be relative to the same sample." %(ref, test)
91 if search(
"20[01]",ref_version)!=
None:
92 ref_sample+=ref_version.split(
"_")[-1]
93 samples.append(ref_sample)
96 ref_versions.append(ref_version)
97 test_versions.append(test_version)
100 ref_versions=
list(set(ref_versions))
101 test_versions=
list(set(test_versions))
108 cmssw_version1=ref_versions[0]
109 cmssw_version2=test_versions[0]
111 return samples,cmssw_version1,cmssw_version2
117 for name
in names_list:
118 if not name.endswith(
".root"):
119 print "File %s does not seem to be a rootfile. Please check."
127 int_pattern=pattern.strip()
129 if int_pattern[0]==
'!':
130 int_pattern=int_pattern[1:]
133 condition =
search(int_pattern,target)!=
None
135 condition =
not condition
141 blacklist+=blist_piece
149 """Build a blacklist for each sample accordind to a set of rules
152 for sample
in samples:
153 blacklists[sample]=
"FED@1,AlcaBeamMonitor@1,HLT@1,AlCaReco@1"
157 blacklists[sample]+=
",AlCaEcalPi0@2"
158 if not search(
"2010+|2011+|2012+|2015+",ver1):
159 print "We are treating MC files for the HLT"
160 for pattern,blist
in definitions.hlt_mc_pattern_blist_pairs:
161 blacklists[sample]=
add_to_blacklist(blacklists[sample],pattern,sample,blist)
163 print "We are treating Data files for the HLT"
168 if not search(
"2010+|2011+|2012+",ver1):
169 print "We are treating MC files"
171 for pattern,blist
in definitions.mc_pattern_blist_pairs:
172 blacklists[sample]=
add_to_blacklist(blacklists[sample],pattern,sample,blist)
178 print "We are treating Data files:"
179 blacklists[sample]+=
",By__Lumi__Section@-1,AlCaReco@1"
180 for pattern,blist
in definitions.data_pattern_blist_pairs:
191 files_list =
filter(
lambda s: s.endswith(
".root"), os.listdir(directory))
192 files_list_path=
map(
lambda s: os.path.join(directory,s), files_list)
194 return files_list_path
203 if len(files_list)==0:
204 print "Zero files found in directory %s!" %all_samples
208 for name
in files_list:
210 if len(files_list)%2!=0:
211 print "The numbuer of file is not even... Trying to recover a catastrophe."
221 for iname
in xrange(len(files_list)):
222 filename=files_list[iname]
224 ref_filenames.append(filename)
226 test_filenames.append(filename)
228 print "The guess would be the following:"
229 for ref,test
in zip(ref_filenames,test_filenames):
230 refbasedir=os.path.dirname(ref)
231 testbasedir=os.path.dirname(test)
232 dir_to_print=refbasedir
233 if refbasedir!=testbasedir:
234 dir_to_print=
"%s and %s" %(refbasedir,testbasedir)
235 print "* Directory: %s " %dir_to_print
236 refname=os.path.basename(ref)
237 testname=os.path.basename(test)
238 print " o %s" %refname
239 print " o %s" %testname
247 return ref_filenames,test_filenames
254 ref_filenames=
map(
lambda s:s.strip(),ref_samples.split(
","))
255 test_filenames=
map(
lambda s:s.strip(),test_samples.split(
","))
257 if len(ref_filenames)!=len(test_filenames):
258 print "The numebr of reference and test files does not seem to be the same. Please check."
263 return ref_filenames,test_filenames
268 return len(
filter(
lambda p: p.returncode==
None,p_list))
273 """Creates shell command to compare two files using compare_using_files.py
274 script and calls it."""
275 sample, ref_filename, test_filename, options = args
278 command =
" compare_using_files.py "
279 command+=
"%s %s " %(ref_filename,test_filename)
283 command+=
" -o %s_%s " %(sample, gt)
285 command+=
" --specify_run "
286 if options.stat_test
in [
"Bin2Bin",
"BinToBin"]:
287 options.test_threshold = 0.9999
288 command+=
" -t %s " %options.test_threshold
289 command+=
" -s %s " %options.stat_test
295 if options.hash_name:
296 command +=
" --hash_name "
298 if options.blacklist_file:
299 command +=
" --use_black_file "
301 if options.standalone:
302 command +=
" --standalone "
303 if len(blacklists[sample]) >0:
304 command+=
'-B %s ' %blacklists[sample]
305 print "\nExecuting -- %s" %command
307 process=call(
filter(
lambda x: len(x)>0,command.split(
" ")))
315 n_processes= int(options.n_processes)
320 if len(options.all_samples)>0:
326 ref_filenames=
map(os.path.abspath,ref_filenames)
327 test_filenames=
map(os.path.abspath,test_filenames)
329 samples,cmssw_version1,cmssw_version2=
guess_params(ref_filenames,test_filenames)
332 print "No Samples found... Quitting"
338 original_dir=os.getcwd()
340 outdir=options.out_dir
342 print "Creating automatic outdir:",
343 outdir=
"%sVS%s" %(cmssw_version1,cmssw_version2)
345 if len(options.input_dir)==0:
346 print "Creating automatic indir:",
347 options.input_dir=outdir
348 print options.input_dir
350 if not os.path.exists(outdir):
355 n_comparisons=len(ref_filenames)
356 if n_comparisons < n_processes:
357 print "Less comparisons than possible processes: reducing n processes to",
358 n_processes=n_comparisons
375 if search(
"20[01]",cmssw_version1)!=
None:
376 skim_name=cmssw_version1.split(
"_")[-1]
378 running_subprocesses=[]
383 pool = Pool(n_processes)
384 args_iterable = [
list(args) + [options]
for args
in zip(samples, ref_filenames, test_filenames)]
385 pool.map(call_compare_using_files, args_iterable)
387 os.system(
"mv */*pkl .")
394 pkl_list=
filter(
lambda x:
".pkl" in x, os.listdir(
"./"))
395 running_subprocesses=[]
396 n_processes=int(options.n_processes)
398 for pklfilename
in pkl_list:
399 command =
"compare_using_files.py "
403 command+=
"-P %s " %pklfilename
404 command+=
"-o %s " %pklfilename[:-4]
405 print "Executing %s" %command
406 process=call(
filter(
lambda x: len(x)>0,command.split(
" ")))
409 running_subprocesses.append(process)
410 if process_counter>=n_processes:
412 for p
in running_subprocesses:
419 def do_html(options, hashing_flag, standalone):
422 print "Preparing reports for the single files..."
426 aggregation_rules_twiki={}
429 print "Aggregating directories according to HLT rules"
430 aggregation_rules=definitions.aggr_pairs_dict[
'HLT']
431 aggregation_rules_twiki=definitions.aggr_pairs_twiki_dict[
'HLT']
433 aggregation_rules=definitions.aggr_pairs_dict[
'reco']
434 aggregation_rules_twiki=definitions.aggr_pairs_twiki_dict[
'reco']
435 table_html =
make_summary_table(options.input_dir,aggregation_rules,aggregation_rules_twiki, hashing_flag, standalone)
438 ofile = open(
"RelMonSummary.html",
"w")
439 ofile.write(table_html)
444 if __name__ ==
"__main__":
456 test_threshold=0.00001
461 parser = OptionParser(usage=
"usage: %prog [options]")
463 parser.add_option(
"-R",
"--ref_samples ",
467 help=
"The samples that act as reference (comma separated list)")
469 parser.add_option(
"-T",
"--test_samples",
472 default=test_samples,
473 help=
"The samples to be tested (comma separated list)")
475 parser.add_option(
"-a",
"--all_samples",
479 help=
"EXPERIMENTAL: Try to sort all samples selected (wildacrds) and organise a comparison")
481 parser.add_option(
"-o",
"--out_dir",
485 help=
"The outdir other than <Version1>VS<Version2>")
487 parser.add_option(
"-p",
"--do_pngs",
491 help=
"EXPERIMENTAL!!! Do the pngs of the comparison (takes 50%% of the total running time) \n(default is %s)" %
False)
493 parser.add_option(
"-r",
"--run ",
497 help=
"The run to be checked \n(default is %s)" %run)
499 parser.add_option(
"-t",
"--test_threshold",
501 dest=
"test_threshold",
502 default=test_threshold,
503 help=
"Threshold for the statistical test \n(default is %s)" %test_threshold)
505 parser.add_option(
"-s",
"--stat_test",
509 help=
"Statistical test (KS or Chi2) \n(default is %s)" %stat_test)
511 parser.add_option(
"-N",
"--numberOfProcesses",
515 help=
"Number of parallel processes to be run. Be Polite! \n(default is %s)" %n_processes)
517 parser.add_option(
"--HLT",
521 help=
"Analyse HLT histograms\n(default is %s)" %hlt)
523 parser.add_option(
"-i",
"--input_dir",
527 help=
"Input directory for html creation \n(default is %s)" %in_dir)
529 parser.add_option(
"--reports",
533 help=
"Do the reports for the pickles \n(default is %s)" %in_dir)
535 parser.add_option(
"--hash_name",
539 help=
"Set if you want to minimize & hash the output HTML files.")
541 parser.add_option(
"--use_black_file",
543 dest=
"blacklist_file",
545 help=
"Use a black list file of histograms located @ /RelMon/data")
547 parser.add_option(
"--standalone",
551 help=
"Define that using RelMon in standalone method. Makes CSS files accessible over HTTP")
553 (options, args) = parser.parse_args()
555 if len(options.test_samples)*len(options.ref_samples)+len(options.all_samples)==0
and len(options.input_dir)==0:
556 print "No samples given as input."
560 if len(options.all_samples)>0
or (len(options.ref_samples)*len(options.test_samples)>0):
562 if len(options.input_dir)>0:
563 do_html(options, options.hash_name, options.standalone)
def get_filenames_from_pool
def count_alive_processes
def do_comparisons_threaded
def call_compare_using_files
std::vector< T >::const_iterator search(const cond::Time_t &val, const std::vector< T > &container)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run