]> git.donarmstrong.com Git - mothur.git/blobdiff - treemap.cpp
added sequence name to error string in fastq.info. Changed np_shannon to npshannon.
[mothur.git] / treemap.cpp
index 6314eb04d04006ba5c57808f6927bddec89d6a00..1fc5c01b796a67bd948a70147fa4dead9320ea08 100644 (file)
 /************************************************************/
 
  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<string, GroupIndex>::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<string> 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);
        }
 }
 
 /************************************************************/
+