змеиный мастер интерпретирует полный путь как относительный путь - PullRequest
0 голосов
/ 15 апреля 2020

Я пишу змейку, чтобы выполнить несколько операций. Все правила, кроме последнего (mvQsubLogs), работают для тестового файла. Это последнее правило должно перемещать файлы .e и .o, созданные командой qsub (я запускаю snakemake в кластере), из каталога, указанного с флагом -e и -o, в указанный каталог в выходной директиве моего правила, как только некоторые операции завершены (см. директиву input в приведенном ниже правиле):

rule mvQsubLogs:
    input:
        # FastQC
        rules.fastQC.output,

        # Markduplicates
        rules.markDups.output.markDupBam,
        rules.markDups.output.markDupMetrics,

        # mosdepth
        rules.mosdepth.output.DIR,

        # editflagStat
        rules.edit_flagStat.output,

        # edit idxStats
        rules.edit_idxStats.output,

        # insertSizeMetrics
        rules.insertSizeMetrics.output.METRICS,
        rules.insertSizeMetrics.output.PDF

    output:
        directory("{sample}/logs")
    shell:
        "mkdir -p {wildcards.sample}/logs " 
        "| mv {LOGDIR}{wildcards.sample}* {output}"

Можно найти группу обеспечения доступности баз данных со всеми заданиями, которые я хочу выполнить ниже:

enter image description here

Команда, которую я использую для запуска заданий в кластере:

snakemake -p -s Snakefile_v6_ngs_bngs05b --cluster "qsub -q onlybngs05b -e {LOGD
IR} -o {LOGDIR}" -j 5 --use-conda --jobname "{wildcards.sample}.{rule}.{jobid}"

Принимая во внимание, что это важно отметить, где должны быть созданы файлы .e и .o, для этого примера это LOGDIR. LOGDIR было фактически извлечено из файла конфигурации (LOGDIR = config['logsOutDir'] - в самом файле snake и logsOutDir: "/home/ngs/jobout/" - указано в файле конфигурации).

Когда я вызываю полный snakemake, команда, которую я получаю для Правило mvQsubLogs это:

rule mvQsubLogs:
    input: NIPT-PearlPPlasma-03-PPx_S3downSample/fastQC, NIPT-PearlPPlasma-03-PPx_S3downSample/aligned/NIPT-PearlPPlasma-03-PPx_S3downSample.sorted.markDup.bam, NIPT-PearlPPlasma-03-PPx_S3downSample/dups/NIPT-PearlPPlasma-03-PPx_S3downSample.markDups.metrics.txt, NIPT-PearlPPlasma-03-PPx_S3downSample/depth/, NIPT-PearlPPlasma-03-PPx_S3downSample/dups/NIPT-PearlPPlasma-03-PPx_S3downSample.sorted.markDup.flagstat.edited.csv, NIPT-PearlPPlasma-03-PPx_S3downSample/readsDist/NIPT-PearlPPlasma-03-PPx_S3downSample.sorted.markDup.idxstats.edited.csv, NIPT-PearlPPlasma-03-PPx_S3downSample/insertSizeDist/NIPT-PearlPPlasma-03-PPx_S3downSample_ISmetrics.txt, NIPT-PearlPPlasma-03-PPx_S3downSample/insertSizeDist/NIPT-PearlPPlasma-03-PPx_S3downSample_ISHist.pdf
    output: NIPT-PearlPPlasma-03-PPx_S3downSample/logs
    jobid: 7
    wildcards: sample=NIPT-PearlPPlasma-03-PPx_S3downSample

mkdir -p NIPT-PearlPPlasma-03-PPx_S3downSample/logs | mv /home/ngs/jobout/NIPT-PearlPPlasma-03-PPx_S3downSample* NIPT-PearlPPlasma-03-PPx_S3downSample/logs

Что мне кажется правильным: (после создания каталога, в который следует переместить файлы, просто чтобы быть в безопасности), я должен переместить все файлы, начиная с NIPT-PearlPPlasma-03-PPx_S3downSample (т. Е. wildcards.sample), расположенный от /home/ngs/jobout/ до NIPT-PearlPPlasma-03-PPx_S3downSample/logs, тогда как этот последний каталог относительно рабочего каталога .

Посмотрите на .e файл, сгенерированный по правилу mvQsubLogs, который я получаю:

mkdir -p NIPT-PearlPPlasma-03-PPx_S3downSample/logs | mv /home/ngs/jobout/NIPT-PearlPPlasma-03-PPx_S3downSample* NIPT-PearlPPlasma-03-PPx_S3downSample/logs
mv: target ‘NIPT-PearlPPlasma-03-PPx_S3downSample/logs’ is not a directory

Что не имеет смысла для меня, так как выходной каталог NIPT-PearlPPlasma-03-PPx_S3downSample/logs должен был быть создан

Я уже пробовал указав полный путь, куда файлы должны быть перемещены, хотя он тоже не работал, я получил ту же ошибку.

Может кто-нибудь определить, где ошибка в моем коде?

1 Ответ

0 голосов
/ 15 апреля 2020

Попробуйте следующее:

    shell:
        "mkdir -p {output} \n" 
        "mv {LOGDIR}{wildcards.sample}* {output}/"

Сохраните код DRY, используя оба выхода. Это поможет, если вы решите изменить местоположение позже.

Замените канал с помощью второй команды (перевод строки).

Добавьте в конце второй аргумент sh для перемещения второго аргумента. Похоже на вложенные каталоги, которые воспринимаются как файл, если нет sla sh. Например,

mkdir -p test/log | mv *.out test/log
# mv: target ‘test/log’ is not a directory

mkdir -p test/log | mv *.out test/log/
# ok
...