5 * Created by Sarah Westcott on 1/26/09.
6 * Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
12 /************************************************************/
14 TreeMap::TreeMap(string filename) {
15 m = MothurOut::getInstance();
17 m->openOutputFileAppend(filename, out2);
18 out2 << endl; out2.close();
19 groupFileName = filename;
20 m->openInputFile(filename, fileHandle);
23 /************************************************************/
25 /************************************************************/
26 int TreeMap::readMap(string gf) {
29 m->openOutputFileAppend(gf, out2);
30 out2 << endl; out2.close();
33 m->openInputFile(gf, fileHandle);
35 string seqName, seqGroup;
40 bool pairDone = false;
41 bool columnOne = true;
43 while (!fileHandle.eof()) {
44 if (m->control_pressed) { fileHandle.close(); return 1; }
46 fileHandle.read(buffer, 4096);
47 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
49 for (int i = 0; i < pieces.size(); i++) {
50 if (columnOne) { seqName = pieces[i]; columnOne=false; }
51 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
54 setNamesOfGroups(seqGroup);
56 map<string, GroupIndex>::iterator itCheck = treemap.find(seqName);
57 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(); }
59 namesOfSeqs.push_back(seqName);
60 treemap[seqName].groupname = seqGroup; //store data in map
62 it2 = seqsPerGroup.find(seqGroup);
63 if (it2 == seqsPerGroup.end()) { //if it's a new group
64 seqsPerGroup[seqGroup] = 1;
65 }else {//it's a group we already have
66 seqsPerGroup[seqGroup]++;
76 vector<string> pieces = m->splitWhiteSpace(rest);
78 for (int i = 0; i < pieces.size(); i++) {
79 if (columnOne) { seqName = pieces[i]; columnOne=false; }
80 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
83 setNamesOfGroups(seqGroup);
85 map<string, GroupIndex>::iterator itCheck = treemap.find(seqName);
86 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(); }
88 namesOfSeqs.push_back(seqName);
89 treemap[seqName].groupname = seqGroup; //store data in map
91 it2 = seqsPerGroup.find(seqGroup);
92 if (it2 == seqsPerGroup.end()) { //if it's a new group
93 seqsPerGroup[seqGroup] = 1;
94 }else {//it's a group we already have
95 seqsPerGroup[seqGroup]++;
105 catch(exception& e) {
106 m->errorOut(e, "TreeMap", "readMap");
111 /************************************************************/
112 int TreeMap::readMap() {
114 string seqName, seqGroup;
119 bool pairDone = false;
120 bool columnOne = true;
122 while (!fileHandle.eof()) {
123 if (m->control_pressed) { fileHandle.close(); return 1; }
125 fileHandle.read(buffer, 4096);
126 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
128 for (int i = 0; i < pieces.size(); i++) {
129 if (columnOne) { seqName = pieces[i]; columnOne=false; }
130 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
133 setNamesOfGroups(seqGroup);
135 map<string, GroupIndex>::iterator itCheck = treemap.find(seqName);
136 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(); }
138 namesOfSeqs.push_back(seqName);
139 treemap[seqName].groupname = seqGroup; //store data in map
141 it2 = seqsPerGroup.find(seqGroup);
142 if (it2 == seqsPerGroup.end()) { //if it's a new group
143 seqsPerGroup[seqGroup] = 1;
144 }else {//it's a group we already have
145 seqsPerGroup[seqGroup]++;
155 vector<string> pieces = m->splitWhiteSpace(rest);
157 for (int i = 0; i < pieces.size(); i++) {
158 if (columnOne) { seqName = pieces[i]; columnOne=false; }
159 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
162 setNamesOfGroups(seqGroup);
164 map<string, GroupIndex>::iterator itCheck = treemap.find(seqName);
165 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(); }
167 namesOfSeqs.push_back(seqName);
168 treemap[seqName].groupname = seqGroup; //store data in map
170 it2 = seqsPerGroup.find(seqGroup);
171 if (it2 == seqsPerGroup.end()) { //if it's a new group
172 seqsPerGroup[seqGroup] = 1;
173 }else {//it's a group we already have
174 seqsPerGroup[seqGroup]++;
184 catch(exception& e) {
185 m->errorOut(e, "TreeMap", "readMap");
189 /************************************************************/
190 void TreeMap::addSeq(string seqName, string seqGroup) {
192 namesOfSeqs.push_back(seqName);
193 setNamesOfGroups(seqGroup);
195 treemap[seqName].groupname = seqGroup; //store data in map
197 it2 = seqsPerGroup.find(seqGroup);
198 if (it2 == seqsPerGroup.end()) { //if it's a new group
199 seqsPerGroup[seqGroup] = 1;
200 }else {//it's a group we already have
201 seqsPerGroup[seqGroup]++;
204 /************************************************************/
205 void TreeMap::removeSeq(string seqName) {
207 //erase name from namesOfSeqs
208 for (int i = 0; i < namesOfSeqs.size(); i++) {
209 if (namesOfSeqs[i] == seqName) {
210 namesOfSeqs.erase(namesOfSeqs.begin()+i);
215 //decrement sequences in this group
216 string group = treemap[seqName].groupname;
217 seqsPerGroup[group]--;
219 //remove seq from treemap
220 it = treemap.find(seqName);
223 /************************************************************/
225 int TreeMap::getNumGroups() {
227 return namesOfGroups.size();
230 /************************************************************/
232 int TreeMap::getNumSeqs() {
234 return namesOfSeqs.size();
238 /************************************************************/
240 string TreeMap::getGroup(string sequenceName) {
242 it = treemap.find(sequenceName);
243 if (it != treemap.end()) { //sequence name was in group file
244 return it->second.groupname;
250 /************************************************************/
252 void TreeMap::setNamesOfGroups(string seqGroup) {
255 for (i=0; i<namesOfGroups.size(); i++) {
256 if (namesOfGroups[i] != seqGroup) {
257 count++; //you have not found this group
259 break; //you already have it
262 if (count == namesOfGroups.size()) {
263 namesOfGroups.push_back(seqGroup); //new group
266 /************************************************************/
267 bool TreeMap::isValidGroup(string groupname) {
269 for (int i = 0; i < namesOfGroups.size(); i++) {
270 if (groupname == namesOfGroups[i]) { return true; }
275 catch(exception& e) {
276 m->errorOut(e, "TreeMap", "isValidGroup");
280 /***********************************************************************/
282 void TreeMap::print(ostream& output){
285 for(it = treemap.begin(); it != treemap.end(); it++){
286 output << it->first << '\t' << it->second.groupname << '\t' << it->second.vectorIndex << endl;
289 catch(exception& e) {
290 m->errorOut(e, "TreeMap", "print");
295 /************************************************************/
296 void TreeMap::makeSim(vector<string> ThisnamesOfGroups) {
298 //set names of groups
299 namesOfGroups = ThisnamesOfGroups;
301 //set names of seqs to names of groups
302 namesOfSeqs = ThisnamesOfGroups;
304 // make map where key and value are both the group name since that what the tree.shared command wants
305 for (int i = 0; i < namesOfGroups.size(); i++) {
306 treemap[namesOfGroups[i]].groupname = namesOfGroups[i];
307 seqsPerGroup[namesOfGroups[i]] = 1;
310 numGroups = namesOfGroups.size();
313 catch(exception& e) {
314 m->errorOut(e, "TreeMap", "makeSim");
318 /************************************************************/
319 void TreeMap::makeSim(ListVector* list) {
321 //set names of groups
322 namesOfGroups.clear();
323 for(int i = 0; i < list->size(); i++) {
324 namesOfGroups.push_back(list->get(i));
327 //set names of seqs to names of groups
328 namesOfSeqs = namesOfGroups;
330 // make map where key and value are both the group name since that what the tree.shared command wants
331 for (int i = 0; i < namesOfGroups.size(); i++) {
332 treemap[namesOfGroups[i]].groupname = namesOfGroups[i];
333 seqsPerGroup[namesOfGroups[i]] = 1;
336 numGroups = namesOfGroups.size();
339 catch(exception& e) {
340 m->errorOut(e, "TreeMap", "makeSim");
344 /************************************************************/
345 int TreeMap::getCopy(TreeMap& copy){
348 namesOfGroups = copy.getNamesOfGroups();
349 numGroups = copy.getNumGroups();
350 namesOfSeqs = copy.namesOfSeqs;
351 seqsPerGroup = copy.seqsPerGroup;
352 treemap = copy.treemap;
356 catch(exception& e) {
357 m->errorOut(e, "TreeMap", "getCopy");
361 /************************************************************/
362 vector<string> TreeMap::getNamesSeqs(){
365 vector<string> names;
367 for(it = treemap.begin(); it != treemap.end(); it++){
368 names.push_back(it->first);
373 catch(exception& e) {
374 m->errorOut(e, "TreeMap", "getNamesSeqs");
378 /************************************************************/
379 vector<string> TreeMap::getNamesSeqs(vector<string> picked){
382 vector<string> names;
384 for(it = treemap.begin(); it != treemap.end(); it++){
385 //if you are belong to one the the groups in the picked vector add you
386 if (m->inUsersGroups(it->second.groupname, picked)) {
387 names.push_back(it->first);
393 catch(exception& e) {
394 m->errorOut(e, "TreeMap", "getNamesSeqs");
399 /************************************************************/