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();
16 groupFileName = filename;
17 m->openInputFile(filename, fileHandle);
20 /************************************************************/
22 /************************************************************/
23 int TreeMap::readMap(string gf) {
26 m->openInputFile(gf, fileHandle);
28 string seqName, seqGroup;
33 bool pairDone = false;
34 bool columnOne = true;
36 while (!fileHandle.eof()) {
37 if (m->control_pressed) { fileHandle.close(); return 1; }
39 fileHandle.read(buffer, 4096);
40 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
42 for (int i = 0; i < pieces.size(); i++) {
43 if (columnOne) { seqName = pieces[i]; columnOne=false; }
44 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
47 setNamesOfGroups(seqGroup);
49 map<string, GroupIndex>::iterator itCheck = treemap.find(seqName);
50 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(); }
52 namesOfSeqs.push_back(seqName);
53 treemap[seqName].groupname = seqGroup; //store data in map
55 it2 = seqsPerGroup.find(seqGroup);
56 if (it2 == seqsPerGroup.end()) { //if it's a new group
57 seqsPerGroup[seqGroup] = 1;
58 }else {//it's a group we already have
59 seqsPerGroup[seqGroup]++;
71 m->errorOut(e, "TreeMap", "readMap");
76 /************************************************************/
77 int TreeMap::readMap() {
79 string seqName, seqGroup;
84 bool pairDone = false;
85 bool columnOne = true;
87 while (!fileHandle.eof()) {
88 if (m->control_pressed) { fileHandle.close(); return 1; }
90 fileHandle.read(buffer, 4096);
91 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
93 for (int i = 0; i < pieces.size(); i++) {
94 if (columnOne) { seqName = pieces[i]; columnOne=false; }
95 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
98 setNamesOfGroups(seqGroup);
100 map<string, GroupIndex>::iterator itCheck = treemap.find(seqName);
101 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(); }
103 namesOfSeqs.push_back(seqName);
104 treemap[seqName].groupname = seqGroup; //store data in map
106 it2 = seqsPerGroup.find(seqGroup);
107 if (it2 == seqsPerGroup.end()) { //if it's a new group
108 seqsPerGroup[seqGroup] = 1;
109 }else {//it's a group we already have
110 seqsPerGroup[seqGroup]++;
121 catch(exception& e) {
122 m->errorOut(e, "TreeMap", "readMap");
126 /************************************************************/
127 void TreeMap::addSeq(string seqName, string seqGroup) {
129 namesOfSeqs.push_back(seqName);
130 setNamesOfGroups(seqGroup);
132 treemap[seqName].groupname = seqGroup; //store data in map
134 it2 = seqsPerGroup.find(seqGroup);
135 if (it2 == seqsPerGroup.end()) { //if it's a new group
136 seqsPerGroup[seqGroup] = 1;
137 }else {//it's a group we already have
138 seqsPerGroup[seqGroup]++;
141 /************************************************************/
142 void TreeMap::removeSeq(string seqName) {
144 //erase name from namesOfSeqs
145 for (int i = 0; i < namesOfSeqs.size(); i++) {
146 if (namesOfSeqs[i] == seqName) {
147 namesOfSeqs.erase(namesOfSeqs.begin()+i);
152 //decrement sequences in this group
153 string group = treemap[seqName].groupname;
154 seqsPerGroup[group]--;
156 //remove seq from treemap
157 it = treemap.find(seqName);
160 /************************************************************/
162 int TreeMap::getNumGroups() {
164 return namesOfGroups.size();
167 /************************************************************/
169 int TreeMap::getNumSeqs() {
171 return namesOfSeqs.size();
175 /************************************************************/
177 string TreeMap::getGroup(string sequenceName) {
179 it = treemap.find(sequenceName);
180 if (it != treemap.end()) { //sequence name was in group file
181 return it->second.groupname;
187 /************************************************************/
188 void TreeMap::setIndex(string seq, int index) {
189 it = treemap.find(seq);
190 if (it != treemap.end()) { //sequence name was in group file
191 treemap[seq].vectorIndex = index;
193 treemap[seq].vectorIndex = index;
194 treemap[seq].groupname = "not found";
197 /************************************************************/
198 int TreeMap::getIndex(string seq) {
200 it = treemap.find(seq);
201 // if it is a valid sequence name then return index
202 if (it != treemap.end()) { return treemap[seq].vectorIndex; }
203 // if not return error code
207 /************************************************************/
209 void TreeMap::setNamesOfGroups(string seqGroup) {
212 for (i=0; i<namesOfGroups.size(); i++) {
213 if (namesOfGroups[i] != seqGroup) {
214 count++; //you have not found this group
216 break; //you already have it
219 if (count == namesOfGroups.size()) {
220 namesOfGroups.push_back(seqGroup); //new group
223 /************************************************************/
224 bool TreeMap::isValidGroup(string groupname) {
226 for (int i = 0; i < namesOfGroups.size(); i++) {
227 if (groupname == namesOfGroups[i]) { return true; }
232 catch(exception& e) {
233 m->errorOut(e, "TreeMap", "isValidGroup");
237 /***********************************************************************/
239 void TreeMap::print(ostream& output){
242 for(it = treemap.begin(); it != treemap.end(); it++){
243 output << it->first << '\t' << it->second.groupname << '\t' << it->second.vectorIndex << endl;
246 catch(exception& e) {
247 m->errorOut(e, "TreeMap", "print");
252 /************************************************************/
253 void TreeMap::makeSim(vector<string> ThisnamesOfGroups) {
255 //set names of groups
256 namesOfGroups = ThisnamesOfGroups;
258 //set names of seqs to names of groups
259 namesOfSeqs = ThisnamesOfGroups;
261 // make map where key and value are both the group name since that what the tree.shared command wants
262 for (int i = 0; i < namesOfGroups.size(); i++) {
263 treemap[namesOfGroups[i]].groupname = namesOfGroups[i];
264 seqsPerGroup[namesOfGroups[i]] = 1;
267 numGroups = namesOfGroups.size();
270 catch(exception& e) {
271 m->errorOut(e, "TreeMap", "makeSim");
275 /************************************************************/
276 void TreeMap::makeSim(ListVector* list) {
278 //set names of groups
279 namesOfGroups.clear();
280 for(int i = 0; i < list->size(); i++) {
281 namesOfGroups.push_back(list->get(i));
284 //set names of seqs to names of groups
285 namesOfSeqs = namesOfGroups;
287 // make map where key and value are both the group name since that what the tree.shared command wants
288 for (int i = 0; i < namesOfGroups.size(); i++) {
289 treemap[namesOfGroups[i]].groupname = namesOfGroups[i];
290 seqsPerGroup[namesOfGroups[i]] = 1;
293 numGroups = namesOfGroups.size();
296 catch(exception& e) {
297 m->errorOut(e, "TreeMap", "makeSim");
301 /************************************************************/
302 int TreeMap::getCopy(TreeMap& copy){
305 namesOfGroups = copy.getNamesOfGroups();
306 numGroups = copy.getNumGroups();
307 namesOfSeqs = copy.namesOfSeqs;
308 seqsPerGroup = copy.seqsPerGroup;
309 treemap = copy.treemap;
313 catch(exception& e) {
314 m->errorOut(e, "TreeMap", "getCopy");
318 /************************************************************/
319 vector<string> TreeMap::getNamesSeqs(){
322 vector<string> names;
324 for(it = treemap.begin(); it != treemap.end(); it++){
325 names.push_back(it->first);
330 catch(exception& e) {
331 m->errorOut(e, "TreeMap", "getNamesSeqs");
335 /************************************************************/
336 vector<string> TreeMap::getNamesSeqs(vector<string> picked){
339 vector<string> names;
341 for(it = treemap.begin(); it != treemap.end(); it++){
342 //if you are belong to one the the groups in the picked vector add you
343 if (m->inUsersGroups(it->second.groupname, picked)) {
344 names.push_back(it->first);
350 catch(exception& e) {
351 m->errorOut(e, "TreeMap", "getNamesSeqs");
356 /************************************************************/