'Add the ``CHECKSUM`` and ``DATASUM`` cards to this HDU with
the values set to the checksum calculated for the HDU and the
data respectively.  The addition of the ``DATASUM`` card may
be overridden.
Parameters
when : str, optional
comment string for the cards; by default the comments
will represent the time when the checksum was calculated
override_datasum : bool, optional
add the ``CHECKSUM`` card only
blocking : str, optional
"standard" or "nonstandard", compute sum 2880 bytes at a time, or
not
checksum_keyword : str, optional
The name of the header keyword to store the checksum value in; this
is typically \'CHECKSUM\' per convention, but there exist use cases
in which a different keyword should be used
datasum_keyword : str, optional
See ``checksum_keyword``
Notes
For testing purposes, first call `add_datasum` with a ``when``
argument, then call `add_checksum` with a ``when`` argument and
``override_datasum`` set to `True`.  This will provide consistent
comments for both cards and enable the generation of a ``CHECKSUM``
card with a consistent value.'

def add_checksum(self, when=None, override_datasum=False, blocking='standard', checksum_keyword='CHECKSUM', datasum_keyword='DATASUM'):

    if (not override_datasum):
        data_cs = self.add_datasum(when, blocking, datasum_keyword=datasum_keyword)
    else:
        data_cs = self._calculate_datasum(blocking)
    if (when is None):
        when = 'HDU    checksum    updated    {}'.format(self._get_timestamp())
    if (datasum_keyword in self._header):
        self._header.set(checksum_keyword, ('0' * 16), when, before=datasum_keyword)
    else:
        self._header.set(checksum_keyword, ('0' * 16), when)
    csum = self._calculate_checksum(data_cs, blocking, checksum_keyword=checksum_keyword)
    self._header[checksum_keyword] = csum
