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 type(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.keys()) > 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  command += " | sort -u"
137  return command
138 
139  def lumiRanges(self):
140  if len(self.run) != 0:
141  return "echo '{\n"+",".join(('"%d":[[1,268435455]]\n'%(x,) for x in self.run))+"}'"
142  if self.ls :
143  return "echo '{\n"+",".join(('"%d" : %s\n'%( int(x),self.ls[x]) for x in self.ls.keys()))+"}'"
144  return None
145 
146  def lumis(self):
147  query_lumis = []
148  if self.ls:
149  for run in self.ls.keys():
150  run_lumis = []
151  for rng in self.ls[run]: run_lumis.append(str(rng[0])+","+str(rng[1]))
152  query_lumis.append(":".join(run_lumis))
153  return query_lumis
154 
155  def queries(self, dataset):
156  query_by = "block" if self.ib_block else "dataset"
157  query_source = "{0}#{1}".format(dataset, self.ib_block) if self.ib_block else dataset
158 
159  if self.ls :
160  the_queries = []
161  #for query_run in self.ls.keys():
162  # print "run is %s"%(query_run)
163  # if you have a LS list specified, still query das for the full run (multiple ls queries take forever)
164  # and use step1_lumiRanges.log to run only on LS which respect your selection
165 
166  # DO WE WANT T2_CERN ?
167  return ["file {0}={1} run={2}".format(query_by, query_source, query_run) for query_run in self.ls.keys()]
168  #return ["file {0}={1} run={2} site=T2_CH_CERN".format(query_by, query_source, query_run) for query_run in self.ls.keys()]
169 
170 
171  #
172  #for a_range in self.ls[query_run]:
173  # # print "a_range is %s"%(a_range)
174  # 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) ]
175  #print the_queries
176  return the_queries
177 
178  if len(self.run) is not 0:
179  return ["file {0}={1} run={2} site=T2_CH_CERN".format(query_by, query_source, query_run) for query_run in self.run]
180  #return ["file {0}={1} run={2} ".format(query_by, query_source, query_run) for query_run in self.run]
181  else:
182  return ["file {0}={1} site=T2_CH_CERN".format(query_by, query_source)]
183  #return ["file {0}={1} ".format(query_by, query_source)]
184 
185  def __str__(self):
186  if self.ib_block:
187  return "input from: {0} with run {1}#{2}".format(self.dataSet, self.ib_block, self.run)
188  return "input from: {0} with run {1}".format(self.dataSet, self.run)
189 
190 
191 # merge dictionaries, with prioty on the [0] index
192 def merge(dictlist,TELL=False):
193  import copy
194  last=len(dictlist)-1
195  if TELL: print last,dictlist
196  if last==0:
197  # ONLY ONE ITEM LEFT
198  return copy.copy(dictlist[0])
199  else:
200  reducedlist=dictlist[0:max(0,last-1)]
201  if TELL: print reducedlist
202  # make a copy of the last item
203  d=copy.copy(dictlist[last])
204  # update with the last but one item
205  d.update(dictlist[last-1])
206  # and recursively do the rest
207  reducedlist.append(d)
208  return merge(reducedlist,TELL)
209 
210 def remove(d,key,TELL=False):
211  import copy
212  e = copy.deepcopy(d)
213  if TELL: print "original dict, BEF: %s"%d
214  del e[key]
215  if TELL: print "copy-removed dict, AFT: %s"%e
216  return e
217 
218 
219 #### Standard release validation samples ####
220 
221 stCond={'--conditions':'auto:run1_mc'}
222 def Kby(N,s):
223  return {'--relval':'%s000,%s'%(N,s)}
224 def Mby(N,s):
225  return {'--relval':'%s000000,%s'%(N,s)}
226 
227 def changeRefRelease(steps,listOfPairs):
228  for s in steps:
229  if ('INPUT' in steps[s]):
230  oldD=steps[s]['INPUT'].dataSet
231  for (ref,newRef) in listOfPairs:
232  if ref in oldD:
233  steps[s]['INPUT'].dataSet=oldD.replace(ref,newRef)
234  if '--pileup_input' in steps[s]:
235  for (ref,newRef) in listOfPairs:
236  if ref in steps[s]['--pileup_input']:
237  steps[s]['--pileup_input']=steps[s]['--pileup_input'].replace(ref,newRef)
238 
239 def addForAll(steps,d):
240  for s in steps:
241  steps[s].update(d)
242 
243 
244 def genvalid(fragment,d,suffix='all',fi='',dataSet=''):
245  import copy
246  c=copy.copy(d)
247  if suffix:
248  c['-s']=c['-s'].replace('genvalid','genvalid_'+suffix)
249  if fi:
250  c['--filein']='lhe:%d'%(fi,)
251  if dataSet:
252  c['--filein']='das:%s'%(dataSet,)
253  c['cfg']=fragment
254  return c
255 
256 
def queries(self, dataset)
Definition: MatrixUtil.py:155
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:244
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:139
def findFileInPath(theFile)
def expandLsInterval(lumis)
Definition: MatrixUtil.py:46
def addForAll(steps, d)
Definition: MatrixUtil.py:239
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:210
def changeRefRelease(steps, listOfPairs)
Definition: MatrixUtil.py:227
#define update(a, b)
def Mby(N, s)
Definition: MatrixUtil.py:224
def addOverride(self, key, override)
Definition: MatrixUtil.py:9
def Kby(N, s)
Standard release validation samples ####.
Definition: MatrixUtil.py:222
def addOverride(self, overrides)
Definition: MatrixUtil.py:36
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:192