es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando expand() en snakemake para ingresar cualquier archivo de una lista de directorios

Tengo una regla que toma cualquier archivo TSV (varios TSVs) de una lista de directorios definidos como tasks. Por ejemplo:

tasks
    foo
        example1.tsv
        circle.tsv
    bar
        rectangle.tsv
    square
        triangle.tsv
        triangle_1.tsv

Luego tengo una regla en un flujo de trabajo Snakemake que ejecuta un script en la lista de archivos de la siguiente manera:

task_list = ["bar", "square"]

rule gather_files:
        input:
            tsv=expand("results/stats/{tasks}/*.tsv", tasks=task_list)
        output: 
            "results/plots/visualizations.pdf"
        script:
            "Rscript plot_script.R"

El *.tsv produce errores cuando intento ejecutar la regla y sé que tampoco es la forma correcta. ¿Cuál es la mejor manera de hacer esto? ¿Debo usar regex para hacer coincidir cualquier cadena en {task}/*.tsv? Quiero limitar las combinaciones de directorios a expandir (tasks), pero no tengo restricciones en los nombres de archivo dentro de ellos.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para coincidir con cualquier archivo TSV de una lista de directorios definidos como tasks en un flujo de trabajo Snakemake, puedes usar la función glob_wildcards() para extraer los nombres de tarea y los nombres de archivo de los archivos de entrada, y luego filtrar según los nombres de tarea utilizando una lista de tareas permitidas. Aquí tienes un ejemplo de regla que hace esto:

    task_list = ["bar", "square"]
    
    rule gather_files:
        input:
            tsv=expand("results/stats/{task}/{filename}.tsv",
                        task=glob_wildcards("results/stats/{task}/{filename}.tsv").task,
                        filename=glob_wildcards("results/stats/{task}/{filename}.tsv").filename
                        )
        output: 
            "results/plots/visualizations.pdf"
        params:
            allowed_tasks=task_list
        script:
            "Rscript plot_script.R"
        wildcard_constraints:
            task="|".join(allowed_tasks)
    

    La función glob_wildcards() extrae las variables comodín task y filename de los archivos de entrada, que luego se utilizan para expandir el patrón de entrada tsv. El parámetro params.allowed_tasks especifica una lista de nombres de tarea permitidos, que se utiliza para restringir el comodín task a esos nombres de tarea permitidos utilizando el campo wildcard_constraints.

    Esta regla debería coincidir con cualquier archivo TSV en el directorio results/stats que tenga un nombre de tarea válido, y filtrar cualquier nombre de tarea no válido basado en el parámetro params.allowed_tasks.

Comments are closed.