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.
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ónglob_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:La función
glob_wildcards()
extrae las variables comodíntask
yfilename
de los archivos de entrada, que luego se utilizan para expandir el patrón de entradatsv
. El parámetroparams.allowed_tasks
especifica una lista de nombres de tarea permitidos, que se utiliza para restringir el comodíntask
a esos nombres de tarea permitidos utilizando el campowildcard_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ámetroparams.allowed_tasks
.