ATLAS Offline Software
Classes | Functions
getIBLDate Namespace Reference

Classes

class  scanDataThread
 

Functions

def sensorToNumber (stave, side, module)
 
def findFiles (searchFolderPath)
 
def appendEntries (fileName, dataType, dataFolder, dateEntries, largestDates, firstDate, lastDate, borkDate)
 
def scanData (dataType)
 
def main ()
 

Function Documentation

◆ appendEntries()

def getIBLDate.appendEntries (   fileName,
  dataType,
  dataFolder,
  dateEntries,
  largestDates,
  firstDate,
  lastDate,
  borkDate 
)

Definition at line 61 of file getIBLDate.py.

61 def appendEntries(fileName,dataType,dataFolder,dateEntries,largestDates,firstDate,lastDate,borkDate):
62 
63  try:
64  rawFiles = open(fileName,'r')
65  except IOError:
66  print ("could not open file " + str(fileName) + " fool")
67  return firstDate #So this probably crashes if filename can't be opened. Try not to let that happen.
68 
69  returnList = [firstDate,largestDates,borkDate,dateEntries,firstDate]
70 
71  print(firstDate)
72 
73  index_Jennet = 0
74  for dataLine in rawFiles: #read in each line of fileName and do things to it. Does this work with empty files? I'm guessing so.
75 
76  print(index_Jennet)
77  index_Jennet = index_Jennet + 1
78  #We actually have two types of data file from DDV, one containing lots of commas, one which doesn't. The len(commasplit) thing is how I
79  #differentiate between the two types.
80 
81  if len(dataLine)>5:
82  commaSplit = dataLine.split(',')
83 
84  if '!!!!' in dataLine: #Our entry is blank, leg it!
85  return returnList
86 
87  if len(commaSplit)<2:
88 
89  #file is from DownloadTxtData. Erm, I'm not gonna comment this, rough idea is split tempLines, 0th element is the sensor name,
90  #grab the DCS flags from the name, use it to make teh module name. If that module name is unexpected, break and report an error
91 
92  tempLines = dataLine.split()
93  name = tempLines[0]
94  A = name[4:6]
95  B = name[7]
96  C = name[10]
97 
98  moduleName = 'LI_S' + str(A) +'_'+ str(B) + '_M' + str(C)
99 
100  moduleNumber = int(8 * (int(A)-1) + int(C)-1)
101  if B =='C':
102  moduleNumber +=4
103 
104  if (name!=moduleName+"_"+dataType) or (len(tempLines)<3) : #This section is true if the data is bad; break and return
105  returnList[2] = lastDate
106  print ("\nBORK BORK BORK! Error in data values of " + fileName + " for " + dataType + " borkDate " + str(returnList[2]) )
107  print ("First line reads " + dataLine+"\n")
108  print ("should read " + moduleName+"_"+dataType+"\n")
109 
110  borkRepork = open(dataFolder+dataType+"BORKBORKBORK.txt",'w')
111  borkRepork.write("filename " + fileName + "date range " + str(firstDate) + "-" + str(lastDate) + " first line " + dataLine + '\n')
112  borkRepork.close()
113  return returnList
114 
115  outName = dataFolder+dataType+'/' + moduleName +'.ssv' #save file name made here!
116 
117  date = tempLines[1].split('-')
118  time1 = tempLines[2].split(':')
119  data = 0
120 
121  if dataType == 'TModule': #Oh yeah, DDV switched to reporting absolute values to magnitudes for bias and current at some point.
122  data = tempLines[3]
123  else: #if current or bias, only use absolute values, instead of y'know, signed values. Stupid DDV.
124  data = abs(float(tempLines[3]))
125  dateTime = datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time1[0]), int(time1[1]), int(time1[2]),int(time1[3]))
126 
127  #This checks if the values are within the expected range, if not the below is true and it borks and returns.
128  if (dateTime>lastDate+datetime.timedelta(hours = 2)) or (dateTime<firstDate -datetime.timedelta(hours = 2)) :
129  returnList[2] = lastDate
130  print ("\nBORK BORK BORK! Error in date of " + fileName + " for " + dataType + " borkDate " + str(returnList[2]) )
131  print ("First line reads " + dataLine + "\n")
132  print ("should read " + moduleName+"_"+dataType+"\n")
133 
134  borkRepork = open(dataFolder+dataType+"BORKBORKBORK.txt",'w')
135  borkRepork.write("filename " + fileName + "date range " + str(firstDate) + "-" + str(lastDate) + " first line " + dataLine + '\n')
136  borkRepork.close()
137  return returnList
138 
139 
140  if dateTime>returnList[1][moduleNumber]: #if the end time for data is bigger than the previous max value for this DCS group. I think
141  returnList[3][moduleNumber]+=1
142 
143  #format the line for saving to the finished file area he clunked clunkily. Change this if you wanna change the output format.
144  outputLine = moduleName+'_'+dataType + " " + str(dateTime) + " " + str( time.mktime(dateTime.timetuple()) ) + " " + str(data) + "\n"
145 
146  returnList[1][moduleNumber] = dateTime
147 
148  #check if output file already exists, if not create it, if so append previous file.
149  if os.path.isfile(outName) == False:
150 
151  output = open(outName,'w')
152  output.write(outputLine)
153  output.close()
154  else: #AI=='11' and BI =='A' and CI == '1':
155  output = open(outName,'a')
156  output.write(outputLine)
157  output.close()
158 
159  else:
160  #from getDataSafely, format here splits data based on !!! between DCS groups.
161 
162  moduleList = dataLine.split('!!!')
163 
164  for module in moduleList: #Hah, look at me using accurate labels for my variables!
165 
166  elements = module.split(',')
167  name = elements[0]
168  A="A"
169  B="A"
170  C="A"
171  if len(name)>9:
172  #print (name)
173  A = name[4:6]
174  B = name[7]
175  C = name[10]
176 
177  moduleName = 'LI_S' + str(A) +'_'+ str(B) + '_M' + str(C)
178 
179  try:
180 
181  moduleNumber = int(8 * (int(A)-1) + int(C)-1)
182  if B =='C':
183  moduleNumber +=4
184 
185  outName = dataFolder+dataType+'/' + moduleName +'.ssv'
186 
187  #check if file exists, make it if not, append it if so.
188  if os.path.isfile(outName) == False:
189  output = open(outName,'w')
190  else:
191  output = open(outName,'a')
192 
193  position=0
194 
195  #I'm like 90% sure each element is a single time (so, time and sensor reading). This makes this process slow.
196  for element in elements:
197 
198  if position!=0: #the first element is the DCS group name; not hella useful.
199 
200  tempLines = element.split()
201  date= tempLines[1].split('-')
202  time1 = tempLines[2].split(':')
203  data = 0
204 
205  #Make sure we use absolute values for current and bias.
206  if dataType == 'TModule':
207  data = tempLines[0]
208  else:
209  data = abs(float(tempLines[0]))
210 
211  dateTime = datetime.datetime(int(date[2]), int(date[1]), int(date[0]), int(time1[0]), int(time1[1]), int(time1[2]),int(time1[3]))
212 
213  #true if data stuff
214  if (dateTime>lastDate+datetime.timedelta(hours = 2)) or (dateTime<firstDate -datetime.timedelta(hours = 2)) :
215  returnList[2] = lastDate
216  print ("\nBORK BORK BORK! Error in date of " + fileName + " for " + dataType + " borkDate " + str(returnList[2]) )
217  print ("First line reads " + dataLine + "\n")
218  print ("Should read " + moduleName+"_"+dataType+"\n")
219 
220  borkRepork = open(dataFolder+dataType+"BORKBORKBORK.txt",'w')
221  borkRepork.write("filename " + fileName + "date range " + str(firstDate) + "-" + str(lastDate) + " first line " + dataLine + '\n')
222  borkRepork.close()
223  return returnList
224 
225 
226  if dateTime>returnList[1][moduleNumber]: #if time in right range, output.
227  returnList[3][moduleNumber]+=1
228  outputLine = moduleName + "_" + dataType + " " + str(dateTime) + " " + str( time.mktime(dateTime.timetuple()) ) + " " + str(data) + "\n"
229 
230  returnList[1][moduleNumber] = dateTime
231 
232  output.write(outputLine)
233 
234 
235 
236  position+=1
237 
238  output.close()
239 
240  except: #we failed at something, so print out an error message and run away screaming
241  returnList[2] = lastDate
242  print("Something broke :( \n")
243  print("Could be an error in data values of " + fileName + " for " + dataType + " borkDate " + str(returnList[2]) )
244  print("First line reads " + name + "\n")
245 
246  borkRepork = open(dataFolder+dataType+"BORKBORKBORK.txt",'w')
247  borkRepork.write("filename " + fileName + "date range " + str(firstDate) + "-" + str(lastDate) + " first line " + dataLine + '\n')
248  borkRepork.close()
249  print("Try running again... often this is an issue with the connection to eos")
250  return returnList
251 
252  return returnList
253 
254 

