Каскадные контрольно-пропускные пункты Змеиного Мира не работают - PullRequest
0 голосов
/ 04 февраля 2020

У меня следующая ситуация

  1. Контрольная точка A создает файлы (1 или 2) в папке A_Out
  2. Контрольная точка B принимает все файлы из A_Out в качестве входных данных и генерирует файлы (1 или 2) в B_Out
  3. У меня есть условное правило C, которое может принимать входные данные от A или B и получим окончательный результат

Я использую следующий код,

checkpoint A:
   output: directory("A_Out")
   # Rest of the logic

def collect_a(wildcards):
   path = checkpoints.A.get(**wildcards).output[0]
   return expand("{path}/{file}.txt",
                  path=path,
                  file=glob_wildcards(os.path.join(path, "{name}.txt")).name)

checkpoint B:
   input: collect_a
   output: directory("B_Out")
   # Rest of the logic

def collect_b(wildcards):
   path = checkpoints.B.get(**wildcards).output[0]
   return expand("{path}/{file}.txt",
                  path=path,
                  file=glob_wildcards(os.path.join(path, "{name}.txt")).name)

def conditional_input(wildcards):
   if condition_A:
      return collect_a(wildcards)
   else:
      return collect_b(wildcards)

rule c:
   input: conditional_input
   # Rest of the logic

В вышеприведенном случае, когда условие_a равно False, оно оценивает только контрольную точку B и не оценивает контрольную точку А. Как я могу решить эту проблему? Или есть какой-нибудь другой элегантный способ?

1 Ответ

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

Эти каскадные вызовы контрольной точки довольно глючные и имеют несколько проблем, связанных с ними. Если вы выложите sh из вашего примера больше, вы можете отправить вопрос на github, если у вас установлена ​​самая последняя версия snakemake.

В качестве обходного пути вы можете попробовать добавить временный файл сигналов в каждый файл. каталог, чтобы указать, что правило завершено. Затем вам нужно будет использовать подстановочные знаки в коде правила.

Не здорово, но может работать. Поскольку у вас есть временный ввод в качестве сигнала, правила будут перезапускаться каждый раз, даже если другие файлы уже присутствуют; змеиный мастер не знает, что они являются выходами. Другой вариант заключается в том, чтобы заранее проверить ваши входные данные, чтобы решить, будут ли сгенерированы один или два файла, и передать их в вашу функцию ввода logi c, минуя контрольные точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...