Использование bash функций в snakemake - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь загрузить некоторые файлы с помощью snakemake. Файлы (http://snpeff.sourceforge.net/SnpSift.html#dbNSFP), которые я хотел бы загрузить, находятся на сайте / диске Google, и мой обычный подход wget не работает. Я нашел функцию bash, которая выполняет эту работу (https://www.zachpfeffer.com/single-post/wget-a-Google-Drive-file):

function gdrive_download () {  CONFIRM=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=$1" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')  wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$CONFIRM&id=$1" -O $2  rm -rf /tmp/cookies.txt }

gdrive_download 120aPYqveqPx6jtssMEnLoqY0kCgVdR2fgMpb8FhFNHo test.txt

Я протестировал эту функцию с моими идентификаторами в простом сценарии bash и смог скачать все файлы. Чтобы добавить немного сложности, я должен использовать шаблон рабочего места и включить в него функцию.

rule dl: 
    params:
        url = 'ftp://ftp.ncbi.nlm.nih.gov/pub/clinvar/vcf_{genome}/{afile}'
    output:
        'data/{genome}/{afile}'
    params:
        id1 = '0B7Ms5xMSFMYlOTV5RllpRjNHU2s',
        f1 = 'dbNSFP.txt.gz'
    shell:
        """CONFIRM=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id={{params.id1}}" -O- | sed -rn "s/.*confirm=([0-9A-Za-z_]+).*/\1\n/p") && wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$CONFIRM&id={{params.id1}}" -O {{params.f1}} && rm -rf /tmp/cookies.txt"""
        #'wget -c {params.url} -O {output}'

rule checksum:
    input:
        i = 'data/{genome}/{afile}'
    output:
        o = temp('tmp/{genome}/{afile}.md5')
    shell:
        'md5sum {input} > {output}'

rule file_size:
    input:
        i = 'data/{genome}/{afile}'
    output:
        o = temp('tmp/{genome}/{afile}.size')
    shell:
        'du -csh --apparent-size {input} > {output}'

rule file_info:
    """md5 checksum and file size"""
    input:
        md5 = 'tmp/{genome}/{afile}.md5',
        s = 'tmp/{genome}/{afile}.size'
    output:
        o = temp('tmp/{genome}/info/{afile}.csv')
    run:
        with open(input.md5) as f:
            md5, fp = f.readline().strip().split()
        with open(input.s) as f:
            size = f.readline().split()[0]
        with open(output.o, 'w') as fout:
            print('filepath,size,md5', file=fout)
            print(f"{fp},{size},{md5}", file=fout)

rule manifest:
    input:
        expand('tmp/{genome}/info/{suffix}.csv', genome=('GRCh37','GRCh38'), suffix=('dbNSFP.txt.gz', 'dbNSFP.txt.gz.tbi'))
        #expand('tmp/{genome}/info/SnpSift{suffix}.csv', genome=('GRCh37','GRCh38'), suffix=('dbNSFP.txt.gz', 'dbNSFP.txt.gz.tbi'))
    output:
        o = 'MANIFEST.csv'
    run:
        pd.concat([pd.read_csv(afile) for afile in input]).to_csv(output.o, index=False)

Существует четыре загружаемых файла, для которых у меня есть идентификаторы (я только покажите один в параметрах), однако я не знаю, как вызывать функции bash, написанные ZPfeffer для всех идентификаторов, которые у меня есть с snakemake. Кроме того, когда я запускаю этот сценарий, возникает несколько ошибок, наиболее неотложной из которых является

sed: -e expression #1, char 31: unterminated `s' command

Я далек от эксперта по змеиному искусству, любой помощи по поводу того, как изменить мой сценарий для а) вызова функций с помощью 4 различные идентификаторы, б) удалите ошибку sed и c) убедитесь, что это правильный формат URL (в настоящее время url = 'https://docs.google.com/uc?export / {afile}).

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Вы хотите использовать необработанный строковый литерал , чтобы snakemake не экранировал специальные символы, такие как backsla sh в команде sed. Например (обратите внимание r перед командой оболочки):

rule foo:
   shell: 
       r"sed d\s\"

Вы можете использовать --printshellcmds или -p, чтобы увидеть, как именно shell: команды разрешаются с помощью snakemake.

0 голосов
/ 14 февраля 2020

Вот как я «решил» это:

import pandas as pd

rule dl: 
    output:
        'data/{genome}/{afile}'
    shell:
        "sh download_snpsift.sh"

rule checksum:
    input:
        i = 'data/{genome}/{afile}'
    output:
        o = temp('tmp/{genome}/{afile}.md5')
    shell:
        'md5sum {input} > {output}'

rule file_size:
    input:
        i = 'data/{genome}/{afile}'
    output:
        o = temp('tmp/{genome}/{afile}.size')
    shell:
        'du -csh --apparent-size {input} > {output}'

rule file_info:
    """md5 checksum and file size"""
    input:
        md5 = 'tmp/{genome}/{afile}.md5',
        s = 'tmp/{genome}/{afile}.size'
    output:
        o = temp('tmp/{genome}/info/{afile}.csv')
    run:
        with open(input.md5) as f:
            md5, fp = f.readline().strip().split()
        with open(input.s) as f:
            size = f.readline().split()[0]
        with open(output.o, 'w') as fout:
            print('filepath,size,md5', file=fout)
            print(f"{fp},{size},{md5}", file=fout)

rule manifest:
    input:
        expand('tmp/{genome}/info/{suffix}.csv', genome=('GRCh37','GRCh38'), suffix=('dbNSFP.txt.gz', 'dbNSFP.txt.gz.tbi'))
    output:
        o = 'MANIFEST.csv'
    run:
        pd.concat([pd.read_csv(afile) for afile in input]).to_csv(output.o, index=False)

А вот сценарий bash.

function gdrive_download () {
 CONFIRM=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=$1" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')
 wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$CONFIRM&id=$1" -O $2
 rm -rf /tmp/cookies.txt
}

gdrive_download 0B7Ms5xMSFMYlSTY5dDJjcHVRZ3M data/GRCh37/dbNSFP.txt.gz
gdrive_download 0B7Ms5xMSFMYlOTV5RllpRjNHU2s data/GRCh37/dbNSFP.txt.gz.tbi

gdrive_download 0B7Ms5xMSFMYlbTZodjlGUDZnTGc data/GRCh38/dbNSFP.txt.gz
gdrive_download 0B7Ms5xMSFMYlNVBJdFA5cFZRYkE data/GRCh38/dbNSFP.txt.gz.tbi
...