◆ findFiles()

def getIBLDate.findFiles (   searchFolderPath)

Definition at line 36 of file getIBLDate.py.

36 def findFiles (searchFolderPath): #find all files in searchFolderPath, return as list
37 
38  try:
39  os.chdir(searchFolderPath)
40  except IOError:
41  print('No entries in ' + searchFolderPath)
42  return -1
43 
44  todaysList=[]
45 
46  #SOMEHOW, this searches the search Folder and returns a list of contained files in well... files.
47  for src_dir, dirs, files in os.walk(searchFolderPath):
48  #i parse through the files, I think. For each, I check if there's a reference to it in the
49  #diary entry for the day. If not, I go ahead and append the figure to the relevent diary entry.
50  for file_ in files:
51  sortedFile = os.path.join(src_dir, file_)
52  todaysList.append(str(sortedFile))
53  #now we've got a list containing all files we want to add, sort it alphabetically and add them.
54  todaysList.sort()
55  return todaysList
56 
57 #Function that actually reads in data from fileName, saves it to... somewhere. Probably dataFolder/datatype/modulename.ssv . It also returns
58 #stuff like the most recent dates for all DCS groups (endDates), and number of datapoints found for each DCS group (tempDataNumbers).
59 #Probably says something if it can't read the data as well. Gonna be honest, DDV is a bit of a nightmare and I've spent too long messing
60 #around with it to remember what my bodges are.

