Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# This file is part of cp_pipe. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (http://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

8# 

9# This program is free software: you can redistribute it and/or modify 

10# it under the terms of the GNU General Public License as published by 

11# the Free Software Foundation, either version 3 of the License, or 

12# (at your option) any later version. 

13# 

14# This program is distributed in the hope that it will be useful, 

15# but WITHOUT ANY WARRANTY; without even the implied warranty of 

16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

17# GNU General Public License for more details. 

18# 

19# You should have received a copy of the GNU General Public License 

20# along with this program. If not, see <http://www.gnu.org/licenses/>. 

21 

22__all__ = ('PhotodiodeData', 'getBOTphotodiodeData') 

23 

24import os 

25import numpy as np 

26 

27import lsst.log as lsstLog 

28 

29 

30def getBOTphotodiodeData(dataRef, dataPath='/project/shared/BOT/_parent/raw/photodiode_data/', 

31 logger=None): 

32 """Get the photodiode data associated with a BOT dataRef. 

33 

34 This is a temporary Gen2-only interface to the photodiode readings from 

35 the SLAC Run3 datasets onwards. 

36 

37 Parameters 

38 ---------- 

39 dataRef : `lsst.daf.persistence.ButlerDataRef` 

40 dataRef of the of the detector/visit to load the data for. 

41 

42 dataPath : `str`, optional 

43 Path at which to find the corresponding photodiode data files. 

44 

45 logger : `lsst.log.Log`, optional 

46 Logger for logging warnings. 

47 

48 

49 Returns 

50 ------- 

51 photodiodeData : `lsst.cp.pipe.photodiode.PhotodiodeData` or `None` 

52 The full time-series of the photodiode readings, with methods to 

53 integrate the photocharge, or None if the expected file isn't found. 

54 

55 """ 

56 if logger is None: 

57 logger = lsstLog.Log.getDefaultLogger() 

58 

59 def getKeyFromDataId(dataRef, key): 

60 if key in dataRef.dataId: 

61 return dataRef.dataId[key] 

62 else: 

63 result = dataRef.getButler().queryMetadata('raw', key, dataRef.dataId) 

64 assert len(result) == 1, f"Failed to find unique value for {key} with {dataRef.dataId}" 

65 return result[0] 

66 

67 dayObs = getKeyFromDataId(dataRef, 'dayObs') 

68 seqNum = getKeyFromDataId(dataRef, 'seqNum') 

69 

70 filePattern = 'Photodiode_Readings_%s_%06d.txt' 

71 

72 dayObsAsNumber = dayObs.replace('-', '') 

73 diodeFilename = os.path.join(dataPath, filePattern % (dayObsAsNumber, seqNum)) 

74 

75 if not os.path.exists(diodeFilename): 

76 logger.warn(f"Failed to find the photodiode data at {diodeFilename}") 

77 return None 

78 

79 try: 

80 photodiodeData = PhotodiodeData(diodeFilename) 

81 return photodiodeData 

82 except Exception: 

83 logger.warn(f"Photodiode data found at {diodeFilename} but failed to load.") 

84 return None 

85 

86 

87class PhotodiodeData(): 

88 def __init__(self, filename): 

89 self.times, self.values = np.loadtxt(filename, unpack=True) 

90 return 

91 

92 def getCharge(self, subtractBaseline=False): 

93 if subtractBaseline: 

94 raise NotImplementedError 

95 

96 charge = 0 

97 for i, (time, current) in enumerate(zip(self.times[:-1], self.values[:-1])): 

98 timestep = self.times[i+1] - time 

99 averageCurrent = (self.values[i+1] + current) / 2. 

100 charge += averageCurrent * timestep 

101 return charge