X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=treemap.cpp;h=47b7cf343635e2d104db75114aa77fbe8007c466;hp=58379da96ee0be5110f36d8ab022be04aea6e4f2;hb=1a20e24ee786195ab0e1cccd4f5aede7a88f3f4e;hpb=60fdefb3a300b59c3bbeffdca8a5f1f30c6a43af diff --git a/treemap.cpp b/treemap.cpp index 58379da..47b7cf3 100644 --- a/treemap.cpp +++ b/treemap.cpp @@ -12,29 +12,213 @@ /************************************************************/ TreeMap::TreeMap(string filename) { + m = MothurOut::getInstance(); + ofstream out2; + m->openOutputFileAppend(filename, out2); + out2 << endl; out2.close(); groupFileName = filename; - openInputFile(filename, fileHandle); + m->openInputFile(filename, fileHandle); } /************************************************************/ - TreeMap::~TreeMap(){}; + TreeMap::~TreeMap(){} +/************************************************************/ +int TreeMap::readMap(string gf) { + try { + ofstream out2; + m->openOutputFileAppend(gf, out2); + out2 << endl; out2.close(); + + groupFileName = gf; + m->openInputFile(gf, fileHandle); + + string seqName, seqGroup; + int error = 0; + + string rest = ""; + char buffer[4096]; + bool pairDone = false; + bool columnOne = true; + + while (!fileHandle.eof()) { + if (m->control_pressed) { fileHandle.close(); return 1; } + + fileHandle.read(buffer, 4096); + vector pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount()); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { seqName = pieces[i]; columnOne=false; } + else { seqGroup = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { + 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]++; + } + } + pairDone = false; + } + } + } + fileHandle.close(); + + if (rest != "") { + vector pieces = m->splitWhiteSpace(rest); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { seqName = pieces[i]; columnOne=false; } + else { seqGroup = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { + 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]++; + } + } + pairDone = false; + } + } + } + + return error; + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "readMap"); + exit(1); + } +} /************************************************************/ -void TreeMap::readMap() { - string seqName, seqGroup; +int TreeMap::readMap() { + try { + string seqName, seqGroup; + int error = 0; + + string rest = ""; + char buffer[4096]; + bool pairDone = false; + bool columnOne = true; + + while (!fileHandle.eof()) { + if (m->control_pressed) { fileHandle.close(); return 1; } + + fileHandle.read(buffer, 4096); + vector pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount()); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { seqName = pieces[i]; columnOne=false; } + else { seqGroup = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { + 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]++; + } + } + pairDone = false; + } + } + } + fileHandle.close(); + + if (rest != "") { + vector pieces = m->splitWhiteSpace(rest); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { seqName = pieces[i]; columnOne=false; } + else { seqGroup = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { + 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]++; + } + } + pairDone = false; + } + } + } + + return error; + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "readMap"); + exit(1); + } +} +/************************************************************/ +void TreeMap::addSeq(string seqName, string seqGroup) { - while(fileHandle){ - 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 - namesOfSeqs.push_back(seqName); - setNamesOfGroups(seqGroup); - - treemap[seqName].groupname = seqGroup; //store data in map - - gobble(fileHandle); + 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]++; } - fileHandle.close(); +} +/************************************************************/ +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); } /************************************************************/ @@ -62,20 +246,6 @@ string TreeMap::getGroup(string sequenceName) { return "not found"; } -} -/************************************************************/ -void TreeMap::setIndex(string seq, int index) { - treemap[seq].vectorIndex = index; -} -/************************************************************/ -int TreeMap::getIndex(string seq) { - - it = treemap.find(seq); - // if it is a valid sequence name then return index - if (it != treemap.end()) { return treemap[seq].vectorIndex; } - // if not return error code - else { return -1; } - } /************************************************************/ @@ -93,7 +263,20 @@ void TreeMap::setNamesOfGroups(string seqGroup) { namesOfGroups.push_back(seqGroup); //new group } } - +/************************************************************/ +bool TreeMap::isValidGroup(string groupname) { + try { + for (int i = 0; i < namesOfGroups.size(); i++) { + if (groupname == namesOfGroups[i]) { return true; } + } + + return false; + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "isValidGroup"); + exit(1); + } +} /***********************************************************************/ void TreeMap::print(ostream& output){ @@ -104,13 +287,114 @@ 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); + } +} +/************************************************************/ +int TreeMap::getCopy(TreeMap& copy){ + try { + + namesOfGroups = copy.getNamesOfGroups(); + numGroups = copy.getNumGroups(); + namesOfSeqs = copy.namesOfSeqs; + seqsPerGroup = copy.seqsPerGroup; + treemap = copy.treemap; + + return 0; + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "getCopy"); + exit(1); + } +} +/************************************************************/ +vector TreeMap::getNamesSeqs(){ + try { + + vector names; + + for(it = treemap.begin(); it != treemap.end(); it++){ + names.push_back(it->first); + } + + return names; + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "getNamesSeqs"); + exit(1); + } +} +/************************************************************/ +vector TreeMap::getNamesSeqs(vector picked){ + try { + + vector names; + + for(it = treemap.begin(); it != treemap.end(); it++){ + //if you are belong to one the the groups in the picked vector add you + if (m->inUsersGroups(it->second.groupname, picked)) { + names.push_back(it->first); + } + } + + return names; + } + catch(exception& e) { + m->errorOut(e, "TreeMap", "getNamesSeqs"); + exit(1); + } +} + +/************************************************************/ -/************************************************************/ \ No newline at end of file