ó
Ñ¥^c           @   s˜   d  Z  d d l Z d d l j Z d d l Z d d l Z d d l Z y d d l	 Z
 Wn# e k
 rz d d l j j Z
 n Xd Z d d d „  ƒ  YZ d S(   t   
iÿÿÿÿNs   ./odomt   FitsBuilderc           B   sV   e  Z d  d g Z d „  Z d d d „ Z d d „ Z d „  Z d „  Z d	 d „ Z	 RS(
   t   SIMt   IMGc         C   sG   | |  _  t j | ƒ s( t j | ƒ n  i  |  _ g  |  _ i  |  _ d S(   sÒ   
        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(   t
   output_dirt   opt   isdirt   ost   makedirst   headerst   pixelst   tables(   t   selfR   (    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyt   __init__   s    			t    c         C   sõ   t  | ƒ t  d ƒ k r d St  | ƒ t k rœ t | j ƒ  ƒ t | j ƒ  ƒ } } g  | D] } | | | ^ qZ } |  j j t t t | | ƒ ƒ ƒ ƒ nU t  | ƒ t k rå x@ | D]) } t	 | d ƒ |  j | | d | <qµ Wn t
 d ƒ ‚ d S(   sU  
        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
        Ni   i    s   should be either dict or list(   t   typet   Nonet   dictt   listt   keyst   valuesR	   t   updatet   zipt   strt
   ValueError(   R   t   hdr_elementt   suffixt   prefixR   t   valst   kt   hdr_el(    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyt   append$   s    %!(*c   	      K   së   t  | ƒ t  d ƒ k r d S| t j k r> t d | ƒ ‚ n  t j j ƒ  } t j j	 | ƒ } | j
 ƒ  } | j | d <| j | d <| | d <x0 t | j ƒ  ƒ D] \ } } | | | j ƒ  <q¢ Wy | d =Wn n X|  j j | ƒ d S(   sI   
        Append a new image to our internal proto_exposure list.
        Ns   unknown exposure type: %rs   DATE-OBSs   MJD-OBSt   EXPTYPEt   shape(   R   R   R   t   EXPTYPESR   t   datetimet   utcnowt   astropyt   timet   Timet   copyt   fitst   mjdR   t   itemst   upperR
   R   (	   R   t   datat   exptypet   kwt	   timestampt   astropytimet   my_dataR   t   v(    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyt	   add_image;   s"    
c         C   s   | |  j  | <d  S(   N(   R   (   R   t	   tablenameR-   (    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyt	   add_tableW   s    c         C   s4   d } | d | d 7} d | } | | 7} | d S(   s@   
        filename [str]: name of the file to be written
        R   s   %s_R    s   %07ds   .fits(    (   R   t   hdrt   odot   rett   s(    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyt   generate_filenameZ   s
    

c      	   C   sñ  | d k r |  j } n  t j t t t |  j j ƒ  ƒ t |  j j ƒ  ƒ ƒ ƒ ƒ } t	 t
 j j |  j d ƒ d ƒ  } t j |  j | ƒ Wd QXd } t j t ƒ rÄ t t	 t d ƒ j ƒ  ƒ } n  d } t |  j ƒ d k rªt |  j ƒ d k rªt j | ƒ } | j i | d 6d d	 6ƒ t j t j d
 | ƒ ƒ } x7 |  j D], } | j t j d |  j | d | ƒ ƒ qCW| t
 j |  j | | ƒ } | j | ƒ | d 7} n  x|  j D]	}	 |	 d }
 |	 d =t j t t t |	 j ƒ  ƒ t |	 j ƒ  ƒ ƒ ƒ ƒ } | j i | d 6ƒ | j | ƒ t j t j d
 | d |
 ƒ ƒ } |  j r‰x: |  j D], } | j t j d |  j | d | ƒ ƒ qVWn  | t
 j |  j | | ƒ } | j | ƒ | d 7} q´Wt	 t d ƒ } | j t  | ƒ ƒ | j! ƒ  | S(   sG   
        Dump all the exposures in the internal exposure list.
        s   headers.pklt   abNi    t   rR   t   EXPNUMt   NOIMGR    t   headerR-   t   namei   R
   s   w+("   R   R   t   pft   HeaderR   R   R	   R   R   t   openR   t   patht   joint   picklet   dumpR   t   isfilet   OdometerFilenamet   intt   readt   lenR
   R   R   t   HDUListt
   PrimaryHDUR   t   TableHDUt   sepR;   t   writetot   writeR   t   close(   R   R   t   common_headert   fidt   curOdomt   filenamet   hht   hdulR5   t   pt   pixt   outOdomFile(    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyRH   h   sF    <$**
6!	-
N(
   t   __name__t
   __module__R"   R   R   R4   R6   R;   R   RH   (    (    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyR      s   			(    (   t   __doc__R   t   os.pathRE   R   R#   t   astropy.timeR%   RG   t   pyfitsRB   t   ImportErrort   astropy.io.fitst   ioR)   RJ   R   (    (    (    s,   /home/dice/stardice/scheduler/fitsbuilder.pyt   <module>   s   