U
    e»{j•  ã                   @   sŒ   d Z ddlZddlZddlZddlZddlmZ ddlmZ e 	d¡Z
d ¡ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zddd„ZdS )aó  
``fitscheck`` is a command line script based on astropy.io.fits for verifying
and updating the CHECKSUM and DATASUM keywords of .fits files.  ``fitscheck``
can also detect and often fix other FITS standards violations.  ``fitscheck``
facilitates re-writing the non-standard checksums originally generated by
astropy.io.fits with standard checksums which will interoperate with CFITSIO.

``fitscheck`` will refuse to write new checksums if the checksum keywords are
missing or their values are bad.  Use ``--force`` to write new checksums
regardless of whether or not they currently exist or pass.  Use
``--ignore-missing`` to tolerate missing checksum keywords without comment.

Example uses of fitscheck:

1. Add checksums::

    $ fitscheck --write *.fits

2. Write new checksums, even if existing checksums are bad or missing::

    $ fitscheck --write --force *.fits

3. Verify standard checksums and FITS compliance without changing the files::

    $ fitscheck --compliance *.fits

4. Only check and fix compliance problems,  ignoring checksums::

    $ fitscheck --checksum none --compliance --write *.fits

5. Verify standard interoperable checksums::

    $ fitscheck *.fits

6. Delete checksum keywords::

    $ fitscheck --checksum remove --write *.fits

é    N)Ú__version__)ÚfitsZ	fitscheckag  
e.g. fitscheck example.fits

Verifies and optionally re-writes the CHECKSUM and DATASUM keywords
for a .fits file.
Optionally detects and fixes FITS standard compliance problems.

This script is part of the Astropy package. See
https://docs.astropy.org/en/latest/io/fits/usage/scripts.html#module-astropy.io.fits.scripts.fitscheck
for further documentation.
c                 C   s  t | ƒsdg} tjttjd�}|jdddt› �d� |jddd	d
d� |jddddddgddd� |jddddddd� |jddddddd� |jdd d!d"ddd� |jd#d$d%d&ddd� |jd'd(d)d*ddd� | | ¡atj	dkrìdt_	n*tj	dkrþd+t_	ntj	dk�rd+t_
d+t_tjS ),Nz-h)ÚdescriptionÚformatter_classz	--versionÚversionz	%(prog)s )Úactionr   Ú
fits_filesÚfileú+z.fits files to process.)ÚmetavarÚnargsÚhelpz-kz
--checksumÚchecksum_kindÚstandardÚremoveÚnonez6Choose FITS checksum mode or none.  Defaults standard.)ÚdestÚchoicesr   Údefaultz-wz--writeÚ
write_filez6Write out file checksums and/or FITS compliance fixes.FÚ
store_true)r   r   r   r   z-fz--forceÚforcez1Do file update even if original checksum was bad.z-cz--complianceÚ
compliancez-Do FITS compliance checking; fix if possible.z-iz--ignore-missingÚignore_missingzIgnore missing checksums.z-vz	--verboseÚverbosezGenerate extra output.T)ÚlenÚargparseÚArgumentParserÚDESCRIPTIONÚRawDescriptionHelpFormatterÚadd_argumentr   Ú
parse_argsÚOPTIONSr   r   r   r   )ÚargsÚparser© r%   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/fits/scripts/fitscheck.pyÚhandle_optionsB   s”     ÿ  ÿ   ÿú	ú	ú	ú	ú	ú



r'   c                  C   sP   t j ¡  tjrt  tj¡ nt  tj¡ t 	¡ } |  
t d¡¡ t  | ¡ d S )Nz%(message)s)ÚlogÚhandlersÚclearr"   r   ÚsetLevelÚloggingÚINFOÚWARNINGÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)Úhandlerr%   r%   r&   Úsetup_logging–   s    
r4   c              
   C   s  t jdd��¨}t  d¡ tj| tjd��‚}t|ƒD ]r\}}tjs2|j	srt
 d | |¡¡  W 5 Q R £ W 5 Q R £ dS |js2t
 d | |¡¡  W 5 Q R £ W 5 Q R £ dS q2W 5 Q R X W 5 Q R X |D ].}t|jƒ d¡r¾t
 d	| t|jƒ¡  dS q¾t
 d
| ›�¡ dS )zR
    Prints a message if any HDU in `filename` has a bad checksum or datasum.
    T)ÚrecordÚalways)Úchecksumz-MISSING {!r} .. Checksum not found in HDU #{}é   z,MISSING {!r} .. Datasum not found in HDU #{})zChecksum verification failedzDatasum verification failedz	BAD %r %szOK r   )ÚwarningsÚcatch_warningsÚsimplefilterr   Úopenr"   r   Ú	enumerater   Z	_checksumr(   ÚwarningÚformatZ_datasumÚstrÚmessageÚ
startswithÚinfo)ÚfilenameZwlistÚhdulistÚiZhduÚwr%   r%   r&   Úverify_checksums£   s:    
 ÿÿ ÿÿ0
ÿrH   c                 C   sx   t  | ¡�d}z| d¡ W nN t jk
rh } z.t d| t|ƒ dd¡¡ W Y ¢W 5 Q R £ dS d}~X Y nX W 5 Q R X dS )z#Check for FITS standard compliance.Ú	exceptionzNONCOMPLIANT %r .. %sÚ
ú r8   Nr   )r   r<   ÚverifyZVerifyErrorr(   r>   r@   Úreplace)rD   rE   Úexcr%   r%   r&   Úverify_complianceÈ   s    ,rO   c              
   C   sZ   t jr
dnd}t ¡ �: t ¡  tj| dt jdd��}|j|d� W 5 Q R X W 5 Q R X dS )zœ
    Sets the ``CHECKSUM`` and ``DATASUM`` keywords for each HDU of `filename`.

    Also updates fixes standards violations if possible and requested.
    Z	silentfixÚignoreTÚupdate)Zdo_not_scale_image_datar7   Úmode)Úoutput_verifyN)	r"   r   r9   r:   Úresetwarningsr   r<   r   Úflush)rD   rS   rE   r%   r%   r&   rQ   Ô   s    
ürQ   c              
   C   s†   zBt | ƒ}tjrt| ƒ}nd}tjr,|dks2tjr:t| ƒ || W S  tk
r€ } z t 	d| ›d|› �¡ W Y ¢dS d}~X Y nX dS )za
    Handle a single .fits file,  returning the count of checksum and compliance
    errors.
    r   z
EXCEPTION z .. r8   N)
rH   r"   r   rO   r   r   rQ   Ú	Exceptionr(   Úerror)rD   Zchecksum_errorsZcompliance_errorsÚer%   r%   r&   Úprocess_fileí   s    

rY   c                 C   sV   d}t | ptjdd… ƒ}tƒ  |D ]}|t|ƒ7 }q$|rJt |› d�¡ tt|ƒƒS )zš
    Processes command line parameters into options and files,  then checks
    or update FITS DATASUM and CHECKSUM keywords for the specified files.
    r   r8   Nz errors)	r'   ÚsysÚargvr4   rY   r(   r>   ÚintÚbool)r#   Úerrorsr   rD   r%   r%   r&   Úmain  s    r_   )N)Ú__doc__r   r,   rZ   r9   Zastropyr   Z
astropy.ior   Ú	getLoggerr(   Ústripr   r'   r4   rH   rO   rQ   rY   r_   r%   r%   r%   r&   Ú<module>   s   )
T%