CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
inputFilesetParser.py
Go to the documentation of this file.
1 import os,csv
2 from RecoLuminosity.LumiDB import csvSelectionParser,selectionParser,CommonUtil
4  def __init__(self,inputfilename):
5  filelist=inputfilename.split('+')
6  self.__inputresultfiles=filelist[0:-1]
7  self.__inputselectionfile=filelist[-1]
9  self.__inputResult=[]
11  if len(self.__inputselectionfile)!=0:
12  basename,extension=os.path.splitext(self.__inputselectionfile)
13  if extension=='.csv':#if file ends with .csv,use csv parser,else parse as json file
15  else:
16  selectf=open(self.__inputselectionfile,'r')
17  inputfilecontent=selectf.read()
19  if len(self.__inputresultfiles)!=0:
20  header=''
21  for f in self.__inputresultfiles:
22  ifile=open(f)
23  hasHeader=csv.Sniffer().has_header(ifile.read(1024))
24  ifile.seek(0)
25  csvReader=csv.reader(ifile,delimiter=',')
26  irow=0
27  for row in csvReader:
28  if hasHeader and irow==0:
29  self.__inputResultHeader=row
30  else:
31  self.__inputResult.append(row)
32  irow=irow+1
33  ifile.close()
34  def selectionfilename(self):
35  '''return the input selection file name
36  '''
37  return self.__inputselectionfile
38  def mergeResultOnly(self):
39  '''if empty input selection filename give, I assume you only need to merge pieces of output result files into one
40  '''
41  return len(self.__inputselectionfile)==0
42  def resultfiles(self):
43  return self.__inputresultfiles
44  def resultHeader(self):
45  '''
46  output [headerfields]
47  '''
48  return self.__inputResultHeader
49  def resultInput(self):
50  '''
51  output [valuefields]
52  '''
53  return self.__inputResult
54  def fieldvalues(self,fieldname,fieldtype):
55  '''
56  given the input result field name and typem return the list of values
57  '''
58  fieldidx=None
59  result=[]
60  try:
61  fieldidx=self.__inputResultHeader.index(fieldname)
62  except:
63  print 'field ',fieldname,' not found'
64  raise
65  for r in self.__inputResult:
66  stringvalue=r[fieldidx]
67  if fieldtype in ['int','unsigned int']:
68  if not CommonUtil.is_intstr(stringvalue):
69  print 'field ',fieldname,' is not integer type'
70  raise
71  else:
72  result.append(int(stringvalue))
73  continue
74  elif fieldtype in ['float']:
75  if not CommonUtil.is_floatstr(stringvalue):
76  print 'field ',fieldname,' is not float type'
77  raise
78  else:
79  result.append(float(stringvalue))
80  contine
81  elif fieldtype in ['string','str']:
82  result.append(stringvalue)
83  else:
84  raise 'unsupported type ',fieldtype
85  return result
86  def fieldtotal(self,fieldname,fieldtype):
87  '''
88  given the input result field name and type, return the total
89  '''
90  fieldidx=None
91  result=0
92  try:
93  fieldidx=self.__inputResultHeader.index(fieldname)
94  except:
95  print 'field ',fieldname,' not found'
96  raise
97  for r in self.__inputResult:
98  stringvalue=r[fieldidx]
99  if fieldtype in ['int','unsigned int']:
100  if not CommonUtil.is_intstr(stringvalue):
101  print 'field ',fieldname,' is not integer type'
102  raise
103  else:
104  result=int(result)+int(stringvalue)
105  continue
106  elif fieldtype in ['float'] :
107  if not CommonUtil.is_floatstr(stringvalue):
108  print 'field ',fieldname,' is not float type'
109  raise
110  else:
111  result=float(result)+float(stringvalue)
112  continue
113  else:
114  raise 'cannot sum types other than int ,float'
115  return result
116  def runs(self):
118  return None
119  return self.__inputSelectionFileparsingResult.runs()
120  def runsandls(self):
122  return None
123  return self.__inputSelectionFileparsingResult.runsandls()
124  def runsandlsStr(self):
126  return None
127  return self.__inputSelectionFileparsingResult.runsandlsStr()
128 
129 if __name__ == '__main__':
130  result={}
131  filename='../test/overview.csv+../test/overview-140381.csv+../test/Cert_132440-139103_7TeV_StreamExpress_Collisions10_JSON.txt'
132  #filename='../test/overview.csv+../test/overview-140381.csv+'
133  p=inputFilesetParser(filename)
134  print p.selectionfilename()
135  print p.resultfiles()
136  #print p.runs()
137  #print p.runsandls()
138  print 'do I only need to merge the results? ',p.mergeResultOnly()
139  resultheader=p.resultHeader()
140  result=p.resultInput()
141  alreadyprocessedRuns=p.fieldvalues('run','int')
142  print 'runs already have results ', alreadyprocessedRuns
143  print 'total delivered ',p.fieldtotal('delivered','float')
144  print 'total recorded ',p.fieldtotal('recorded','float')
145  newrunsandls={}
146  for run,cmslslist in p.runsandls().items():
147  if run in alreadyprocessedRuns:
148  continue
149  else:
150  newrunsandls[run]=cmslslist
151  print 'runs and ls still need to be processed', newrunsandls
152  filename='../test/lumi_900_output.json'
153  p2=inputFilesetParser(filename)
154  print 'result 2: ',p2.runs()
def is_floatstr
Definition: CommonUtil.py:34
def is_intstr
Definition: CommonUtil.py:26
list object
Definition: dbtoconf.py:77