CalibrationHandle.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import time
  2. import os
  3. import math
  4. import numpy as np
  5. import h5py
  6. import traceback
  7. import datetime
  8. class CalibrationHandle(object):
  9. """docstring for CalibrationHandle
  10. This Class Handles the CalibrationFiles.
  11. ! You may not make your own instance !
  12. There is one called 'theCalibration' so just use:
  13. 'from CalibrationHandle import theCalibration'
  14. """
  15. def __init__(self):
  16. super(CalibrationHandle, self).__init__()
  17. self.fileHandle = None
  18. self.calibrationFile = ""
  19. self.HandleList = {}
  20. def openFile(self, calibrationFile, force=False, write=False):
  21. """
  22. opens a Calibration File
  23. :param calibartionFile: filename
  24. :param force: default False - a already opened file will not be opened again. set True to force reopnening.
  25. :param write: default False - for internal use only
  26. """
  27. if self.calibrationFile == calibrationFile and not force and self.fileHandle is not None:
  28. return calibrationFile
  29. if calibrationFile in self.HandleList.keys():
  30. self.calibrationFile = calibrationFile
  31. self.fileHandle = self.HandleList[calibrationFile]
  32. if force:
  33. self.fileHandle.close()
  34. else:
  35. return calibrationFile
  36. if os.path.isfile(calibrationFile):
  37. try:
  38. self.fileHandle = h5py.File(calibrationFile, 'r+' if write else 'r')
  39. self.grpX = self.fileHandle['x']
  40. self.grpY = self.fileHandle['y']
  41. self.calibrationFile = calibrationFile
  42. self.HandleList[self.calibrationFile] = self.fileHandle
  43. return calibrationFile
  44. #self.HandleList["current"] = self.fileHandle
  45. except:
  46. print('error opening file "{}"'.format(calibrationFile))
  47. #self.fileHandle = None
  48. else:
  49. print('file "{}" not found'.format(calibrationFile))
  50. #self.fileHandle = None
  51. return 'None'
  52. return 'current'
  53. def setHandle(self, name='current'):
  54. if name == "None":
  55. return
  56. if len(self.HandleList.keys()) == 0:
  57. raise Exception('No Calibration File Opened!')
  58. if name in self.HandleList.keys() and name != "current":
  59. self.calibrationFile = name
  60. self.fileHandle = self.HandleList[name]
  61. self.grpX = self.fileHandle['x']
  62. self.grpY = self.fileHandle['y']
  63. #self.HandleList["current"] = self.fileHandle
  64. elif name != "current":
  65. self.openFile(name)
  66. def reload(self):
  67. if self.calibrationFile != "":
  68. self.openFile(self.calibrationFile, force=True)
  69. def closeHandle(self, name):
  70. if name in self.HandleList.keys() and name != "current":
  71. self.setHandle(name)
  72. self.fileHandle.close()
  73. self.HandleList.pop(name)
  74. if len(self.HandleList):
  75. self.setHandle(list(self.HandleList.keys())[0])
  76. def getCalibrationValues(self, id='current'):
  77. if id == 'None':
  78. out = []
  79. for adc in range(8):
  80. popt = [2048.0, 1.0]
  81. out.extend(popt)
  82. return np.array(out)
  83. self.setHandle(id)
  84. out = []
  85. for adc in range(8):
  86. try:
  87. popt = self.grpY[str(adc)][0]
  88. except:
  89. popt = [2048.0, 1.0]
  90. out.extend(popt)
  91. return np.array(out)
  92. def getSigma(self, id='current'):
  93. if id == 'None':
  94. return 34
  95. self.setHandle(id)
  96. try:
  97. return self.fileHandle['info']['Sigma']
  98. except:
  99. return 34
  100. def calibrateY(self, data, adc, id='current'):
  101. self.setHandle(id)
  102. if (self.fileHandle is None) or (id =='None'):
  103. return data
  104. popt = self.grpY[str(adc)][0]
  105. return (data-popt[0])/(popt[1])#-popt[0])
  106. def calibrateX(self, adc, c330, c25, f, c25b=4, id='current'):
  107. self.setHandle(id)
  108. if (self.fileHandle is None) or (id == 'None'):
  109. cascade=0
  110. if adc < 4:
  111. cascade = (c25b-4)*25
  112. return (c330*330 + c25*25 + f*3 + cascade)*1e-12
  113. try:
  114. return self.grpX['map'][int(adc)][int(c330)][int(c25)][int(f)][int(c25b)] + self.grpX[str(adc)]['offset'][()]
  115. except:
  116. #print('error reading Map')
  117. #traceback.print_exc()
  118. cascade=0
  119. if adc < 4:
  120. cascade = (c25b-4)*25
  121. return (c330*330 + c25*25 + f*3 + cascade)*1e-12
  122. def correctorX(self, adc, c330, c25, f, c25b=4, id='current'):
  123. self.setHandle(id)
  124. if (self.fileHandle is None) or (id =='None'):
  125. return 0
  126. try:
  127. corr= (self.grpX[str(adc)]['330'][c330] +
  128. self.grpX[str(adc)]['25'][c25] +
  129. self.grpX[str(adc)]['3'][f])
  130. if adc < 4:
  131. corr += self.grpX[str(adc)]['25b'][c25b]
  132. corr = corr*1e-12
  133. corr += self.grpX[str(adc)]['offset']
  134. return corr
  135. except:
  136. traceback.print_exc()
  137. return 0
  138. def _calibrateX(self, adc, c330, c25, f, c25b=4, id='current'):
  139. self.setHandle(id)
  140. if (self.fileHandle is None) or (id =='None'):
  141. return c330*330 + c25*25 + f*3
  142. x = c330*self.grpX['d330'] + c25*self.grpX['d25'] + f*self.grpX['d3']
  143. if adc < 4:
  144. x -= (c25b - self.grpX['d25b_zero'][()]) * self.grpX['d25b']
  145. x = x*1e-12
  146. x += self.correctorX(adc, c330, c25, f, c25b)
  147. return x
  148. theCalibration = CalibrationHandle()