a
    h)                     @   s\   d dl Z d dlZd dlmZmZ d dlZd dlZd dlZG dd deZ	G dd de	Z
dS )    N)ABCMetaabstractmethodc                   @   sH   e Zd ZeZdd Zedd Zedd Zedd Z	ed	d
 Z
dS )ExecutorBasec                 C   s
   || _ d S Nlog)selfr    r	   r/home/psgendb/BIRCHDEV/install/SPAdes-4.2.0-Linux/linux-x86_64/share/spades/spades_pipeline/executors/executors.py__init__   s    zExecutorBase.__init__c                 C   s   d S r   r	   )r   commandsr	   r	   r
   execute   s    zExecutorBase.executec                 C   s   d S r   r	   )r   r   
outputfiler	   r	   r
   dump_commands   s    zExecutorBase.dump_commandsc                 C   s   d S r   r	   r   job_namer	   r	   r
   join!   s    zExecutorBase.joinc                 C   s   d S r   r	   r   r	   r	   r
   kill%   s    zExecutorBase.killN)__name__
__module____qualname__r   Z__metaclass__r   r   r   r   r   r   r	   r	   r	   r
   r      s   


r   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZ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ddZdddZdddZdS )ExecutorClusterNc                 C   s   t j| jj|d| jd d S )NZJOB_NAMEr   )supportsys_callgrid_engine_wait_commandformatr   r   r	   r	   r
   r   :   s    zExecutorCluster.joinc                 C   s   t | jj|d d S )Nr   )ossystemgrid_engine_kill_commandr   r   r	   r	   r
   r   =   s    zExecutorCluster.killc                 C   s   t j|| jd |S )Nr   )r   r   r   )r   cmdZuuidr	   r	   r
   run_cluster_commandA   s    z#ExecutorCluster.run_cluster_commandc           
         s  g   fdd}t |D ]\}}t||j}tjjrltj|rld|jvrld|jvrl| j	
d|j  qd|jvr| j	
d|j  | dkr| j	
d|   || jr| || }n| || }| ||j}d|jvr| j	
d	|j|f   | tj|jd
 d|gd|jd
 d}| | || |j}	 |	 tjj|jksd|jv rtjj|jdd kr| j	
dtjj   qq S )Nc                      s    sdS  d S d S )N r	   r	   jobsr	   r
   prev_idG   s    z(ExecutorCluster.execute.<locals>.prev_idZ_startZ_finishz%===== Skipping %s (already processed)z
===== %s started. 
truez
==Submitting: %s
z!
===== %s submitted. Job ID: %s 
Z_touchZtouch)job_uuid_r   z
======= Skipping the rest of SPAdes pipeline (--stop-after was set to '%s'). You can continue later with --continue or --restart-from options
)	enumerateoptions_storageget_stage_filename
short_nameargscontinue_moder   pathisfiler   infoSTAGE__str__mpi_supportget_MPI_commandget_not_MPI_commandr!   r(   appendcommands_parserZCommand
stop_aftersplit)
r   r   r&   numcommandstage_checkpoint_pathr    ZjidZtouch_commandZ	touch_jidr	   r$   r
   r   E   sR    



zExecutorCluster.executec                 C   s   t |d|}||  d  d}tt|D ]H}|| jrN| || |}n| || |}||d  || j}q.W d    n1 s0    Y  | j	
d|  d S )Nw
r"   zCommands were saved to )openwriteget_MPI_sh_preambularangelenr5   get_MPI_sh_commandget_not_MPI_sh_commandr(   r   r2   )r   r   r   fwr&   ir    r	   r	   r
   r      s    
*zExecutorCluster.dump_commandsc                 C   s  d}t jjd }|d| jj|d d 7 }|d| jj|d d 7 }tt jjd d }|d	| jjt jj	d
 d 7 }|d| j
