【发布时间】:2021-03-31 19:37:33
【问题描述】:
我有一个 C++ 代码,它读取一个 fasta 文件(单行读取)并在读取时滑动一个 l 窗口以生成 kmers。 像这样:
>NC_000913.3-2320800
GACGAAGCTGCCGACCAGCGTTTTATGTCAGTGCGGACATCAGCACTGCGTGAACAATTTGCCTGGCTGCGCGAGAACGGTTATCAACCGGTCAGTATTG
现在我有另一个 fasta 文件,它读取了不止一行这样的内容:
>LR2957 4054ae1b-13f5-89b1-e7b5-d64cabb8badb NC_000913.3,+strand,4451319-4510860 length=55312 error-free_length=59451 read_identity=74.36%
TGTAGTCCGTCAAGTTACGTTATTGCTACGTCTATCAGGGAAGTCAACCTGCCTGCAATA
TGGTAGATAAATCCTATTATGCCGCGAGACAACCCTTGGCTTCCTACACGCGCAGTGGAG
这个函数是:
void Sliding_window_l (const char *ptr, size_t length)
{
size_t p=0;
/*find start of a read*/
for(; ptr[p]!='>' && p<length; p++) {/*noop*/}
kmer_t kmer = 0;
while(p<length) {
//printf("hello second %c\n", ptr[p]);
assert(ptr[p]=='>'); /*this will be true*/
/*skip till newline*/
for(; p<length && ptr[p]!='\n'; p++) {/*noop*/ }
p++; /*skip the newline*/
if(p+LMER_LENGTH > length) break; /*too short a read*/
kmer = 0;
int i;
for(i=0; ptr[p]!='\n' && i<LMER_LENGTH-1; i++) {
kmer = lmer_shift(kmer, char_to_el(ptr[p++]));
//kmer = kmer_cons(kmer, i, char_to_el(ptr[p++]));
}
while(p<length && ptr[p]!='\n') {
kmer = lmer_shift(kmer, char_to_el(ptr[p++]));
lmer_frequency[kmer]++;
}
p++; /*skip the newline*/
}
}
该函数对于单行读取运行良好,但对于多行读取,我收到如下错误:
void Sliding_window_l(const char*, size_t): Assertion `ptr[p]=='>'' failed.
任何人都可以指导我如何修改该函数,以便它也可以用于多行读取。非常感谢。
【问题讨论】:
-
它可能是特定于操作系统的,也可能是特定于文件系统的。在 Linux 上,考虑 mmap(2) 和 readahead(2) 和 posix_fadvise(2) 和 madvise(2)。在你的问题中也提供一些minimal reproducible example
标签: c++ bioinformatics multiline fasta sliding-window