LSSTApplications  17.0+11,17.0+34,17.0+56,17.0+57,17.0+59,17.0+7,17.0-1-g377950a+33,17.0.1-1-g114240f+2,17.0.1-1-g4d4fbc4+28,17.0.1-1-g55520dc+49,17.0.1-1-g5f4ed7e+52,17.0.1-1-g6dd7d69+17,17.0.1-1-g8de6c91+11,17.0.1-1-gb9095d2+7,17.0.1-1-ge9fec5e+5,17.0.1-1-gf4e0155+55,17.0.1-1-gfc65f5f+50,17.0.1-1-gfc6fb1f+20,17.0.1-10-g87f9f3f+1,17.0.1-11-ge9de802+16,17.0.1-16-ga14f7d5c+4,17.0.1-17-gc79d625+1,17.0.1-17-gdae4c4a+8,17.0.1-2-g26618f5+29,17.0.1-2-g54f2ebc+9,17.0.1-2-gf403422+1,17.0.1-20-g2ca2f74+6,17.0.1-23-gf3eadeb7+1,17.0.1-3-g7e86b59+39,17.0.1-3-gb5ca14a,17.0.1-3-gd08d533+40,17.0.1-30-g596af8797,17.0.1-4-g59d126d+4,17.0.1-4-gc69c472+5,17.0.1-6-g5afd9b9+4,17.0.1-7-g35889ee+1,17.0.1-7-gc7c8782+18,17.0.1-9-gc4bbfb2+3,w.2019.22
LSSTDataManagementBasePackage
checksum.py
Go to the documentation of this file.
1 from __future__ import absolute_import, division, print_function
2 
3 from future import standard_library
4 standard_library.install_aliases() # noqa future needs this here
5 
6 import hashlib
7 import zlib
8 import pickle
9 
10 import lsst.afw.image as afwImage
11 
12 __all__ = ["checksum", ]
13 
14 # Image types to support
15 exposureTypes = (afwImage.ExposureF, afwImage.ExposureD,)
16 maskedImageTypes = (afwImage.MaskedImageF, afwImage.MaskedImageD,)
17 decoratedImageTypes = (afwImage.DecoratedImageF, afwImage.DecoratedImageD,)
18 imageTypes = (afwImage.ImageF, afwImage.ImageD, afwImage.ImageI,)
19 
20 PROTOCOL = 2 # Pickling protocol
21 
22 # Functions for creating the checksum
23 sumFunctions = {
24  "CRC32": lambda obj: zlib.crc32(pickle.dumps(obj, PROTOCOL)),
25  "MD5": lambda obj: hashlib.md5(pickle.dumps(obj, PROTOCOL)).hexdigest(),
26 }
27 
28 
29 def checksum(obj, header=None, sumType="MD5"):
30  """!Calculate a checksum of an object
31 
32  We have special handling for images (e.g., breaking a MaskedImage into
33  its various components), but the object may be any picklable type.
34 
35  @param obj Object for which to calculate the checksum
36  @param header FITS header (PropertyList) to update with checksum values, or None
37  @param sumType Type of checksum to calculate
38  @return dict with header keyword,value pairs
39  """
40  assert sumType in sumFunctions, "Unknown sumType: %s" % (sumType,)
41  func = sumFunctions[sumType]
42 
43  results = {}
44 
45  if isinstance(obj, exposureTypes):
46  obj = obj.getMaskedImage()
47  if isinstance(obj, decoratedImageTypes):
48  obj = obj.getImage()
49 
50  if isinstance(obj, maskedImageTypes):
51  results[sumType + "_IMAGE"] = func(obj.getImage())
52  results[sumType + "_MASK"] = func(obj.getMask())
53  results[sumType + "_VARIANCE"] = func(obj.getVariance())
54  elif isinstance(obj, imageTypes):
55  results[sumType + "_IMAGE"] = func(obj)
56  else:
57  results[sumType] = func(obj)
58 
59  if header is not None:
60  for k, v in results.items():
61  header.add(k, v)
62 
63  return results
def checksum(obj, header=None, sumType="MD5")
Calculate a checksum of an object.
Definition: checksum.py:29
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...