snakemake использует групповой ввод / вывод в функции python - PullRequest
1 голос
/ 18 марта 2020

У меня есть простая python функция, которая принимает входные данные и создает выходные данные

def enlarge_overlapping_region(input,output):
    fi=open(input,"r")
    fo=open(output,"w")
    df = pd.read_table(fi, delimiter='\t',header=None,names=["chr","start","end","point","score","strand","cdna_count","lib_count","region_type","region_id"])
    df1 = (df.groupby('region_id', as_index=False)
         .agg({'chr':'first', 'start':'min', 'end':'max','region_type':'first'})
         [['chr','start','end','region_type','region_id']])
    df1 = df1[df1.region_id != "."]
    df1.to_csv(fo,index=False, sep='\t')

    return(df1)

Я вызываю эту функцию в виде змеиного правила. Но я не могу получить доступ к файлу, я не знаю почему.

Я пробовал что-то подобное:

rule get_enlarged_dhs:
    input:
        "data/annotated_clones/{cdna}_paste_{lib}.annotated.bed"
    output:
        "data/enlarged_coordinates/{cdna}/{cdna}_paste_{lib}.enlarged_dhs.bed"
    run:
        lambda wildcards: enlarge_overlapping_region(f"{wildcards.input}",f"{wildcards.output}")

Я получил эту ошибку:

Missing files after 5 seconds:
data/enlarged_coordinates/pPGK_rep1/pPGK_rep1_paste_pPGK_input.enlarged_dhs.bed
This might be due to filesystem latency. If that is the case, consider to increase the wait time with --latency-wa
it.

Если Я вставил в правило код python так: h 1012 *

rule get_enlarged_dhs:
    input:
        "data/annotated_clones/{cdna}_paste_{lib}.annotated.bed"
    output:
        "data/enlarged_coordinates/{cdna}/{cdna}_paste_{lib}.enlarged_dhs.bed"
    run:
        fi=open(input,"r")
        fo=open(output,"w")
        df = pd.read_table(fi, delimiter='\t',header=None,names=["chr","start","end","point","score","strand","cdna_count","lib_count","region_type","region_id"])
        df1 = (df.groupby('region_id', as_index=False)
             .agg({'chr':'first', 'start':'min', 'end':'max','region_type':'first'})
             [['chr','start','end','region_type','region_id']])
        df1 = df1[df1.region_id != "."]
        df1.to_csv(fo,index=False, sep='\t')

Я получил эту ошибку:

expected str, bytes or os.PathLike object, not InputFiles

1 Ответ

2 голосов
/ 18 марта 2020

Это проще, чем вы думаете, вероятно:

lambda wildcards: enlarge_overlapping_region(f"{wildcards.input}",f"{wildcards.output}")

Должно быть:

enlarge_overlapping_region(input[0], output[0])

Аналогично, чтобы исправить второе решение, которое вы пробовали изменить:

fi=open(input,"r")
fo=open(output,"w")
* От 1009 * до
fi=open(input[0],"r")
fo=open(output[0],"w")

На мой взгляд, менее подвержено ошибкам присвоение имени входным и выходным файлам и использование этого имени в директивах run или shell. Например,

rule get_enlarged_dhs:
    input:
        bed= "...",
    output:
        bed= "...",
    run:
        enlarge_overlapping_region(input.bed, output.bed)
...