CMS 3D CMS Logo

MatrixUtil.py
Go to the documentation of this file.
1 class Matrix(dict):
2  def __setitem__(self,key,value):
3  if key in self:
4  print "ERROR in Matrix"
5  print "overwritting",key,"not allowed"
6  else:
7  self.update({float(key):WF(float(key),value)})
8 
9  def addOverride(self,key,override):
10  self[key].addOverride(override)
11 
12 #the class to collect all possible steps
13 class Steps(dict):
14  def __setitem__(self,key,value):
15  if key in self:
16  print "ERROR in Step"
17  print "overwritting",key,"not allowed"
18  import sys
19  sys.exit(-9)
20  else:
21  self.update({key:value})
22  # make the python file named <step>.py
23  #if not '--python' in value: self[key].update({'--python':'%s.py'%(key,)})
24 
25  def overwrite(self,keypair):
26  value=self[keypair[1]]
27  self.update({keypair[0]:value})
28 
29 class WF(list):
30  def __init__(self,n,l):
31  self.extend(l)
32  self.num=n
33  #the actual steps of this WF
34  self.steps=[]
35  self.overrides={}
36  def addOverride(self,overrides):
37  self.overrides=overrides
38 
39  def interpret(self,stepsDict):
40  for s in self:
41  print 'steps',s,stepsDict[s]
42  steps.append(stepsDict[s])
43 
44 
45 
46 def expandLsInterval(lumis):
47  return range(lumis[0],(lumis[1]+1))
48 
50 jsonFile2015 = findFileInPath("DPGAnalysis/Skims/data/Cert_13TeV_16Dec2015ReReco_Collisions15_25ns_50ns_JSON.txt")
51 jsonFile2016 = findFileInPath("DPGAnalysis/Skims/data/Cert_271036-274240_13TeV_PromptReco_Collisions16_JSON.txt")
52 
53 import json
54 with open(jsonFile2015) as data_file:
55  data_json2015 = json.load(data_file)
56 
57 with open(jsonFile2016) as data_file:
58  data_json2016 = json.load(data_file)
59 
60 # return a portion of the 2015 golden json
61 # LS for a full run by default; otherwise a subset of which you determined the size
62 def selectedLS(list_runs=[],maxNum=-1,l_json=data_json2015):
63  # print "maxNum is %s"%(maxNum)
64  if not isinstance(list_runs[0], int):
65  print "ERROR: list_runs must be a list of intergers"
66  return None
67  local_dict = {}
68  ls_count = 0
69 
70  for run in list_runs:
71  if str(run) in l_json.keys():
72  # print "run %s is there"%(run)
73  runNumber = run
74  # print "Doing lumi-section selection for run %s: "%(run)
75  for LSsegment in l_json[str(run)] :
76  # print LSsegment
77  ls_count += (LSsegment[-1] - LSsegment[0] + 1)
78  if (ls_count > maxNum) & (maxNum != -1):
79  break
80  # return local_dict
81  if runNumber in local_dict.keys():
82  local_dict[runNumber].append(LSsegment)
83  else:
84  local_dict[runNumber] = [LSsegment]
85  # print "total LS so far %s - grow %s"%(ls_count,local_dict)
86  #local_dict[runNumber] = [1,2,3]
87  else:
88  print "run %s is NOT present in json %s\n\n"%(run, l_json)
89  # print "++ %s"%(local_dict)
90 
91  if ( len(local_dict) > 0 ) :
92  return local_dict
93  else :
94  print "No luminosity section interval passed the json and your selection; returning None"
95  return None
96 
97 # print "\n\n\n THIS IS WHAT I RETURN: %s \n\n"%( selectedLS([251244,251251]) )
98 
99 
100 
101 
102 InputInfoNDefault=2000000
104  def __init__(self,dataSet,dataSetParent='',label='',run=[],ls={},files=1000,events=InputInfoNDefault,split=10,location='CAF',ib_blacklist=None,ib_block=None) :
105  self.run = run
106  self.ls = ls
107  self.files = files
108  self.events = events
109  self.location = location
110  self.label = label
111  self.dataSet = dataSet
112  self.split = split
113  self.ib_blacklist = ib_blacklist
114  self.ib_block = ib_block
115  self.dataSetParent = dataSetParent
116 
117  def das(self, das_options, dataset):
118  if len(self.run) is not 0 or self.ls:
119  queries = self.queries(dataset)[:3]
120  if len(self.run) != 0:
121  command = ";".join(["dasgoclient %s --query '%s'" % (das_options, query) for query in queries])
122  else:
123  lumis = self.lumis()
124  commands = []
125  while queries:
126  commands.append("dasgoclient %s --query 'lumi,%s' --format json | das-selected-lumis.py %s " % (das_options, queries.pop(), lumis.pop()))
127  command = ";".join(commands)
128  command = "({0})".format(command)
129  else:
130  command = "dasgoclient %s --query '%s'" % (das_options, self.queries(dataset)[0])
131 
132  # Run filter on DAS output
133  if self.ib_blacklist:
134  command += " | grep -E -v "
135  command += " ".join(["-e '{0}'".format(pattern) for pattern in self.ib_blacklist])
136  from os import getenv
137  if getenv("CMSSW_USE_IBEOS","false")=="true": return command + " | ibeos-lfn-sort"
138  return command + " | sort -u"
139 
140  def lumiRanges(self):
141  if len(self.run) != 0:
142  return "echo '{\n"+",".join(('"%d":[[1,268435455]]\n'%(x,) for x in self.run))+"}'"
143  if self.ls :
144  return "echo '{\n"+",".join(('"%d" : %s\n'%( int(x),self.ls[x]) for x in self.ls.keys()))+"}'"
145  return None
146 
147  def lumis(self):
148  query_lumis = []
149  if self.ls:
150  for run in self.ls.keys():
151  run_lumis = []
152  for rng in self.ls[run]: run_lumis.append(str(rng[0])+","+str(rng[1]))
153  query_lumis.append(":".join(run_lumis))
154  return query_lumis
155 
156  def queries(self, dataset):
157  query_by = "block" if self.ib_block else "dataset"
158  query_source = "{0}#{1}".format(dataset, self.ib_block) if self.ib_block else dataset
159 
160  if self.ls :
161  the_queries = []
162  #for query_run in self.ls.keys():
163  # print "run is %s"%(query_run)
164  # if you have a LS list specified, still query das for the full run (multiple ls queries take forever)
165  # and use step1_lumiRanges.log to run only on LS which respect your selection
166 
167  # DO WE WANT T2_CERN ?
168  return ["file {0}={1} run={2}".format(query_by, query_source, query_run) for query_run in self.ls.keys()]
169  #return ["file {0}={1} run={2} site=T2_CH_CERN".format(query_by, query_source, query_run) for query_run in self.ls.keys()]
170 
171 
172  #
173  #for a_range in self.ls[query_run]:
174  # # print "a_range is %s"%(a_range)
175  # the_queries += ["file {0}={1} run={2} lumi={3} ".format(query_by, query_source, query_run, query_ls) for query_ls in expandLsInterval(a_range) ]
176  #print the_queries
177  return the_queries
178 
179  if len(self.run) is not 0:
180  return ["file {0}={1} run={2} site=T2_CH_CERN".format(query_by, query_source, query_run) for query_run in self.run]
181  #return ["file {0}={1} run={2} ".format(query_by, query_source, query_run) for query_run in self.run]
182  else:
183  return ["file {0}={1} site=T2_CH_CERN".format(query_by, query_source)]
184  #return ["file {0}={1} ".format(query_by, query_source)]
185 
186  def __str__(self):
187  if self.ib_block:
188  return "input from: {0} with run {1}#{2}".format(self.dataSet, self.ib_block, self.run)
189  return "input from: {0} with run {1}".format(self.dataSet, self.run)
190 
191 
192 # merge dictionaries, with prioty on the [0] index
193 def merge(dictlist,TELL=False):
194  import copy
195  last=len(dictlist)-1
196  if TELL: print last,dictlist
197  if last==0:
198  # ONLY ONE ITEM LEFT
199  return copy.copy(dictlist[0])
200  else:
201  reducedlist=dictlist[0:max(0,last-1)]
202  if TELL: print reducedlist
203  # make a copy of the last item
204  d=copy.copy(dictlist[last])
205  # update with the last but one item
206  d.update(dictlist[last-1])
207  # and recursively do the rest
208  reducedlist.append(d)
209  return merge(reducedlist,TELL)
210 
211 def remove(d,key,TELL=False):
212  import copy
213  e = copy.deepcopy(d)
214  if TELL: print "original dict, BEF: %s"%d
215  del e[key]
216  if TELL: print "copy-removed dict, AFT: %s"%e
217  return e
218 
219 
220 #### Standard release validation samples ####
221 
222 stCond={'--conditions':'auto:run1_mc'}
223 def Kby(N,s):
224  return {'--relval':'%s000,%s'%(N,s)}
225 def Mby(N,s):
226  return {'--relval':'%s000000,%s'%(N,s)}
227 
228 def changeRefRelease(steps,listOfPairs):
229  for s in steps:
230  if ('INPUT' in steps[s]):
231  oldD=steps[s]['INPUT'].dataSet
232  for (ref,newRef) in listOfPairs:
233  if ref in oldD:
234  steps[s]['INPUT'].dataSet=oldD.replace(ref,newRef)
235  if '--pileup_input' in steps[s]:
236  for (ref,newRef) in listOfPairs:
237  if ref in steps[s]['--pileup_input']:
238  steps[s]['--pileup_input']=steps[s]['--pileup_input'].replace(ref,newRef)
239 
240 def addForAll(steps,d):
241  for s in steps:
242  steps[s].update(d)
243 
244 
245 def genvalid(fragment,d,suffix='all',fi='',dataSet=''):
246  import copy
247  c=copy.copy(d)
248  if suffix:
249  c['-s']=c['-s'].replace('genvalid','genvalid_'+suffix)
250  if fi:
251  c['--filein']='lhe:%d'%(fi,)
252  if dataSet:
253  c['--filein']='das:%s'%(dataSet,)
254  c['cfg']=fragment
255  return c
256 
257 
def queries(self, dataset)
Definition: MatrixUtil.py:156
Definition: merge.py:1
def interpret(self, stepsDict)
Definition: MatrixUtil.py:39
def __setitem__(self, key, value)
Definition: MatrixUtil.py:14
def genvalid(fragment, d, suffix='all', fi='', dataSet='')
Definition: MatrixUtil.py:245
def overwrite(self, keypair)
Definition: MatrixUtil.py:25
def replace(string, replacements)
def __init__(self, dataSet, dataSetParent='', label='', run=[], ls={}, files=1000, events=InputInfoNDefault, split=10, location='CAF', ib_blacklist=None, ib_block=None)
Definition: MatrixUtil.py:104
def __init__(self, n, l)
Definition: MatrixUtil.py:30
def lumiRanges(self)
Definition: MatrixUtil.py:140
def findFileInPath(theFile)
def expandLsInterval(lumis)
Definition: MatrixUtil.py:46
def addForAll(steps, d)
Definition: MatrixUtil.py:240
def das(self, das_options, dataset)
Definition: MatrixUtil.py:117
def __setitem__(self, key, value)
Definition: MatrixUtil.py:2
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def selectedLS(list_runs=[], maxNum=-1, l_json=data_json2015)
Definition: MatrixUtil.py:62
def remove(d, key, TELL=False)
Definition: MatrixUtil.py:211
def changeRefRelease(steps, listOfPairs)
Definition: MatrixUtil.py:228
#define update(a, b)
def Mby(N, s)
Definition: MatrixUtil.py:225
def addOverride(self, key, override)
Definition: MatrixUtil.py:9
def Kby(N, s)
Standard release validation samples ####.
Definition: MatrixUtil.py:223
def addOverride(self, overrides)
Definition: MatrixUtil.py:36
#define str(s)
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
def merge(dictlist, TELL=False)
Definition: MatrixUtil.py:193