X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=treemap.cpp;h=1fc5c01b796a67bd948a70147fa4dead9320ea08;hb=2bb9267aa4b4ecdf8488b06605cc9f3f36fa4332;hp=6314eb04d04006ba5c57808f6927bddec89d6a00;hpb=b2dca66a02f8f82aa5528e531eace60fbbd2967b;p=mothur.git diff --git a/treemap.cpp b/treemap.cpp index 6314eb0..1fc5c01 100644 --- a/treemap.cpp +++ b/treemap.cpp @@ -12,42 +12,87 @@ /************************************************************/ TreeMap::TreeMap(string filename) { + m = MothurOut::getInstance(); groupFileName = filename; - openInputFile(filename, fileHandle); + m->openInputFile(filename, fileHandle); } /************************************************************/ - TreeMap::~TreeMap(){}; + TreeMap::~TreeMap(){} /************************************************************/ -void TreeMap::readMap() { +int TreeMap::readMap() { string seqName, seqGroup; - + int error = 0; + while(fileHandle){ - fileHandle >> seqName; //read from first column + fileHandle >> seqName; //read from first column fileHandle >> seqGroup; //read from second column - namesOfSeqs.push_back(seqName); - setNamesOfGroups(seqGroup); - - treemap[seqName].groupname = seqGroup; //store data in map + if (m->control_pressed) { fileHandle.close(); return 1; } - it2 = seqsPerGroup.find(seqGroup); - if (it2 == seqsPerGroup.end()) { //if it's a new group - seqsPerGroup[seqGroup] = 1; - }else {//it's a group we already have - seqsPerGroup[seqGroup]++; + setNamesOfGroups(seqGroup); + + map::iterator itCheck = treemap.find(seqName); + if (itCheck != treemap.end()) { error = 1; m->mothurOut("[WARNING]: Your groupfile contains more than 1 sequence named " + seqName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); } + else { + namesOfSeqs.push_back(seqName); + treemap[seqName].groupname = seqGroup; //store data in map + + it2 = seqsPerGroup.find(seqGroup); + if (it2 == seqsPerGroup.end()) { //if it's a new group + seqsPerGroup[seqGroup] = 1; + }else {//it's a group we already have + seqsPerGroup[seqGroup]++; + } } - - gobble(fileHandle); + + m->gobble(fileHandle); } fileHandle.close(); + + + return error; +} +/************************************************************/ +void TreeMap::addSeq(string seqName, string seqGroup) { + + namesOfSeqs.push_back(seqName); + setNamesOfGroups(seqGroup); + + treemap[seqName].groupname = seqGroup; //store data in map + + it2 = seqsPerGroup.find(seqGroup); + if (it2 == seqsPerGroup.end()) { //if it's a new group + seqsPerGroup[seqGroup] = 1; + }else {//it's a group we already have + seqsPerGroup[seqGroup]++; + } +} +/************************************************************/ +void TreeMap::removeSeq(string seqName) { + + //erase name from namesOfSeqs + for (int i = 0; i < namesOfSeqs.size(); i++) { + if (namesOfSeqs[i] == seqName) { + namesOfSeqs.erase(namesOfSeqs.begin()+i); + break; + } + } + + //decrement sequences in this group + string group = treemap[seqName].groupname; + seqsPerGroup[group]--; + + //remove seq from treemap + it = treemap.find(seqName); + treemap.erase(it); } /************************************************************/ int TreeMap::getNumGroups() { - return seqsPerGroup.size(); + return namesOfGroups.size(); } /************************************************************/ @@ -72,7 +117,13 @@ string TreeMap::getGroup(string sequenceName) { } /************************************************************/ void TreeMap::setIndex(string seq, int index) { - treemap[seq].vectorIndex = index; + it = treemap.find(seq); + if (it != treemap.end()) { //sequence name was in group file + treemap[seq].vectorIndex = index; + }else { + treemap[seq].vectorIndex = index; + treemap[seq].groupname = "not found"; + } } /************************************************************/ int TreeMap::getIndex(string seq) { @@ -110,11 +161,7 @@ bool TreeMap::isValidGroup(string groupname) { return false; } catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the TreeMap class Function isValidGroup. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the TreeMap class function isValidGroup. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + m->errorOut(e, "TreeMap", "isValidGroup"); exit(1); } } @@ -128,13 +175,60 @@ void TreeMap::print(ostream& output){ } } catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the TreeMap class Function print. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + m->errorOut(e, "TreeMap", "print"); exit(1); } - catch(...) { - cout << "An unknown error has occurred in the TreeMap class function print. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; +} + +/************************************************************/ +void TreeMap::makeSim(vector ThisnamesOfGroups) { + try { + //set names of groups + namesOfGroups = ThisnamesOfGroups; + + //set names of seqs to names of groups + namesOfSeqs = ThisnamesOfGroups; + + // make map where key and value are both the group name since that what the tree.shared command wants + for (int i = 0; i < namesOfGroups.size(); i++) { + treemap[namesOfGroups[i]].groupname = namesOfGroups[i]; + seqsPerGroup[namesOfGroups[i]] = 1; + } + + numGroups = namesOfGroups.size(); + + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "makeSim"); + exit(1); + } +} +/************************************************************/ +void TreeMap::makeSim(ListVector* list) { + try { + //set names of groups + namesOfGroups.clear(); + for(int i = 0; i < list->size(); i++) { + namesOfGroups.push_back(list->get(i)); + } + + //set names of seqs to names of groups + namesOfSeqs = namesOfGroups; + + // make map where key and value are both the group name since that what the tree.shared command wants + for (int i = 0; i < namesOfGroups.size(); i++) { + treemap[namesOfGroups[i]].groupname = namesOfGroups[i]; + seqsPerGroup[namesOfGroups[i]] = 1; + } + + numGroups = namesOfGroups.size(); + + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "makeSim"); exit(1); } } /************************************************************/ +