Coverage for python/lsst/afw/fits/_pickleFits.py: 22%

19 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-02-22 03:22 -0800

1# This file is part of afw. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (https://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 <https://www.gnu.org/licenses/>. 

21 

22from lsst.afw.fits import MemFileManager, ImageWriteOptions, ImageCompressionOptions 

23 

24import lsst.afw.table 

25import lsst.afw.image 

26 

27 

28def reduceToFits(obj): 

29 """Pickle to FITS 

30 

31 Intended to be used by the ``__reduce__`` method of a class. 

32 

33 Parameters 

34 ---------- 

35 obj 

36 any object with a ``writeFits`` method taking a 

37 `~lsst.afw.fits.MemFileManager` and possibly an 

38 `~lsst.afw.fits.ImageWriteOptions`. 

39 

40 Returns 

41 ------- 

42 reduced : `tuple` [callable, `tuple`] 

43 a tuple in the format returned by `~object.__reduce__` 

44 """ 

45 manager = MemFileManager() 

46 options = ImageWriteOptions(ImageCompressionOptions(ImageCompressionOptions.NONE)) 

47 table = getattr(obj, 'table', None) 

48 if isinstance(table, lsst.afw.table.BaseTable): 

49 # table objects don't take `options` 

50 obj.writeFits(manager) 

51 else: 

52 # MaskedImage and Exposure both require options for each plane (image, mask, variance) 

53 if isinstance(obj, (lsst.afw.image.MaskedImage, lsst.afw.image.Exposure)): 

54 obj.writeFits(manager, options, options, options) 

55 else: 

56 obj.writeFits(manager, options) 

57 size = manager.getLength() 

58 data = manager.getData() 

59 return (unreduceFromFits, (obj.__class__, data, size)) 

60 

61 

62def unreduceFromFits(cls, data, size): 

63 """Unpickle from FITS 

64 

65 Unpack data produced by `reduceToFits`. This method is used by the 

66 pickling framework and should not need to be called from user code. 

67 

68 Parameters 

69 ---------- 

70 cls : `type` 

71 the class of object to unpickle. Must have a class-level ``readFits`` 

72 method taking a `~lsst.afw.fits.MemFileManager`. 

73 data : `bytes` 

74 an in-memory representation of the object, compatible with 

75 `~lsst.afw.fits.MemFileManager` 

76 size : `int` 

77 the length of `data` 

78 

79 Returns 

80 ------- 

81 unpickled : ``cls`` 

82 the object represented by ``data`` 

83 """ 

84 manager = MemFileManager(size) 

85 manager.setData(data, size) 

86 return cls.readFits(manager)