snakemake规则将调用Shell脚本,但在执行第一个命令后退出

时间:2018-11-10 21:47:38

标签: shell for-loop snakemake

我有一个Shell脚本,如果我只是从命令行运行它,它将很好地工作。当我从snakemake的规则中调用它时,它会失败。

该脚本在标识符文件上运行for循环,并使用这些标识符对来自fastq文件的序列进行grep编码,然后进行多个序列比对,并达成共识。

这是脚本。我在其中放置了一些echo语句,由于某种原因它没有调用命令。它在grep语句处停止。

我尝试添加set + o pipefail;在规则中,但这也不起作用。

 #!/bin/bash


function Usage(){
    echo -e "\
    Usage: $(basename $0) -r|--read2 -l|--umi-list -f|--outfile \n\ 
    where: ... \n\
    " >&2
        exit 1
}

# Check argument count
[[ "$#" -lt 2 ]] && Usage
# parse arguments
while [[ "$#" -gt 1 ]];do
    case "$1" in
        -r|--read2)
            READ2="$2"
            shift
            ;;
        -l|--umi-list)
            UMI="$2"
            shift
            ;;
        -f|--outfile)
            OUTFILE="$2"
            shift
            ;;
        *)
            Usage
            ;;
    esac
    shift
done

# Set defaults


# Check arguments
[[ -f "${READ2}" ]] || (echo "Cannot find input file ${READ2}, exiting..." >&2; exit 1)
[[ -f "${UMI}" ]] || (echo "Cannot find input file ${UMI}, exiting..." >&2; exit 1)

#Create output directory
OUTDIR=$(dirname "${OUTFILE}")
[[ -d "${OUTDIR}" ]] || (set -x; mkdir -p "${OUTDIR}")


# Make temporary directories
TEMP_DIR="${OUTDIR}/temp"
[[ -d "${TEMP_DIR}" ]] || (set -x; mkdir -p "${TEMP_DIR}")


#RUN consensus script

for f in $( more "${UMI}" | cut -f1);do
NAME=$(echo $f)
grep  "${NAME}" "${READ2}" | cut -f1 -d ' ' | sed 's/@M/M/' > "${TEMP_DIR}/${NAME}.name"
echo subsetting reads
seqtk  subseq "${READ2}" "${TEMP_DIR}/${NAME}.name" | seqtk  seq  -A > "${TEMP_DIR}/${NAME}.fasta"

~/software/muscle3.8.31_i86linux64  -msf -in "${TEMP_DIR}/${NAME}.fasta" -out "${TEMP_DIR}/${NAME}.muscle.fasta"

echo make consensus
~/software/EMBOSS-6.6.0/emboss/cons -sequence "${TEMP_DIR}/${NAME}.muscle.fasta" -outseq "${TEMP_DIR}/${NAME}.cons.fasta"

  sed -i 's/n//g' "${TEMP_DIR}/${NAME}.cons.fasta"
  sed -i "s/EMBOSS_001/${NAME}.cons/" "${TEMP_DIR}/${NAME}.cons.fasta"
done
cat "${TEMP_DIR}/*.cons.fasta" > "${OUTFILE}"

Snakemake规则:

rule make_consensus:
    input:
        r2=get_extracted,
        lst="{prefix}/{sample}/reads/cell_barcode_umi.count" 
    output:
        fasta="{prefix}/{sample}/reads/fasta/{sample}.R2.consensus.fa"
    shell:
        "sh ./scripts/make_consensus.sh -r {input.r2} -l {input.lst} -f {output.fasta}"

编辑Snakemake错误消息,我将某些路径更改为中性文件路径

RuleException:
CalledProcessError in line 29 of ~/user/scripts/consensus.smk:
Command ' set -euo pipefail;  sh ./scripts/make_consensus.sh -r  ~/user/file.extracted.fastq -l ~/user/cell_barcode_umi
.count -f ~/user/file.consensus.fa ' returned non-zero exit status 1.
  File "~/user/scripts/consensus.smk", line 29, in __rule
_make_consensus
  File "~/user/miniconda3/lib/python3.6/concurrent/futures/thread.py", line 56, in run
Shutting down, this might take some time.
Exiting because a job execution failed. Look above for error message

如果有比使用shell循环更好的方法,请告诉我!

谢谢!

修改

脚本独立运行:第一个grep

grep  AGGCCGTTCT_TGTGGATG R_extracted/wgs_5_OL_debug.R2.extracted.fastq | cut -f1 -d ' ' | sed 's/@M/M/' > ./fasta/temp/AGGCCGTTCT_TGTGGATG.name 

脚本通过snakemake运行:前2个grep语句

grep  :::::::::::::: R_extracted/wgs_5_OL_debug.R2.extracted.fastq | cut -f1 -d ' ' | sed 's/@M/M/' > ./fasta/temp/::::::::::::::.name

我现在正试图弄清snakemake中那些::::的来源。欢迎所有想法

1 个答案:

答案 0 :(得分:1)

  

它在grep语句处停止

我的猜测是grep中的make_consensus.sh命令无法捕获任何内容。在这种情况下,grep返回退出代码1,并且非零退出状态传播到snakemake。 (另请参见Handling SIGPIPE error in snakemake

松散相关... make_consensus.sh的shebang表示应使用bash#!/bin/bash)执行脚本与使用sh({{ 1}})。 (实际上,这没有什么区别,因为无论如何sh都可能会重定向到bash)