From 680c5392e6130f68e78f810a8232b09d49e4b1e6 Mon Sep 17 00:00:00 2001 From: Guoyi Zhang Date: Fri, 5 Jul 2024 11:35:53 +1000 Subject: [PATCH] polish: sortdiamond modularity --- sortdiamond.cpp | 128 +++++++++++++++++++++++++----------------------- 1 file changed, 68 insertions(+), 60 deletions(-) diff --git a/sortdiamond.cpp b/sortdiamond.cpp index 2ac5077..3141dac 100644 --- a/sortdiamond.cpp +++ b/sortdiamond.cpp @@ -64,6 +64,70 @@ string revcomp(const string &seq) { return revseq; } +void readInputFile(const string &filename, + map> &max_map) { + ifstream infile(filename); + if (!infile) { + cerr << "Error opening input file: " << filename << endl; + return; + } + + string line; + while (getline(infile, line)) { + istringstream iss(line); + string fields[20]; + int i = 0; + while (iss >> fields[i] && i < 20) { + i++; + } + string key = fields[1]; + double value = stod(fields[11]); + // Check if the key already exists in the map + if (max_map.find(key) != max_map.end()) { + // If the new value is greater, update the map + if (value > max_map[key].first) { + max_map[key] = make_pair(value, line); + } + } else { + // If the key does not exist, insert the new key-value + // pair + max_map[key] = make_pair(value, line); + } + } + infile.close(); +} + +void processMap(const map> &max_map, + vector> &result) { + for (const auto &entry : max_map) { + istringstream iss(entry.second.second); + string fields[20]; + int i = 0; + while (iss >> fields[i] && i < 20) { + i++; + } + if (stoi(fields[6]) > stoi(fields[7])) { + fields[17] = revcomp(fields[17]); + } + result.push_back(make_pair(">" + fields[1], fields[17])); + } + sort(result.begin(), result.end()); +} + +void writeOutputFile(const string &filename, + const vector> &result) { + ofstream outfile(filename); + if (!outfile) { + cerr << "Error opening output file: " << filename << endl; + return; + } + + for (const auto &entry : result) { + outfile << entry.first << "\n" << entry.second << "\n"; + } + outfile.close(); +} + int main(int argc, char *argv[]) { if (argc != 3) { cerr << "Usage: " << argv[0] << " " @@ -74,69 +138,13 @@ int main(int argc, char *argv[]) { string in_name = argv[1]; string ot_name = argv[2]; - ifstream infile(in_name); - if (!infile) { - cerr << "Error opening input file: " << in_name << endl; - return 1; - } - - ofstream outfile(ot_name); - if (!outfile) { - cerr << "Error opening output file: " << ot_name << endl; - return 1; - } - - map> - max_map; // Key: sseqid, Value: pair - string line; - - while (getline(infile, line)) { - istringstream iss(line); - string fields[20]; // Adjust size if needed - int i = 0; - - while (iss >> fields[i] && i < 20) { - i++; - } - - string key = fields[1]; - double value = stod(fields[11]); - - if (max_map.find(key) != max_map.end()) { - if (value > max_map[key].first) { - max_map[key] = make_pair(value, line); - } - } else { - max_map[key] = make_pair(value, line); - } - } + map> max_map; + readInputFile(in_name, max_map); vector> result; + processMap(max_map, result); - for (const auto &entry : max_map) { - istringstream iss(entry.second.second); - string fields[20]; // Adjust size if needed - int i = 0; - - while (iss >> fields[i] && i < 20) { - i++; - } - - if (stoi(fields[6]) > stoi(fields[7])) { - fields[17] = revcomp(fields[17]); - } - - result.push_back(make_pair(">" + fields[1], fields[17])); - } - - sort(result.begin(), result.end()); - - for (const auto &entry : result) { - outfile << entry.first << "\n" << entry.second << endl; - } - - infile.close(); - outfile.close(); + writeOutputFile(ot_name, result); return 0; }