ó
ë™xTc           @   s‘  d  Z  d d l m Z d d l Z d d l Z d d l 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 Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d d d e d „ Z d S(   sá   
Generic module to provide parallel job execution on queuing systems

Provides drop-in replacement classes to those defined in the multiprocessing
module (Queue and Job), with certain restrictions placed by the pickle module
iÿÿÿÿ(   t   divisionN(   t   Emptyt   InstantTimeoutc           B   s   e  Z d  Z d „  Z RS(   s   
  Timeout immediately
  c         C   s   t  d ‚ d  S(   Ns   No data found in queue(   t   QueueEmptyException(   t   selft   waittime(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   delay   s    (   t   __name__t
   __module__t   __doc__R   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR      s   t   TimedTimeoutc           B   s    e  Z d  Z d „  Z d „  Z RS(   s   
  Timeout after given time
  c         C   s   | |  _  d  S(   N(   t	   max_delay(   R   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   __init__$   s    c         C   s;   | |  j  k r. |  j  | 8_  t j | ƒ n	 t d ‚ d  S(   Ns%   No data found in queue within timeout(   R   t   timet   sleepR   (   R   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   )   s    (   R   R   R	   R   R   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR
      s   	t	   NoTimeoutc           B   s   e  Z d  Z d „  Z RS(   s   
  No timeout
  c         C   s   t  j | ƒ d  S(   N(   R   R   (   R   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   8   s    (   R   R   R	   R   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   3   s   t   Queuec           B   sG   e  Z d  Z d Z d „  Z d „  Z e d d „ Z d „  Z	 d „  Z
 RS(   sÖ   
  Queue object to receive data from jobs running on remote machines

  Data transfer is achieved via files. It is safe to use any number of
  Queue objects in the same directory, even with a matching identifier
  gš™™™™™¹?c         C   s>   d | t  j ƒ  t |  ƒ f |  _ t j ƒ  |  _ g  |  _ d  S(   Ns   %s_%d_%d(   t   ost   getpidt   idt   roott	   itertoolst   countt   waiting(   R   t
   identifier(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   G   s    "c         C   s¤   |  j  j ƒ  } d |  j | f } t j j | ƒ s; t ‚ t | d ƒ } t j	 | | ƒ | j
 ƒ  d |  j | f } t j j | ƒ s� t ‚ t j | | ƒ d  S(   Ns	   %s.%d.tmpt   wbs   %s.%d(   R   t   nextR   R   t   patht   existst   AssertionErrort   opent   picklet   dumpt   closet   rename(   R   t   objt   indext   tmp_namet   ofilet   target_name(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   putN   s    
c         C   s°   | s t  ƒ  } n' | d  k	 r0 t d | ƒ } n	 t ƒ  } x9 t rt |  j ƒ  } | d  k	 r^ Pn  | j d |  j ƒ q< W| d  k	 s‡ t ‚ t	 j
 t | d ƒ ƒ } t j | ƒ | S(   NR   R   t   rb(   R   t   NoneR
   R   t   TrueR   R   t   WAITTIMER   R   t   loadR   R   t   remove(   R   t   blockt   timeoutt	   predicatet   fnamet   data(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   get\   s    		c         C   sC   |  j  s |  j ƒ  n  y |  j  j d ƒ SWn t k
 r> d  SXd  S(   Ni    (   R   t   read_waitingt   popt
   IndexErrorR*   (   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   v   s    	c         C   sÊ   g  } xŠ t  j  d |  j ƒ D]r } | d d k r9 q n  t j j | ƒ \ } } y t | d ƒ } Wn t k
 r{ q n X| j | | f ƒ q W| j d d „  ƒ g  | D] } | d ^ q­ |  _	 d  S(   Ns   %s.*iüÿÿÿs   .tmpi   t   keyc         S   s   |  d S(   Ni    (    (   t   p(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   <lambda>”   s    (
   t   globR   R   R   t   splitextt   intt
   ValueErrort   appendt   sortR   (   R   R   R2   R   t   extt   numberR9   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR5   ‚   s    N(   R   R   R	   R,   R   R(   R+   R*   R4   R   R5   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   =   s   			t   Jobc           B   s}   e  Z d  Z d Z e j j d ƒ Z d i  d „ Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z RS(   s  
  Job object to execute function calls on remote machines accessible via
  queuing systems

  Data transfer is achieved via files. It is safe to use any number of
  Job objects in the same directory, even with a matching identifier

  Restrictions: target has to be pickleable
  s‰   source %s
libtbx.python << EOF
import pickle
( target, args, kwargs ) = pickle.load( open( "%s.target" ) )
target( *args, **kwargs )
EOF
s   setpaths.shc         C   s\   d | t  j ƒ  t |  ƒ f |  _ | |  _ | |  _ | |  _ | |  _ d  |  _	 d  |  _
 d  S(   Ns   %s_%d_%d(   R   R   R   t   namet   targett   argst   kwargst
   qinterfaceR*   t   processt   jobid(   R   RD   RE   RH   RF   RG   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   ®   s    "					c         C   sù   |  j  d  k	 r t d ‚ n  |  j ƒ  |  j d |  j d |  j ƒ  d |  j ƒ  ƒ } y1 t j	 | d t j
 d t j
 d t j ƒ|  _  Wn/ t k
 r´ } t d d	 j | ƒ | f ‚ n X|  j  j j |  j |  j |  j f ƒ |  j  j j ƒ  |  j ƒ  d  S(
   Ns   start called second timeRD   t   outt   errt   stdint   stdoutt   stderrs   Error while executing: '%s': %st    (   RI   R*   t   RuntimeErrort   write_input_dataRH   RD   t   out_filet   err_filet
   subprocesst   Popent   PIPEt   STDOUTt   OSErrort   joinRM   t   writet   SCRIPTt   SETPATHSR!   t   parse_process_stdout(   R   t   cmdt   e(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   start¸   s(    
				&c         C   s   d  S(   N(    (   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR^   Ù   s    c         C   s.   |  j  d  k r t d ‚ n  |  j  j ƒ  d  k S(   Ns   job has not been submitted yet(   RI   R*   RQ   t   poll(   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   is_aliveÜ   s    c         C   s·   x |  j  ƒ  r t j d ƒ q Wt j j |  j ƒ  ƒ re t |  j ƒ  ƒ j ƒ  } | re t	 | ‚ qe n  xK |  j
 ƒ  |  j ƒ  |  j ƒ  g D]( } t j j | ƒ r‡ t j | ƒ q‡ q‡ Wd  S(   Ngš™™™™™¹?(   Rc   R   R   R   R   R   RT   R   t   readRQ   t   target_fileRS   R.   (   R   t   errorR2   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRZ   ä   s    (c         C   sE   t  |  j ƒ  d ƒ } t j |  j |  j |  j f | ƒ | j ƒ  d  S(   NR   (   R   Re   R   R    RE   RF   RG   R!   (   R   t   ifile(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRR   ô   s    "c         C   s   d |  j  S(   Ns	   %s.target(   RD   (   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRe   û   s    c         C   s   d |  j  S(   Ns   %s.out(   RD   (   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRS      s    c         C   s   d |  j  S(   Ns   %s.err(   RD   (   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRT     s    (    (   R   R   R	   R\   t   libtbxt   envt   under_buildR]   R   Ra   R^   Rc   RZ   RR   Re   RS   RT   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRC   ˜   s   	

	!						t   PBSJobc           B   sG   e  Z d  Z e j d ƒ Z d i  d „ Z d „  Z d „  Z d „  Z	 RS(   s„  
  Job object to execute function calls on remote machines accessible via
  Portable Batch System (PBS)

  Data transfer is achieved via files. It is safe to use any number of
  Job objects in the same directory, even with a matching identifier

  If PBS support for 'wait for job to finish' is available, this class can be
  merged into Job

  Restrictions: target has to be picklable
  s   job_state\s*=\s*(\w+)c         C   sS   d | t  j ƒ  t |  ƒ f |  _ | |  _ | |  _ | |  _ | |  _ d  |  _	 d  S(   Ns   %s_%d_%d(
   R   R   R   RD   RE   RF   RG   RH   R*   RJ   (   R   RD   RE   RH   RF   RG   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR     s    "				c         C   s  |  j  d  k	 r t d ‚ n  |  j ƒ  |  j d |  j d |  j ƒ  d |  j ƒ  ƒ } y. t j	 | d t j
 d t j
 d t j
 ƒ} Wn/ t k
 r± } t d d	 j | ƒ | f ‚ n X| j d
 |  j |  j |  j f ƒ \ } } | rï t | ‚ n  | d  k	 st ‚ | j ƒ  |  _  d  S(   Ns   start called second timeRD   RK   RL   RM   RN   RO   s   Error while executing: '%s': %sRP   t   input(   RJ   R*   RQ   RR   RH   RD   RS   RT   RU   RV   RW   RY   RZ   t   communicateR\   R]   R   t   strip(   R   R_   RI   R`   RK   RL   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRa   $  s.    
					"c         C   s   |  j  ƒ  d k S(   Nt   C(   t
   job_status(   R   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRc   J  s    c         C   s®   |  j  d  k r t d ‚ n  t j d d |  j  f d t j d t j ƒ} | j ƒ  \ } } | ry t d |  j  | f ‚ n  |  j j | ƒ } | s¡ t d | ‚ n  | j	 d ƒ S(	   Ns   job has not been submitted yett   qstats   -fRN   RO   s   Jobid: %s
PBS error: %ss   Incorrect qstat output: %si   (
   RJ   R*   RQ   RU   RV   RW   Rm   t   REGEXt   searcht   group(   R   RI   RK   RL   t   m(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRp   O  s    	(    (
   R   R   R	   t   ret   compileRr   R   Ra   Rc   Rp   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRk   
  s   
	&	t   SGEJobc           B   s   e  Z d  „  Z RS(   c         C   sS   |  j  j j ƒ  } x: | D]2 } | j d ƒ r t | j ƒ  d ƒ |  _ Pq q Wd  S(   Ns   Your jobi   (   RI   RN   t	   readlinest
   startswithR=   t   splitRJ   (   R   t   qsub_outt   line(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR^   g  s
    (   R   R   R^   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRx   f  s   t   queue_interfacec           B   s   e  Z d Z e d  „ Z RS(   c         C   sg   | |  _  | d  k r< |  j d  k	 s* t ‚ |  j g |  _ n' t | t ƒ rZ | g |  _ n	 | |  _ d  S(   N(   t   asyncR*   t   COMMANDR   t   commandt
   isinstancet   str(   R   R�   t   asynchronous(    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR   p  s    	N(   R   R   R*   R€   t   FalseR   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR~   n  s   t   sge_interfacec           B   s   e  Z d  Z d Z d „  Z RS(   s(   
  Interface to Sun Grid Engine (SGE)
  t   qsubc      
   C   sK   |  j  d d d d | d | d | g	 } |  j sG | j d d g ƒ n  | S(	   Ns   -Ss   /bin/shs   -cwds   -Ns   -os   -es   -synct   y(   R�   R   t   extend(   R   RD   RK   RL   R_   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   __call__‚  s
    	(   R   R   R	   R€   RŠ   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR†   {  s   t   lsf_interfacec           B   s   e  Z d  Z d Z d „  Z RS(   s.   
  Interface to Load Sharing Facility (LSF)
  t   bsubc         C   s<   |  j  d | d | d | g } |  j s8 | j d ƒ n  | S(   Ns   -Js   -os   -es   -K(   R�   R   R?   (   R   RD   RK   RL   R_   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRŠ   ’  s    	(   R   R   R	   R€   RŠ   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR‹   ‹  s   t   pbs_interfacec           B   s   e  Z d  Z d Z d „  Z RS(   s.   
  Interface to Portable Batch System (PBS)
  R‡   c      	   C   s#   |  j  d d d | d | d | g S(   Ns   -dt   .s   -Ns   -os   -e(   R�   (   R   RD   RK   RL   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyRŠ      s    (   R   R   R	   R€   RŠ   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR�   ™  s   t   libtbx_pythont   sgec      	   C   s£   t  |  d ƒ s t ‚ | d k rC t d |  d | d t | | ƒ ƒ S| d k rq t d |  d | d t | | ƒ ƒ S| d k rŸ t d |  d | d t | | ƒ ƒ Sd  S(   NRŠ   R�   RE   RD   RH   t   pbst   lsf(   t   hasattrR   Rx   R†   Rk   R�   RC   R‹   (   RE   RD   t   platformR�   R„   (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyR‡   ¤  s     (   R	   t
   __future__R    t   cPickleR   RU   R   R   R   R;   Rv   R   R   R   t   libtbx.load_envRh   t   objectR   R
   R   RC   Rk   Rx   R~   R†   R‹   R�   R*   R+   R‡   (    (    (    sQ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/generic.pyt   <module>   s2   

[r\