void FastaIndex::readIndexFile(string fname) { string line; long long linenum = 0; indexFile.open(fname.c_str(), ifstream::in); if (indexFile.is_open()) { while (getline (indexFile, line)) { ++linenum; // the fai format defined in samtools is tab-delimited, every line being: // fai->name[i], (int)x.len, (long long)x.offset, (int)x.line_blen, (int)x.line_len vector<string> fields = split(line, '\t'); if (fields.size() == 5) { // if we don't get enough fields then there is a problem with the file // note that fields[0] is the sequence name char* end; string name = split(fields[0], " \t").at(0); // key by first token of name sequenceNames.push_back(name); this->insert(make_pair(name, FastaIndexEntry(fields[0], atoi(fields[1].c_str()), strtoll(fields[2].c_str(), &end, 10), atoi(fields[3].c_str()), atoi(fields[4].c_str())))); } else { cerr << "Warning: malformed fasta index file " << fname << "does not have enough fields @ line " << linenum << endl; cerr << line << endl; exit(1); } } } else { cerr << "could not open index file " << fname << endl; exit(1); } }
void FastaIndex::flushEntryToIndex(FastaIndexEntry& entry) { string name = split(entry.name, " \t").at(0); // key by first token of name sequenceNames.push_back(name); this->insert(make_pair(name, FastaIndexEntry(entry.name, entry.length, entry.offset, entry.line_blen, entry.line_len))); }