helpString += "Example get.lineage(taxonomy=amazon.silva.taxonomy, taxon=Bacteria;Firmicutes;Bacilli;Lactobacillales;).\n";
helpString += "Note: If you are running mothur in script mode you must wrap the taxon in ' characters so mothur will ignore the ; in the taxon.\n";
helpString += "Example get.lineage(taxonomy=amazon.silva.taxonomy, taxon='Bacteria;Firmicutes;Bacilli;Lactobacillales;').\n";
- helpString += "Note: No spaces between parameter labels (i.e. fasta), '=' and parameters (i.e.yourFasta).\n\n";
+ helpString += "Note: No spaces between parameter labels (i.e. fasta), '=' and parameters (i.e.yourFasta).\n";
return helpString;
}
catch(exception& e) {
//allow user to run help
if(option == "help") { help(); abort = true; calledHelp = true; }
+ else if(option == "citation") { citation(); abort = true; calledHelp = true;}
else {
vector<string> myArray = setParameters();
//check for required parameters
fastafile = validParameter.validFile(parameters, "fasta", true);
if (fastafile == "not open") { abort = true; }
- else if (fastafile == "not found") { fastafile = ""; }
+ else if (fastafile == "not found") { fastafile = ""; }
+ else { m->setFastaFile(fastafile); }
namefile = validParameter.validFile(parameters, "name", true);
if (namefile == "not open") { abort = true; }
else if (namefile == "not found") { namefile = ""; }
+ else { m->setNameFile(namefile); }
groupfile = validParameter.validFile(parameters, "group", true);
if (groupfile == "not open") { abort = true; }
else if (groupfile == "not found") { groupfile = ""; }
+ else { m->setGroupFile(groupfile); }
alignfile = validParameter.validFile(parameters, "alignreport", true);
if (alignfile == "not open") { abort = true; }
listfile = validParameter.validFile(parameters, "list", true);
if (listfile == "not open") { abort = true; }
else if (listfile == "not found") { listfile = ""; }
+ else { m->setListFile(listfile); }
taxfile = validParameter.validFile(parameters, "taxonomy", true);
if (taxfile == "not open") { abort = true; }
taxfile = m->getTaxonomyFile();
if (taxfile != "") { m->mothurOut("Using " + taxfile + " as input file for the taxonomy parameter."); m->mothurOutEndLine(); }
else { m->mothurOut("You have no current taxonomy file and the taxonomy parameter is required."); m->mothurOutEndLine(); abort = true; }
- }
+ }else { m->setTaxonomyFile(taxfile); }
string usedDups = "true";
string temp = validParameter.validFile(parameters, "dups", false);
if (taxons[0] == '\'') { taxons = taxons.substr(1); }
if (taxons[(taxons.length()-1)] == '\'') { taxons = taxons.substr(0, (taxons.length()-1)); }
}
-
+ m->splitAtChar(taxons, listOfTaxons, '-');
if ((fastafile == "") && (namefile == "") && (groupfile == "") && (alignfile == "") && (listfile == "") && (taxfile == "")) { m->mothurOut("You must provide one of the following: fasta, name, group, alignreport, taxonomy or listfile."); m->mothurOutEndLine(); abort = true; }
}
if (listfile != "") { readList(); }
- if (m->control_pressed) { outputTypes.clear(); for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } return 0; }
+ if (m->control_pressed) { outputTypes.clear(); for (int i = 0; i < outputNames.size(); i++) { m->mothurRemove(outputNames[i]); } return 0; }
if (outputNames.size() != 0) {
m->mothurOutEndLine();
while(!in.eof()){
- if (m->control_pressed) { in.close(); out.close(); remove(outputFileName.c_str()); return 0; }
+ if (m->control_pressed) { in.close(); out.close(); m->mothurRemove(outputFileName); return 0; }
Sequence currSeq(in);
name = currSeq.getName();
while(!in.eof()){
- if (m->control_pressed) { in.close(); out.close(); remove(outputFileName.c_str()); return 0; }
+ if (m->control_pressed) { in.close(); out.close(); m->mothurRemove(outputFileName); return 0; }
//read in list vector
ListVector list(in);
while(!in.eof()){
- if (m->control_pressed) { in.close(); out.close(); remove(outputFileName.c_str()); return 0; }
+ if (m->control_pressed) { in.close(); out.close(); m->mothurRemove(outputFileName); return 0; }
in >> firstCol;
in >> secondCol;
while(!in.eof()){
- if (m->control_pressed) { in.close(); out.close(); remove(outputFileName.c_str()); return 0; }
+ if (m->control_pressed) { in.close(); out.close(); m->mothurRemove(outputFileName); return 0; }
in >> name; //read from first column
string name, tax;
//bool wroteSomething = false;
-
- bool taxonsHasConfidence = false;
- vector< map<string, float> > searchTaxons;
- string noConfidenceTaxons = taxons;
- int hasConPos = taxons.find_first_of('(');
- if (hasConPos != string::npos) {
- taxonsHasConfidence = true;
- searchTaxons = getTaxons(taxons);
- noConfidenceTaxons = removeConfidences(taxons);
+ vector<bool> taxonsHasConfidence; taxonsHasConfidence.resize(listOfTaxons.size(), false);
+ vector< vector< map<string, float> > > searchTaxons; searchTaxons.resize(listOfTaxons.size());
+ vector<string> noConfidenceTaxons; noConfidenceTaxons.resize(listOfTaxons.size(), "");
+
+ for (int i = 0; i < listOfTaxons.size(); i++) {
+ noConfidenceTaxons[i] = listOfTaxons[i];
+ int hasConPos = listOfTaxons[i].find_first_of('(');
+ if (hasConPos != string::npos) {
+ taxonsHasConfidence[i] = true;
+ searchTaxons[i] = getTaxons(listOfTaxons[i]);
+ noConfidenceTaxons[i] = removeConfidences(listOfTaxons[i]);
+ }
}
while(!in.eof()){
- if (m->control_pressed) { in.close(); out.close(); remove(outputFileName.c_str()); return 0; }
+ if (m->control_pressed) { in.close(); out.close(); m->mothurRemove(outputFileName); return 0; }
in >> name; //read from first column
in >> tax; //read from second column
- string newtax = tax;
-
+ for (int j = 0; j < listOfTaxons.size(); j++) {
+
+ string newtax = tax;
- //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 the users file contains confidence scores we want to ignore them when searching for the taxons, unless the taxon has them
+ if (!taxonsHasConfidence[j]) {
+ int hasConfidences = tax.find_first_of('(');
+ if (hasConfidences != string::npos) {
+ newtax = removeConfidences(tax);
+ }
- if (pos != string::npos) { //this sequence contains the taxon the user wants
- names.insert(name);
- out << name << '\t' << tax << endl;
- }
+ int pos = newtax.find(noConfidenceTaxons[j]);
- }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) { //this sequence contains the taxon the user wants
- names.insert(name);
+ names.insert(name);
out << name << '\t' << tax << endl;
+ //since you belong to at least one of the taxons we want you are included so no need to search for other
+ break;
}
- }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;
+ }else{//if listOfTaxons[i] has them and you don't them remove taxons
int hasConfidences = tax.find_first_of('(');
- if (hasConfidences != string::npos) {
- noNewTax = removeConfidences(tax);
- }
+ if (hasConfidences == string::npos) {
+
+ int pos = newtax.find(noConfidenceTaxons[j]);
- int pos = noNewTax.find(noConfidenceTaxons);
+ if (pos != string::npos) { //this sequence contains the taxon the user wants
+ names.insert(name);
+ out << name << '\t' << tax << endl;
+ //since you belong to at least one of the taxons we want you are included so no need to search for other
+ break;
+ }
+ }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);
+ }
- if (pos != string::npos) { //if yes, then are the confidences okay
+ int pos = noNewTax.find(noConfidenceTaxons[j]);
+
+ if (pos != string::npos) { //if yes, then are the confidences okay
- bool good = true;
- vector< map<string, float> > usersTaxon = getTaxons(newtax);
+ bool good = true;
+ vector< map<string, float> > 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++) {
+ //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 (usersTaxon[i].begin()->first == searchTaxons[j][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[j].size()) && ((i+spot) < usersTaxon.size())) {
+ if (usersTaxon[i+spot].begin()->first != searchTaxons[j][spot].begin()->first) { goodspot = false; break; }
+ else { spot++; }
+ }
- if (goodspot) { break; }
+ if (goodspot) { break; }
+ }
}
- }
- for (int i = 0; i < searchTaxons.size(); i++) {
+ for (int i = 0; i < searchTaxons[j].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
+ if ((i+index) < usersTaxon.size()) { //just in case, should never be false
+ if (usersTaxon[i+index].begin()->second < searchTaxons[j][i].begin()->second) { //is the users cutoff less than the search taxons
+ good = false;
+ break;
+ }
+ }else {
good = false;
break;
}
- }else {
- good = false;
- break;
}
- }
- //passed the test so add you
- if (good) {
- names.insert(name);
- out << name << '\t' << tax << endl;
+ //passed the test so add you
+ if (good) {
+ names.insert(name);
+ out << name << '\t' << tax << endl;
+ break;
+ }
}
}
}
- }
-
+ }
m->gobble(in);
}
while(!in.eof()){
- if (m->control_pressed) { in.close(); out.close(); remove(outputFileName.c_str()); return 0; }
+ if (m->control_pressed) { in.close(); out.close(); m->mothurRemove(outputFileName); return 0; }
in >> name; //read from first column