/** >HEADER Copyright (c) 2013 Rob Patro robp@cs.cmu.edu This file is part of Salmon. Salmon is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Salmon is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Salmon. If not, see .
#include #include #include std::ostream& operator<<(std::ostream& out, const TranscriptGeneID& ids) { out << "transcript_id => " << ids.transcript_id << ", gene_id => " << ids.gene_id; return out; } template std::ostream& operator<<(std::ostream& out, const GenomicFeature& gf) { out << "Feature: [" << "id :" << gf.seqID << ", " << "source : " << gf.source << ", " << "type : " << gf.type << ", " << "start : " << gf.start << ", " << "end : " << gf.end << ", " << "score : " << gf.score << ", " << "strand : " << gf.strand << ", " << "phase : " << gf.phase << " ** "; out << gf.sattr << ", "; /*for ( auto& kv : gf.attributes ) { out << kv.first << " => " << kv.second << ", "; } */ return out; } template std::istream& operator>>(std::istream& in, GenomicFeature& gf) { std::string line; std::getline(in, gf.seqID, '\t'); std::getline(in, gf.source, '\t'); std::getline(in, gf.type, '\t'); std::getline(in, line, '\t'); gf.start = atoi(line.c_str()); std::getline(in, line, '\t'); gf.end = atoi(line.c_str()); std::getline(in, line, '\t'); gf.score = atoi(line.c_str()); std::getline(in, line, '\t'); gf.strand = line[0]; std::getline(in, line, '\t'); gf.phase = line[0]; std::getline(in, line); using tokenizer = boost::tokenizer>; boost::char_separator sep(";"); tokenizer tokens(line, sep); for (auto tokIt : tokens) { // Currently, we'll handle the following separators // '\s+' // '\s*=\s*' tokIt = tokIt.substr(tokIt.find_first_not_of(' ')); auto kvsepStart = tokIt.find('='); // If we reached the end of the key, value token, then the string must have // been separated by some set of spaces, and NO '='. If this is the case, // find the 'spaces' so that we can split on it. if (kvsepStart == tokIt.npos) { kvsepStart = tokIt.find(' '); } auto key = tokIt.substr(0, kvsepStart); key = key.substr(0, key.find(' ')); auto kvsepStop = 1 + kvsepStart + tokIt.substr(kvsepStart + 1).find_first_not_of(' '); auto val = (tokIt[kvsepStop] == '"') ? tokIt.substr(kvsepStop + 1, (tokIt.length() - (kvsepStop + 2))) : tokIt.substr(kvsepStop, (tokIt.length() - (kvsepStop + 1))); gf.sattr.parseAttribute(key, val); } return in; }