如何使用kseq.h解析FASTA文件

时间:2013-10-15 20:17:11

标签: c bioinformatics fasta

我已经知道这个来自Heng Li的库已经有一段时间了,但直到现在我还没有尝试使用它,主要是因为到目前为止python对我来说足够快。

以下是标题的链接:http://lh3lh3.users.sourceforge.net/kseq.shtml

当我尝试使用以下内容来解析fasta文件时,它会返回-1作为序列行的长度。我查看了Li的代码,这似乎主要是为FASTQ解析而设计的,但他确实在他的网页上说它也支持FASTA格式。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include "kseq.h"  
// STEP 1: declare the type of file handler and the read() function  
KSEQ_INIT(FILE*, read)


int main(int argc, char** argv) {
    FILE* fp = fopen(argv[1], "r"); // STEP 2: open the file handler
    kseq_t *seq = kseq_init(fp); // STEP 3: initialize seq 

    int l;

    while ((l = kseq_read(seq)) >= 0) { // STEP 4: read sequence  
        printf("name: %s\n", seq->name.s);  
        if (seq->comment.l) printf("comment: %s\n", seq->comment.s);  
        printf("seq: %s\n", seq->seq.s);  
        if (seq->qual.l) printf("qual: %s\n", seq->qual.s);  
    }

    printf("return value: %d\n", l);  
    kseq_destroy(seq); // STEP 5: destroy seq
    fclose(fp);

    return (0);
}

我一直用来测试的FASTA是Hg19 GRCH37 ChrY.fa文件,可从多个来源获得,包括Broad Institute。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:6)

首先你应该检查fopen()的返回值:

FILE* fp = fopen(argv[1], "r"); // STEP 2: open the file handler
if(fp == 0) {
    perror("fopen");
    exit(1);
}

其次,我查看了头文件,我认为kseg_init采用的是fd而不是FILE *。 您可以使用fileno()从FILE *获取fd。

kseq_t *seq = kseq_init(fp); // STEP 3: initialize seq 

应该是:

kseq_t *seq = kseq_init(fileno(fp)); // STEP 3: initialize seq 

答案 1 :(得分:0)

以下是适合我的完整代码

#include <zlib.h>
#include <stdio.h>
#include "kseq.h"
KSEQ_INIT(int, read)

int main(int argc, char **argv)
{
        FILE* fp;
        kseq_t *seq;
        int n = 0, slen = 0, qlen = 0;
        fp = fopen(argv[1], "r");
        seq = kseq_init(fileno(fp));
        while (kseq_read(seq) >= 0)
                ++n ;//slen += seq->seq.l, qlen += seq->qual.l;
        printf("%d\t%d\t%d\n", n, slen, qlen);
        kseq_destroy(seq);
        fclose(fp);
        return 0;
}