j||t jj d d | jjt jjt jjt jjt jj d d | jj|d d 7 }|d| jjt jjt jjd d 7 }|dtj d 7 }|S )Nr"   /spades.logz	LOG_OUT="ZOUTz"
z	ERR_OUT="ZERR   zQUEUE="ZQUEUEzCLUSTER_ARGS="$QUEUE MEMORYZTOTAL_MEMORY NNODESNCPUSZNPROCESSORSrP   zMPIRUN_ARGS="rS   rT   zPYTHON=")r+   r.   
output_dirgrid_engine_output_optionr   grid_engine_err_output_optionintmemorygrid_engine_queue
grid_queuegrid_engine_memory_optiongrid_nnodesgrid_engine_thread_optionthreadsgrid_engine_minimum_node_memgrid_engine_mpi_runtime_argssys
executable)r   Z	preambulalog_filememory_in_kbr	   r	   r
   rC      s<    
z$ExecutorCluster.get_MPI_sh_preambular"   c                 C   s   | j d }|| jj|jdd 7 }|d7 }|d7 }|dkrP|| jj|dd 7 }|d7 }|| jd 7 }|}d	|j d
 }|d|  d 7 }||7 }|d7 }|S )NrQ   r   	$LOG_OUT 	$ERR_OUT r"   ZWAIT_TAGz$CLUSTER_ARGS z $MPIRUN_ARGS z# === STAGE z(MPI) === 
CMD=""

$CMD

)grid_engine_submit_commandgrid_engine_name_optionr   r(   grid_engine_dependency_optiongrid_engine_mpi_runtimer3   Z
mpi_sh_str)r   r=   prev_job_namer    Zcmd1r	   r	   r
   rF      s    
z"ExecutorCluster.get_MPI_sh_commandc                 C   s   d|j  d }|d|  d 7 }|| jd 7 }|| jj|jdd 7 }|d7 }|d7 }|d	krv|| jj|d
d 7 }|d7 }|d7 }|S )Nz#=== STAGE z (not MPI) ===
rk   rl   rQ   r   rh   ri   r"   rj   z$QUEUE rm   )r3   Zsh_strrn   ro   r   r(   rp   )r   r=   rr   r    r	   r	   r
   rG      s    z&ExecutorCluster.get_not_MPI_sh_commandc                 C   s  | j d }|| jj|jdd 7 }tjjd }|| jj|dd 7 }|| jj|dd 7 }|dkrx|| j	j|dd 7 }|| j
jtjjd	d 7 }ttjjd
 d
 }|| jj||tjj dd 7 }|| jjtjjtjjtjjtjj dd 7 }|| jj|dd 7 }|| jd | jjtjjtjjd d 7 }tjjrz|jd |j d |j }tjjd | d }dj|d}nd}tjjrd}	nd}	tjjrd}
nd}
|
d | }||d 7 }||	d 7 }|| 7 }|S )NrQ   r   rJ   rK     rL   r"   rj   rN   rM   rO   rR   rU   rV   r)   /z.profz0 -x CPUPROFILE={PROFILE} ompi_profile_helper.sh )ZPROFILEz valgrind  --track-origins=yes zulimit -c unlimited && )rn   ro   r   r(   r+   r.   rW   rX   rY   rp   r\   r]   rZ   r[   r^   r_   r`   ra   rb   rq   rc   grid_profiler3   r-   grid_valgrindgrid_coredumpZmpi_str)r   r=   rr   r    rf   rg   nameZprofileZprofile_lineZvalgrind_lineZcoredump_liner	   r	   r
   r6      sN    
 


zExecutorCluster.get_MPI_commandc                 C   s   | j d }|| jj|jdd 7 }tjjd }|| jj|dd 7 }|| jj|dd 7 }|dkrx|| j	j|dd 7 }|| j
jtjjd	d 7 }|| 7 }|S )
NrQ   r   rJ   rK   rs   rL   r"   rj   rN   )rn   ro   r   r(   r+   r.   rW   rX   rY   rp   r\   r]   r4   )r   r=   rr   r    rf   r	   r	   r
   r7      s    
z#ExecutorCluster.get_not_MPI_command)r"   )r"   )r"   )r"   )r   r   r   grid_enginern   ro   rX   rY   r`   rp   r^   r\   rb   rq   rc   r   r   r   r   r!   r   r   rC   rF   rG   r6   r7   r	   r	   r	   r
   r   *   s0   :


+r   )r   rd   abcr   r   r+   r   r9   objectr   r   r	   r	   r	   r
   <module>
   s   