◆ main()

def getIBLDate.main ( )

Definition at line 498 of file getIBLDate.py.

498 def main():
499 
500  thread1 = scanDataThread (1,'HV_VMeas' )
501  thread1.start()
502 
503  thread2 = scanDataThread (2,'PP4LV' )
504  thread2.start()
505 
506  thread3 = scanDataThread (3,'HV_IMeas' )
507  thread3.start()
508 
509  thread4 = scanDataThread (4,'TModule' )
510  thread4.start()
511 

◆ scanData()

def getIBLDate.scanData (   dataType)

Definition at line 255 of file getIBLDate.py.

255 def scanData (dataType):
256 
257  #home directory definition
258  fillerDate = datetime.datetime(2000,1,1,1,1,1,1)
259  tempDate = datetime.datetime(2000,1,1,1,1,1,1)
260  returnList =[fillerDate,fillerDate,fillerDate,False,"LI_S00_0_M0"]
261  # JENNET setsfile paths
262  homeDirectory = os.path.expanduser('/eos/atlas/user/j/jdickins/Pixel/LeakageCurrent/')
263 
264  #define path to folder
265  dataFolder = homeDirectory + "/IBLData/processedData/"
266  inputFolder = homeDirectory + "/IBLData/rawData/"+dataType+"/"
267  entriesFolder = homeDirectory + "/IBLData/rawData/entriesPerDay/" + dataType + "/"
268 
269  #make directories if they don't exist
270  if not os.path.exists(dataFolder+dataType):
271  os.mkdir(dataFolder+dataType)
272 
273  if not os.path.exists(entriesFolder):
274  os.mkdir(entriesFolder)
275 
276  #declare some stuff, so it's in scope when we need it
277  startingDates=[]
278  endDates=[]
279  filesProcessed=[]
280  dataPoints=[]
281  dailyPoints=[]
282  smallestEndDate=fillerDate
283 
284 
285  #This section checks to see if there's a file containing the dates we've worked up till.
286  if not os.path.exists(dataFolder+dataType+".txt"):
287 
288  #No dates file found, so create one.
289  print("No any file found! at " + dataFolder+dataType +" Making default values")
290  #set default max and min values for each sensor
291 
292  datesFile = open(dataFolder+dataType+".txt",'w')
293  firstTempDate = datetime.datetime(2015,5,1,0,0,0,0)
294  lastTempDate = datetime.datetime(2015,5,1,0,0,0,1)
295  smallestEndDate = lastTempDate
296 
297  for stave in range(1,15):
298  staveString = str(stave)
299  if stave<10:
300  staveString="0"+str(stave)
301  for side in ['A','C']:
302  for DCSGroup in range(1,5):
303  moduleName = 'LI_S' + str(staveString) + '_' + side + '_M' + str(DCSGroup)
304  datesFile.write(moduleName +" " + str(firstTempDate) + " " + str(lastTempDate) +" 0 0\n")
305  startingDates.append(firstTempDate)
306  endDates.append(lastTempDate)
307  filesProcessed.append(0)
308  dataPoints.append(0)
309  dailyPoints.append(0)
310 
311  datesFile.close()
312 
313  else: #dates file exists, so read dates for each DCS group
314  print("Found " + dataFolder+dataType+".txt")
315  datesFile = open(dataFolder+dataType+".txt",'r')
316 
317  holder=0
318 
319  for dateLine in datesFile: #read each line in, each line should correspond to one DCS group
320 
321  tempDatesLine = dateLine.split()
322  filesProcessed.append(int(tempDatesLine[5]) )
323  dataPoints.append( int( tempDatesLine[6]) )
324  dailyPoints.append(0)
325 
326  firstTemp = tempDatesLine[1].split('-')
327  lastTemp = tempDatesLine[3].split('-')
328 
329  firstTempTime = tempDatesLine[2].split(':')
330  lastTempTime = tempDatesLine[4].split(':')
331 
332  firstTempTimes = firstTempTime[2].split('.')
333  lastTempTimes = lastTempTime[2].split('.')
334 
335  if len(firstTempTimes)<2:
336  firstTempTimes.append(0)
337  if len(lastTempTimes)<2:
338  lastTempTimes.append(0)
339 
340  firstTempDate = datetime.datetime(int(firstTemp[0]), int(firstTemp[1]), int(firstTemp[2]), int(firstTempTime[0]),int(firstTempTime[1]), int(firstTempTimes[0]), int(firstTempTimes[1]))
341  lastTempDate = datetime.datetime(int(lastTemp[0]), int(lastTemp[1]), int(lastTemp[2]), int(lastTempTime[0]), int(lastTempTime[1]),int(lastTempTimes[0]), int(lastTempTimes[1]))
342 
343  startingDates.append(firstTempDate)
344  endDates.append(lastTempDate)
345 
346  if holder==0:
347  returnList[0] = firstTempDate
348  returnList[1] = lastTempDate
349  smallestEndDate=lastTempDate
350 
351 
352  else:
353  if firstTempDate<returnList[0]:
354  returnList[0] = firstTempDate
355  if lastTempDate>returnList[1]:
356  returnList[1] = lastTempDate
357  if lastTempDate < smallestEndDate:
358  smallestEndDate = lastTempDate
359 
360 
361  holder+=1
362 
363  datesFile.close()
364  print ("Investigating " + dataType + " from " + str(smallestEndDate))
365 
366 
367  holder = 0
368 
369  #call function to return list of all files in input folder
370  fileList = findFiles(inputFolder)
371 
372  firstTempDate = startingDates[0]
373  lastTempDate = endDates[0]
374  numberFiles = len(fileList)
375  fileNumber = 0
376 
377  #iterate through all files from file list, opening them if they're in the time period of interest.
378  for fileName in fileList:
379 
380 # print(fileName)
381 
382  end = len(fileName)
383  endDate1 = fileName[end-4:end]
384  endDate2 = fileName[end-7:end-6]
385 
386  if endDate1=='.txt' and endDate2=='_': #check file ends with text, and contains underscore in expected place; Could make this more rigorous
387 
388  tempDataNumber = 0
389  startDate = fileName[end-23:end-15]
390  endDate = fileName[end-12:end-4]
391  endDateSplit = endDate.split('_')
392  endDateFile = datetime.datetime(2000+int(endDateSplit[0]),int(endDateSplit[1]),int(endDateSplit[2]),0,0,0,1)
393 
394  startDateSplit = startDate.split('_')
395  startDateFile = datetime.datetime(2000+int(startDateSplit[0]),int(startDateSplit[1]),int(startDateSplit[2]),0,0,0,1)
396 
397  if endDateFile > smallestEndDate: #data from region of interest
398  #APPEND FILES DOING THINGS HERE
399 
400  lastTempDate = endDateFile
401  [firstTempDate,endDates,fillerDate,tempDataNumbers,smallestEndDate] = appendEntries(fileName,dataType,dataFolder,dailyPoints,endDates,startDateFile,endDateFile,fillerDate)
402  #append entries called here. Editing of data files done at that location.
403 
404  for i in range(0,112): #112 DCS groups for IBL, if you're doing something else, change that number.
405 
406  filesProcessed[i] +=1 #number of files
407  dataPoints[i]+=tempDataNumbers[i] #number of data points for each DCS group
408 
409  holderX=0
410 
411  #this does something. Probably recording number of data points per day for each DCS group
412  for stave in range(1,15):
413  staveString = str(stave)
414  if stave<10:
415  staveString="0"+str(stave)
416  for side in ['A','C']:
417  for DCSGroup in range(1,5):
418  moduleName = 'LI_S' + str(staveString) + '_' + side + '_M' + str(DCSGroup)
419  outName = entriesFolder + moduleName + ".txt"
420  dataLine = str(startDate) + " " + str(tempDataNumbers[holderX]) + "\n"
421  tempDataNumbers[holderX]=0
422 
423  if os.path.isfile(outName) == False:
424  output = open(outName,'w')
425  output.write(dataLine)
426  output.close()
427 
428  else:
429  output = open(outName,'a')
430  output.write(dataLine)
431  output.close()
432  holderX +=1
433 
434  #check if the list is bork-a-dorked. If borked, save and break
435  if returnList[2]!=fillerDate:
436  returnList[2] = fillerDate
437  datesFile = open(dataFolder+dataType+".txt",'w')
438  tempHolder=0
439  for stave in range(1,15):
440  staveString = str(stave)
441  if stave<10:
442  staveString="0"+str(stave)
443  for side in ['A','C']:
444  for DCSGroup in range(1,5):
445  moduleName = 'LI_S' + str(staveString) + '_' + side + '_M' + str(DCSGroup)
446  datesFile.write(moduleName +" " + str(startingDates[tempHolder]) + " " + str(endDates[tempHolder]) +" " + str(filesProcessed[tempHolder]) + " " + str ( dataPoints[tempHolder] ) + "\n")
447  tempHolder+=1
448 
449  datesFile.close()
450 
451 
452  return returnList
453 
454  sys.stdout.flush()
455  fileNumber+=1
456 
457  #open file, go through lists, if value < smallest, set to that,
458 
459  #if number bigger, set to that
460  #if any value smaller than previous largest value, bork bork!
461 
462  holder+=1
463 
464  datesFile = open(dataFolder+dataType+".txt",'w')
465  tempHolder=0
466  for staveX in range(1,15):
467  staveStringX = str(staveX)
468  if staveX<10:
469  staveStringX="0"+str(staveX)
470  for sideX in ['A','C']:
471  for DCSGroupX in range(1,5):
472 
473  moduleNameX = 'LI_S' + str(staveStringX) + '_' + sideX + '_M' + str(DCSGroupX)
474 
475  datesFile.write(moduleNameX +" " + str(startingDates[tempHolder]) + " " + str(endDates[tempHolder]) +" " + str(filesProcessed[tempHolder]) + " " + str ( dataPoints[tempHolder] ) +"\n")
476 
477  tempHolder+=1
478 
479  datesFile.close()
480  returnList[3]=True
481 
482  return returnList
483 

◆ sensorToNumber()

def getIBLDate.sensorToNumber (   stave,
  side,
  module 
)

Definition at line 28 of file getIBLDate.py.

28 def sensorToNumber (stave,side,module): #converts from IBL stave, senors and side to DCS group number (<112)
29 
30 
31  number = 8 * (int(stave)-1) + module
32  if side == 'C':
33  number+=4
34  return number-1
35 
getIBLDate.scanData
def scanData(dataType)
Definition: getIBLDate.py:255
getIBLDate.main
def main()
Definition: getIBLDate.py:498
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
getIBLDate.sensorToNumber
def sensorToNumber(stave, side, module)
Definition: getIBLDate.py:28
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
getIBLDate.findFiles
def findFiles(searchFolderPath)
Definition: getIBLDate.py:36
Trk::open
@ open
Definition: BinningType.h:40
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
str
Definition: BTagTrackIpAccessor.cxx:11
getIBLDate.appendEntries
def appendEntries(fileName, dataType, dataFolder, dateEntries, largestDates, firstDate, lastDate, borkDate)
Definition: getIBLDate.py:61
readCCLHist.float
float
Definition: readCCLHist.py:83
Trk::split
@ split
Definition: LayerMaterialProperties.h:38