B
    ѥ^                 @   sz   d Z ddlZddlmZ ddlZddlZddlZyddl	Z
W n& ek
rb   ddlm  mZ
 Y nX dZG dd dZdS )
    Nz./odomc               @   sJ   e Zd ZddgZdd ZdddZddd	Zd
d Zdd ZdddZ	dS )FitsBuilderZSIMIMGc             C   s0   || _ t|st| i | _g | _i | _dS )z
        Builder. Maintains a list of (1) protoimages (i.e.  pixels +
        info read from the camera) and (2) meta-data collected from
        the XML-RPC servers, to be merged into a single header.
        N)
output_diropisdirosmakedirsheaderspixelstables)selfr    r   ,/home/dice/stardice/scheduler/fitsbuilder.py__init__   s    

zFitsBuilder.__init__ c                s   t |t dkrdS t |tkrjt| t|  }} fdd|D }| jttt|| nBt |tkrx4|D ]"}t|d | j |d   < q|W nt	ddS )aU  
        Append a header element.
        
        Parameters:
        -----------
          - hdr_element [dict of list]: hdr_element to append 
                        this is either a dict or a list of lists 
                        (cf Led XMLRPC server)
          - suffix, prefix [str]: suffix or prefix added to the dict keys
        Nc                s   g | ]} |  qS r   r   ).0k)prefixsuffixr   r   
<listcomp>3   s    z&FitsBuilder.append.<locals>.<listcomp>   r   zshould be either dict or list)
typedictlistkeysvaluesr
   updatezipstr
ValueError)r   Zhdr_elementr   r   r   valsZhdr_elr   )r   r   r   append$   s    
$zFitsBuilder.appendc       	      K   s   t |t dkrdS |tjkr*td| tj }tj|}|	 }|j
|d< |j|d< ||d< x$t| D ]\}}||| < qrW y
|d= W n   Y nX | j| dS )zI
        Append a new image to our internal proto_exposure list.
        Nzunknown exposure type: %rzDATE-OBSzMJD-OBSEXPTYPEshape)r   r   EXPTYPESr    datetimeutcnowastropytimeTimecopyfitsZmjdr   itemsupperr   r"   )	r   dataZexptypekw	timestampZastropytimeZmy_datar   vr   r   r   	add_image;   s"    




zFitsBuilder.add_imagec             C   s   || j |< d S )N)r   )r   	tablenamer/   r   r   r   	add_tableW   s    zFitsBuilder.add_tablec             C   s,   d}|d|d  7 }d| }||7 }|d S )z@
        filename [str]: name of the file to be written
        r   z%s_r#   z%07dz.fitsr   )r   ZhdrZodoretsr   r   r   generate_filenameZ   s
    zFitsBuilder.generate_filenameNc          	   C   s  |dkr| j }tttt| j t| j }tt	j
| j dd}t| j| W dQ R X d}ttrtttd }d}t| jdkr(t| jdkr(t|}||dd ttj|d	}x(| jD ]}|tj| j| |d
 qW |t	j | || }|| |d7 }x| jD ]}	|	d }
|	d= tttt|	 t|	 }|d|i || ttj||
d}| jrx*| jD ] }|tj| j| |d
 qW |t	j | || }|| |d7 }q0W ttd}|t| |   |S )zG
        Dump all the exposures in the internal exposure list.
        Nzheaders.pklabr   rr   ZNOIMG)EXPNUMr#   )header)r/   namer   r   r;   )r<   r/   zw+)!r   pfZHeaderr   r   r
   r   r   openr   pathjoinpickledumpr   isfileOdometerFilenameintreadlenr   r   r   ZHDUListZ
PrimaryHDUr"   ZTableHDUsepr8   Zwritetowriter   close)r   r   Zcommon_headerfidZcurOdomfilenamehhZhdulr4   pZpixZoutOdomFiler   r   r   rC   h   sF    (
 

$
 

zFitsBuilder.dump)r   r   )r   )N)
__name__
__module____qualname__r%   r   r"   r3   r5   r8   rC   r   r   r   r   r      s   

r   )__doc__r   os.pathr@   r   r&   Zastropy.timer(   rB   pyfitsr>   ImportErrorastropy.io.fitsior,   rE   r   r   r   r   r   <module>   s   