+ //if the users file contains confidence scores we want to ignore them when searching for the taxons, unless the taxon has them
+ if (!taxonsHasConfidence) {
+ int hasConfidences = tax.find_first_of('(');
+ if (hasConfidences != string::npos) {
+ newtax = removeConfidences(tax);
+ }
+
+ int pos = newtax.find(taxons);
+
+ if (pos == string::npos) {
+ wroteSomething = true;
+ out << name << '\t' << tax << endl;
+ }else{ //this sequence contains the taxon the user wants to remove
+ names.insert(name);
+ }
+
+ }else{//if taxons has them and you don't them remove taxons
+ int hasConfidences = tax.find_first_of('(');
+ if (hasConfidences == string::npos) {
+
+ int pos = newtax.find(noConfidenceTaxons);
+
+ if (pos == string::npos) {
+ wroteSomething = true;
+ out << name << '\t' << tax << endl;
+ }else{ //this sequence contains the taxon the user wants to remove
+ names.insert(name);
+ }
+ }else { //both have confidences so we want to make sure the users confidences are greater then or equal to the taxons
+ //first remove confidences from both and see if the taxonomy exists
+
+ string noNewTax = tax;
+ int hasConfidences = tax.find_first_of('(');
+ if (hasConfidences != string::npos) {
+ noNewTax = removeConfidences(tax);
+ }
+
+ int pos = noNewTax.find(noConfidenceTaxons);
+
+ if (pos != string::npos) { //if yes, then are the confidences okay
+
+ bool remove = false;
+ vector< map<string, int> > usersTaxon = getTaxons(newtax);
+
+ //the usersTaxon is most likely longer than the searchTaxons, and searchTaxon[0] may relate to userTaxon[4]
+ //we want to "line them up", so we will find the the index where the searchstring starts
+ int index = 0;
+ for (int i = 0; i < usersTaxon.size(); i++) {
+
+ if (usersTaxon[i].begin()->first == searchTaxons[0].begin()->first) {
+ index = i;
+ int spot = 0;
+ bool goodspot = true;
+ //is this really the start, or are we dealing with a taxon of the same name?
+ while ((spot < searchTaxons.size()) && ((i+spot) < usersTaxon.size())) {
+ if (usersTaxon[i+spot].begin()->first != searchTaxons[spot].begin()->first) { goodspot = false; break; }
+ else { spot++; }
+ }
+
+ if (goodspot) { break; }
+ }
+ }
+
+ for (int i = 0; i < searchTaxons.size(); i++) {
+
+ if ((i+index) < usersTaxon.size()) { //just in case, should never be false
+ if (usersTaxon[i+index].begin()->second < searchTaxons[i].begin()->second) { //is the users cutoff less than the search taxons
+ remove = true;
+ break;
+ }
+ }else {
+ remove = true;
+ break;
+ }
+ }
+
+ //passed the test so remove you
+ if (remove) {
+ names.insert(name);
+ }else {
+ wroteSomething = true;
+ out << name << '\t' << tax << endl;
+ }
+ }else {
+ wroteSomething = true;
+ out << name << '\t' << tax << endl;
+ }
+ }