1 from __future__
import print_function
12 from copy
import deepcopy
13 from os
import chdir,getcwd,makedirs
14 from os.path
import abspath,exists,join, basename
15 from re
import sub,search
16 from re
import compile
as recompile
17 from sys
import exit,stderr,version_info
18 from threading
import Thread,activeCount
19 from time
import sleep
20 from urllib2
import Request,build_opener,urlopen
30 from authentication
import X509CertOpen
31 from dirstructure
import Comparison,Directory,tcanvas_print_processes
32 from utils
import Chi2,KS,BinToBin,Statistical_Tests,literal2root
37 """Base class for exceptions in this module.""" 41 """Exception occurs in case of problems of communication with the server. 55 """Communicate with the DQM Document server""" 59 base_dir=
'/data/json/archive/' 64 ident=
"DQMToJson/1.0 python/%d.%d.%d" % version_info[:3]):
76 url=url.replace(
' ',
'%20')
77 datareq = Request(url)
78 datareq.add_header(
'User-agent', self.
ident)
81 url_obj=self.opener.open(datareq)
84 url_obj=urlopen(datareq)
92 data = self.
open_url(full_url).read()
94 data = sub(
"-inf",
'0', data)
95 data = sub(
"\s+inf",
'0', data)
96 data = sub(
"\s+nan",
'0', data)
97 data = sub(
'""(CMSSW.*?)""',
'"\\1"', data)
104 url=url.replace(
" ",
"%20")
113 for ntrials
in xrange(5):
121 print(
"Could not fetch %s. Retrying" %url)
124 for content_dict
in raw_folder[
"contents"]:
125 if "subdir" in content_dict:
126 form_folder[content_dict[
"subdir"]]={
"type":
'dir'}
127 elif "obj" in content_dict:
128 properties=content_dict[
"properties"]
129 obj_name=content_dict[
"obj"]
130 obj_type=properties[
"type"]
131 obj_kind=properties[
"kind"]
133 if "rootobj" in content_dict:
134 obj_as_string=content_dict[
"rootobj"]
135 form_folder[obj_name]={
'type':obj_type,
'obj_as_string':obj_as_string,
"kind":obj_kind}
143 def ls(self, url='', fetch_root=False):
150 url=
'%s?rootcontent=1'%url
151 form_folder=self.
ls_url(url)
160 if len_args!=1
and len_args!=3:
161 raise InvalidNumberOfArguments
163 dataset, run, folder = args
164 full_url=
'%s/data/json/archive/%s/%s/%s' % (self.
server, dataset, run, folder)
170 full_url=self.
DQMpwd[:self.DQMpwd.rfind(
"/")]
174 full_url=DQMcommunicator.base_dir
176 full_url=self.
DQMpwd+
"/"+folder
178 full_url=full_url.replace(
' ',
'%20')
189 A sample contains, among the other things, a data type, a dataset name 192 full_url=
'%s/data/json/samples?match=%s' % (self.
server, samples_string)
193 samples_dict=eval(self.
get_data(full_url))
194 return samples_dict[
"samples"]
201 for sample
in samples_list:
202 temp_datasets_list =
map(
lambda item:item[
"dataset"] ,sample[
'items'])
203 for temp_dataset
in temp_datasets_list:
204 if not temp_dataset
in datasets_list:
205 datasets_list.append(temp_dataset)
211 """Get the available cmssw versions for the relvals. 215 cmssw_versions_with_duplicates=map (
lambda x: x.split(
"/")[2],relvals_list)
216 return list(set(cmssw_versions_with_duplicates))
222 while(dataset_string.endswith(slash)
or dataset_string.beginswith(slash)):
223 dataset_string=dataset_string.strip(
"/")
227 map(
lambda sample: map (
lambda item: runlist.append(item[
'run']), sample[
'items']), samples_list)
243 set1.intersection_update(set2)
253 url = url.replace(
" ",
"%20")
255 for name,description
in self.
ls(url,
True).
items():
256 if "dir" not in description[
"type"]
and "ROOT" in description[
"kind"]:
257 objects.append(
literal2root(description[
"obj_as_string"],description[
"type"]))
267 url = url.replace(
" ",
"%20")
269 for name,description
in self.
ls(url,
True).
items():
270 if "dir" not in description[
"type"]
and "ROOT" in description[
"kind"]:
271 objects[name]=
literal2root(description[
"obj_as_string"],description[
"type"])
277 null_url = (len(url)==0)
282 url = url.replace(
" ",
"%20")
286 for name,description
in self.
ls(
"",
True).
items():
287 if "dir" in description[
"type"]:
290 elif "ROOT" in description[
"kind"]:
291 objects.append(
literal2root(description[
"obj_as_string"],description[
"type"]))
299 null_url = (len(url)==0)
301 if len(present_url)==0:
304 present_url+=
"_%s"%url
309 url = url.replace(
" ",
"%20")
313 for name,description
in self.
ls(
"",
False).
items():
314 if "dir" in description[
"type"]:
317 elif "ROOT" in description[
"kind"]:
318 objects_names.append(
"%s_%s"%(present_url,name))
326 null_url = (len(url)==0)
328 if len(present_url)==0:
331 present_url+=
"_%s"%url
336 url = url.replace(
" ",
"%20")
340 for name,description
in self.
ls(
"",
True).
items():
341 if "dir" in description[
"type"]:
344 elif "ROOT" in description[
"kind"]:
345 objects[
"%s_%s"%(present_url,name)]=
literal2root(description[
"obj_as_string"],description[
"type"])
353 """Structure used to identify a directory in the walked tree, 354 It carries the name and depth information. 363 compname2=dirid.compname
368 is_equal = self.
depth*depth2 <0
or self.
depth==depth2
369 if len(self.
mother)*len(dirid.mother)>0:
370 is_equal = is_equal
and self.
mother==dirid.mother
374 return "Directory %s at level %s" %(self.
name,self.
depth)
378 """ Fetch the content of the single "directory" in the dqm. 381 Thread.__init__(self)
391 """An interface to the DQM document db. It is threaded to compensate the 392 latency introduced by the finite response time of the server. 394 def __init__ (self,comm1,comm2,base1,base2,directory,depth=0,do_pngs=True,stat_test="KS",test_threshold=.5,black_list=[]):
395 Thread.__init__(self)
406 self.name+=
"_%s" %directory.name
410 this_dir=
DirID(self.directory.name,self.
depth)
412 print(
"Skipping %s since blacklisted!" %this_dir)
420 directory1=self.base1+
"/"+self.directory.mother_dir+
"/"+self.directory.name
421 directory2=self.
base2+
"/"+self.directory.mother_dir+
"/"+self.directory.name
424 for fetcher
in fetchers:
426 for fetcher
in fetchers:
429 contents1 = fetchers[0].contents
430 contents2 = fetchers[1].contents
431 set1= set(contents1.keys())
432 set2= set(contents2.keys())
435 self_directory_directories=self.directory.subdirs
436 self_directory_comparisons=self.directory.comparisons
437 contents_names=
list(set1.intersection(set2))
439 for name
in contents_names:
440 content = contents1[name]
441 if "dir" in content[
"type"]:
443 subdir=
Directory(name,
join(self.directory.mother_dir,self.directory.name))
447 walkers.append(dirwalker)
448 n_threads=activeCount()
452 elif content[
"kind"]==
"ROOT":
455 join(self.directory.mother_dir,self.directory.name),
457 literal2root(contents2[name][
"obj_as_string"],content[
"type"]),
460 self_directory_comparisons.append(comparison)
463 for walker
in walkers:
465 walker_directory=walker.directory
466 if not walker_directory.is_empty():
467 self_directory_directories.append(walker_directory)
472 """ Class acting as interface between the user and the harvested DQMRootFile. 473 It skips the directories created by the DQM infrastructure so to provide an 474 interface as similar as possible to a real direcory structure and to the 475 directory structure provided by the db interface. 483 print(
"Directory %s does not exist: skipping. Is this a custom rootfile?" %dqmdatadir)
488 is_null =
not directory
490 print(
"Directory %s does not exist!" %name, file=stderr)
493 def ls(self,directory_name=""):
496 if len(directory_name)==0:
499 directory=self.rootfilepwd.GetDirectory(directory_name)
500 if self.
__is_null(directory,directory_name):
503 for key
in directory.GetListOfKeys():
504 contents[key.GetName()]=key.GetClassName()
507 def cd(self,directory_name):
508 """Change the current TDirectoryFile. The familiar "-" and ".." directories 509 can be accessed as well. 511 if directory_name==
"-":
515 if directory_name==
"..":
519 mom=self.rootfilepwd.GetMotherDir()
522 if "Run " not in self.rootfilepwd.GetName():
523 self.rootfilepwd.Delete()
527 new_directory=self.rootfilepwd.GetDirectory(directory_name)
528 if not self.
__is_null(new_directory,directory_name):
533 """Get a TObject from the rootfile. 535 obj=self.rootfilepwd.Get(objname)
542 def __init__(self, name, topdirname,rootfilename1, rootfilename2, run=-1, black_list=[], stat_test="KS", test_threshold=.5,draw_success=True,do_pngs=False, black_list_histos=[]):
547 self.
stat_test=Statistical_Tests[stat_test](test_threshold)
552 self.directory.draw_success=draw_success
553 self.directory.do_pngs=do_pngs
562 def cd(self,directory_name, on_disk=False, regexp=False,):
564 if len(directory_name)!=0:
566 if not exists(directory_name):
567 makedirs(directory_name)
568 chdir(directory_name)
569 tmp = self.dqmrootfile2.ls().
keys()
573 self.dqmrootfile2.cd(next_dir)
574 tmp = self.dqmrootfile1.ls().
keys()
578 self.dqmrootfile1.cd(next_dir)
580 if len(directory_name)!=0:
582 if not exists(directory_name):
583 makedirs(directory_name)
584 chdir(directory_name)
585 self.dqmrootfile2.cd(directory_name)
586 self.dqmrootfile1.cd(directory_name)
588 def ls(self,directory_name=""):
589 """Return common objects to the 2 files. 591 contents1=self.dqmrootfile1.ls(directory_name)
592 contents2=self.dqmrootfile2.ls(directory_name)
598 keys = [key
for key
in contents2.keys()
if key
in contents1]
601 if contents1[key]!=contents2[key]:
602 diff_file1 = set(contents1.keys()) - set(contents2.keys())
603 diff_file2 = set(contents2.keys()) - set(contents1.keys())
604 for key1
in diff_file1:
605 obj_type = contents1[key1]
606 if obj_type ==
"TDirectoryFile":
610 if obj_type[:2]!=
"TH" and obj_type[:3]!=
"TPr" :
613 for key1
in diff_file2:
614 obj_type = contents2[key1]
615 if obj_type ==
"TDirectoryFile":
619 if obj_type[:2]!=
"TH" and obj_type[:3]!=
"TPr" :
622 contents[key]=contents1[key]
626 h1=self.dqmrootfile1.getObj(name)
627 h2=self.dqmrootfile2.getObj(name)
635 this_dir=DirID(dir_name,depth)
637 if this_dir
in self.black_list:
651 n_top_contents=len(contents)
656 for name,obj_type
in contents.items():
657 if obj_type==
"TDirectoryFile":
661 print(
"Studying directory %s, %s/%s" %(name,cont_counter,n_top_contents))
666 subdir=Directory(name)
667 subdir.draw_success=directory.draw_success
668 subdir.do_pngs=directory.do_pngs
669 self.__fill_single_dir(name,subdir,
join(mother_name,dir_name),depth)
670 if not subdir.is_empty():
672 print(
" ->Appending %s..." %name, end=
' ')
673 directory.subdirs.append(subdir)
678 if obj_type[:2]!=
"TH" and obj_type[:3]!=
"TPr" :
680 h1,h2=self.getObjs(name)
682 path =
join(mother_name,dir_name,name)
683 if path
in self.black_list_histos:
684 print(
" Skipping %s" %(path))
685 directory.comparisons.append(Comparison(name,
686 join(mother_name,dir_name),
688 deepcopy(self.stat_test),
689 draw_success=directory.draw_success,
690 do_pngs=directory.do_pngs, skip=
True))
692 directory.comparisons.append(Comparison(name,
693 join(mother_name,dir_name),
695 deepcopy(self.stat_test),
696 draw_success=directory.draw_success,
697 do_pngs=directory.do_pngs, skip=
False))
698 directory.filename1 = self.filename1
699 directory.filename2 = self.filename2
700 directory.different_histograms[
'file1'] = self.different_histograms[
'file1']
701 directory.different_histograms[
'file2'] = self.different_histograms[
'file2']
713 first_run_dir =
filter(
lambda k:
"Run " in k, self.
ls().
keys())[0]
715 print(
"\nRundir not there: Is this a generic rootfile?\n")
718 self.
run=
int(rundir.split(
" ")[1])
720 print(
"Setting run number to 0")
723 rundir=
"Run %s"%self.
run 726 self.
cd(rundir,
False,
True)
728 print(
"\nRundir not there: Is this a generic rootfile?\n")
733 n_left_threads=len(tcanvas_print_processes)
735 print(
"Waiting for %s threads to finish..." %n_left_threads)
736 for p
in tcanvas_print_processes:
743 Thread.__init__(self)
753 black_list_str=black_list_str.replace(
"__",
" ")
754 if len(black_list_str)>0:
755 for ele
in black_list_str.split(
","):
756 dirname,level=ele.split(
"@")
759 if "/" not in dirname:
760 dirid=
DirID(dirname,level)
762 mother,daughter=dirname.split(
"/")
763 dirid=
DirID(daughter,level,mother)
764 if not dirid
in black_list:
765 black_list.append(dirid)
def get_datasets_list(self, dataset_string="")
def __init__(self, name, depth, mother="")
def __fill_single_dir(self, dir_name, directory, mother_name="", depth=0)
std::vector< T >::const_iterator search(const cond::Time_t &val, const std::vector< T > &container)
def literal2root(literal, rootType, debug=False)
def ls(self, url='', fetch_root=False)
def __init__(self, comm1, comm2, base1, base2, directory, depth=0, do_pngs=True, stat_test="KS", test_threshold=.5, black_list=[])
def get_data(self, full_url)
S & print(S &os, JobReport::InputFile const &f)
def __init__(self, comm, directory)
def get_root_objects(self, url="")
def __init__(self, name, topdirname, rootfilename1, rootfilename2, run=-1, black_list=[], stat_test="KS", test_threshold=.5, draw_success=True, do_pngs=False, black_list_histos=[])
def get_root_objects_names_list_recursive(self, url="", present_url="")
def get_common_runs(self, dataset_string1, dataset_string2)
def get_dataset_runs(self, dataset_string)
def get_root_objects_recursive(self, url="", present_url="")
def cd(self, directory_name, on_disk=False, regexp=False)
def __is_null(self, directory, name)
def ls(self, directory_name="")
def ls(self, directory_name="")
def getObj(self, objname)
def cd(self, directory_name)
def get_root_objects_list_recursive(self, url="")
static std::string join(char **cmd)
def get_runs_list(self, dataset_string)
def __init__(self, server, is_private=False, ident="DQMToJson/1.0 python/%d.%d.%d"%version_info[:3])
def __init__(self, walker)
def get_root_objects_list(self, url="")
def get_RelVal_CMSSW_versions(self, query)
def get_samples(self, samples_string="*")
def __init__(self, rootfilename)
def string2blacklist(black_list_str)
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