Snakemake: regla para usar muchas entradas para una salida con múltiples subgrupos

Tengo un canal de trabajo que estoy usando para descargar, alinear y realizar llamadas de variantes en datos de secuencia pública. El problema es que actualmente solo puede funcionar por muestra ( es decir, muestra como cada experimento de secuenciación individual). No funciona si quiero realizar una variante invocando un grupo de experimentos (como las réplicas biológicas y / o técnicas de una muestra). He intentado resolverlo, pero no pude hacerlo funcionar.

Aquí hay una simplificación de la regla de alineación:

rule alignment: input: rules.download.output.fastq output: '{group}/alignment/{sample}.bam' shell: "bash scripts/02_alignment.sh {wildcards.group} {wildcards.samples}" 

Y lo mismo para la variante de llamada:

 rule variant_calling: input: rules.alignment.output output: '{group}/variants/{sample}.vcf.gz' shell: "bash scripts/03_variant_calling.sh {wildcards.sample} {wildcards.group}" 

Esto funciona bien, ya que hay un solo archivo .vcf generado para cada archivo .bam alineado. Pero lo que me gustaría hacer es generar un solo archivo .vcf partir de un número arbitrario de archivos .bam . Tengo un dataframe de pandas contiene todos los nombres de sample y su group correspondiente. Básicamente, me gustaría cambiar la output de la segunda regla para que sea '{group}/variants/{group}.vcf' , pero todo lo que he hecho ha fallado de alguna manera.

La idea que tuve fue proporcionar la regla con todos los archivos .bam alineados por grupo como entrada y luego simplemente dar a la secuencia de comandos que ejecuta el directorio donde se encuentran todos. El problema es que no puedo encontrar una manera de dar una entrada de esta manera por grupo: o doy por muestra (como .bam trabajo) o doy TODOS los archivos .bam para cada llamada de variante de grupo, independientemente de A qué grupo pertenecen realmente. No puedo usar solo comodines, ya que el comodín {sample} no está presente en la última salida. También intenté usar funciones como entrada, pero eso lleva a los mismos problemas que arriba.

    El quid de la cuestión parece ser las capas de agrupación: si quisiera realizar una variante de llamada en todos los archivos .bam alineados en el conjunto de datos en su conjunto, eso probablemente funcionaría bien, dame los problemas mencionados anteriormente. El problema viene con subgrupos para el conjunto de datos en su conjunto:

      sample1 sample2 sample1 sample2 sample3 | | | | | | | | | | -------------- --------------------------- | | | | group1 group2 

    ¿Alguna idea sobre cómo resolver esto?

    Tienes que usar algún tipo de estructura para mantener tus muestras en grupos:

     GROUPS = { "group1":["sample1","sample2"], "group2":["sample1","sample2","sample3"] } 

    entonces algo como esto:

     rule all: input: expand("{group}/variants/{group}.vcf.gz", group=list(GROUPS.keys())) rule alignment: input: rules.download.output.fastq output: '{group}/alignment/{sample}.bam' shell: "bash scripts/02_alignment.sh {wildcards.group} {wildcards.samples}" rule variant_calling: input: lambda wildcards: expand("{group}/alignment/{sample}.bam", group=wildcards.group, sample=GROUPS[wildcards.group] output: '{group}/variants/{group}.vcf.gz' shell: "bash scripts/03_variant_calling.sh {input} {output}" 

    Por supuesto, faltan reglas que no mostraste, ¡pero creo que obtendrás el punto!

    El comando de shell de la regla variant_calling puede ser difícil de manejar, pero siempre puede definir un directorio como parámetros como:

     params: groupAlignDir = "{group}/alignment" 

    y usar eso en la shell:

     "bash scripts/03_variant_calling.sh {params.groupAlignDir} {output}" 

    y obtenga todo el archivo bam en el directorio en su script “variant_calling.sh”