
    h@h/                          d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZmZmZ d dlmZmZmZmZmZmZmZmZmZmZ  G d d      Zy)    N)validate_config_optionsvalidate_argsvalidate_additional_argsvalidate_envvalidate_manifest_files)logcolorbuild_loggerhuman_readable_time)
AdapterRemovalRunnerBowtie2RunnerFastQCRunnerSamToolsRunnerPicardRunnerSplitByRefRunnerMergeByHorizonRunnerFilterPresenceRunnerCleanSQRunnerMapDamageRunnerc                   `    e Zd ZdZeeeeee	e
eeed
Zd Zd Zd Zd Zd Zd Zd	 Zd
 Zd Zy)Runnerz
    Runner class takes in a path to a configparser object and sets up the workflow
    from user supplied config info. Lots of moving pieces.
    )
bowtie2fastqcpicard	mapdamageadapterremovalsamtools
splitbyrefmergebyhorizonfilterpresencecleansqc                    g | _         d| _        d| _        d | _        d| _        || _        || _        d| _        d| _        g | _	        t        j                  d      }d| d| _        t        | j                        | _        y )N    Fz%Y-%m-%d_%H:%M:%Sworkflow_run_z.log)software_stepsinput_fastq_pathoutput_pathloggerthreadsconfigconfig_pathdry_runmanifest_pathmanifest_listtimestrftimelogpathr	   )selfr*   r+   	timestamps       A/mounts/lovelace/software/shotgun-workflow/dev/workflow/runner.py__init__zRunner.__init__,   s}      "&MM"56	&yk6"4<<0    c                 V   | j                   j                  t        j                   dt        j                          | j                          | j                          | j                          | j                          | j                  r| j                          y | j                          y )Nz=== VALIDATE & LOAD ===)r(   infor   BOLDENDCvalidate_allread_configsetup_software_stepsvalidate_stepsr,   dryrunfullrunr2   s    r4   mainzRunner.main=   sy    HMM?*A(--QR 	 	!!# 	 <<KKMLLNr6   c                     | j                   j                  dt        j                   dt        j                          | j
                  D ]  }|j                           t        | j                         y )N
z=== DRY RUN ===)	r(   r8   r   r9   r:   r%   r,   printr+   r2   steps     r4   r?   zRunner.dryrunT   sR    2hmm_OHMM?KL''DLLN ( 	d r6   c           	         t        j                          }| j                  j                  dt        j                   dt        j
                          | j                         }| j                  D ]K  }|j                  |      }|j                          |j                          |j                         }|d k7  sJ|}M t        j                          }| j                  j                  dt        j                   dt        j
                          | j                  j                  dt        j                   dt        j
                          t        ||z
        }| j                  j                  t        j                   d| t        j
                   d       | j                  j                  t        j                   d| t        j
                          | j                  D ]o  }t        |j                  |j                  z
        }| j                  j                  t        j                   d|j                    d| t        j
                          q t#        j$                  | j&                  | j(                         t#        j$                  | j*                  | j(                         t#        j$                  | j,                  | j(                         y )	NrD   z=== FULL RUN ===zRun complete!z=== Summary ===zTotal time elapsed: zIndividual step times: z - z time: )r/   r(   r8   r   r9   r:   convert_manifestr%   find_input_filesbuild_command_queuecreate_output_dirrunr
   INFOend_time
start_timestepnameshutilcopyr1   r'   r+   r-   )r2   start_time_allstep_n_filesrG   
run_outputend_time_all
total_timetotal_step_times           r4   r@   zRunner.fullrun\   s   2hmm_,<X]]OLM,,.''D00>L$$&""$J T!) ( yy{ 	2hmm_M(--IJ2hmm_OHMM?KL()FG
HMM?*>zl8==/Y[\]HMM?*A*hmm_]^''D1$--$//2QROKKc$--GXYaYfYfXghi (
 	DLL$"2"23D$$d&6&67D&&(8(89r6   c                 2   g }| j                   D ]  }|j                  |d   d d t        j                  j	                  | j
                  |d         |j                  d      r-t        j                  j	                  | j
                  |d         nd d        |S )Nidforward_filereverse_file)r[   input1input2output1output2)r.   appendospathjoinr&   get)r2   manifest_convlines      r4   rI   zRunner.convert_manifest~   s    &&D  4j77<<(=(=tN?STX\X`X`aoXp277<<(=(=tN?STvz"  ' r6   c                     t        | j                  | j                         t        | j                  | j                  | j                         t        | j                  | j                         y )N)r*   r(   )r*   software_dictionaryr(   )r   r*   r(   r   rj   r   rA   s    r4   r;   zRunner.validate_all   sC    t{{4;;GT[[d>V>V_c_j_jkt{{4;;Gr6   c                     | j                   D ]9  }t        |j                  |j                  |j                  | j
                         ; t        | j                   | j
                         y )N)rQ   unneeded_argsadditional_step_argsr(   )r%   r(   )r%   r   rQ   rl   additional_argsr(   r   rF   s     r4   r>   zRunner.validate_steps   sP    ''D$"00%)%9%9{{	 ( 	D$7$7Lr6   c                 &   | j                   d   d   j                  dd      | _        t        | j                   d   d         | _        | j                   d   d   j                  dd      | _        | j                   d   d   j                  dd      | _        | j                   d   d   d	v rd
| _        t        | j                  d      5 }t        j                  |      D ]  }| j                  j                  |        	 d d d        y # 1 sw Y   y xY w)NGENERALr&   "r"   r)   r'   input_manifestr,   )TruetrueTTr)r*   replacer&   intr)   r'   r-   r,   opencsv
DictReaderr.   rb   )r2   datarh   s      r4   r<   zRunner.read_config   s     !%I 67I J R RSVXZ [4;;y1)<=;;y1-@HHbQ![[34DEMMcRTU;;y!),0FFDL $$$c*dt,""))$/ - +**s   6DDc                 D   | j                   }d}| j                  d   d   j                  d      D ]  }| j                  |   d   }dt        |      z   }|}| j                   d|dd   d	| }| j                  |   d
   j                  dd      }d }	d| j                  |   v r| j                  |   d   }	 | j                  |   | j                  | j                  |||| j                  ||	      }
|
j                  dk(  r|}| j                  j                  |
       |dz   } y )N   rp   order software0/_argsrq   r"   mode)r(   r.   
input_pathr'   rn   r)   rQ   r   F)r&   r*   splitstrr'   rv   rj   r(   r.   r)   leafr%   rb   )r2   prev_step_outputstep_numsectionsection_softwaresection_numsection_inputsection_outputsection_argssection_modeSoftObjs              r4   r=   zRunner.setup_software_steps   sA   00 {{9-g6<<SAG#{{73J?H-K,M $ 0 01;rs3C2DAgYON;;w/7??RHLLW--#{{73F; Ad../?@ $ 2 2*,".,,"		G ||u$#1 &&w/!|HE Br6   N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   rj   r5   rB   r?   r@   rI   r;   r>   r<   r=    r6   r4   r   r      s_    
 !$."&.. 1".!:D
HM0 ($r6   r   )ry   rc   r/   rR   workflow.validater   r   r   r   r   workflow.logr   r	   r
   modulesr   r   r   r   r   r   r   r   r   r   r   r   r6   r4   <module>r      s:       
  y$ y$r6   