5 * Created by Sarah Westcott on 12/1/08.
6 * Copyright 2008 Schloss Lab UMASS Amherst. All rights reserved.
12 /************************************************************/
14 GroupMap::GroupMap(string filename) {
15 m = MothurOut::getInstance();
16 groupFileName = filename;
17 m->openInputFile(filename, fileHandle);
21 /************************************************************/
22 GroupMap::~GroupMap(){}
24 /************************************************************/
25 int GroupMap::readMap() {
27 string seqName, seqGroup;
31 bool pairDone = false;
32 bool columnOne = true;
34 while (!fileHandle.eof()) {
35 if (m->control_pressed) { fileHandle.close(); return 1; }
37 fileHandle.read(buffer, 4096);
38 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
40 for (int i = 0; i < pieces.size(); i++) {
41 if (columnOne) { seqName = pieces[i]; columnOne=false; }
42 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
45 setNamesOfGroups(seqGroup);
47 if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "', group = '" + seqGroup + "'\n"); }
48 it = groupmap.find(seqName);
50 if (it != groupmap.end()) { error = 1; m->mothurOut("Your groupfile contains more than 1 sequence named " + seqName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
52 groupmap[seqName] = seqGroup; //store data in map
53 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
62 vector<string> pieces = m->splitWhiteSpace(rest);
64 for (int i = 0; i < pieces.size(); i++) {
65 if (columnOne) { seqName = pieces[i]; columnOne=false; }
66 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
69 setNamesOfGroups(seqGroup);
71 if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "', group = '" + seqGroup + "'\n"); }
73 it = groupmap.find(seqName);
75 if (it != groupmap.end()) { error = 1; m->mothurOut("Your groupfile contains more than 1 sequence named " + seqName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
77 groupmap[seqName] = seqGroup; //store data in map
78 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
85 m->setAllGroups(namesOfGroups);
89 m->errorOut(e, "GroupMap", "readMap");
93 /************************************************************/
94 int GroupMap::readDesignMap() {
96 string seqName, seqGroup;
100 bool pairDone = false;
101 bool columnOne = true;
103 while (!fileHandle.eof()) {
104 if (m->control_pressed) { fileHandle.close(); return 1; }
106 fileHandle.read(buffer, 4096);
107 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
109 for (int i = 0; i < pieces.size(); i++) {
110 if (columnOne) { seqName = pieces[i]; columnOne=false; }
111 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
114 setNamesOfGroups(seqGroup);
116 if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "', group = '" + seqGroup + "'\n"); }
118 it = groupmap.find(seqName);
120 if (it != groupmap.end()) { error = 1; m->mothurOut("Your designfile contains more than 1 sequence named " + seqName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
122 groupmap[seqName] = seqGroup; //store data in map
123 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
132 vector<string> pieces = m->splitWhiteSpace(rest);
134 for (int i = 0; i < pieces.size(); i++) {
135 if (columnOne) { seqName = pieces[i]; columnOne=false; }
136 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
139 setNamesOfGroups(seqGroup);
141 if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "', group = '" + seqGroup + "'\n"); }
143 it = groupmap.find(seqName);
145 if (it != groupmap.end()) { error = 1; m->mothurOut("Your designfile contains more than 1 sequence named " + seqName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
147 groupmap[seqName] = seqGroup; //store data in map
148 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
156 m->setAllGroups(namesOfGroups);
159 catch(exception& e) {
160 m->errorOut(e, "GroupMap", "readDesignMap");
164 /************************************************************/
165 int GroupMap::readDesignMap(string filename) {
167 groupFileName = filename;
168 m->openInputFile(filename, fileHandle);
170 string seqName, seqGroup;
174 bool pairDone = false;
175 bool columnOne = true;
177 while (!fileHandle.eof()) {
178 if (m->control_pressed) { fileHandle.close(); return 1; }
180 fileHandle.read(buffer, 4096);
181 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
183 for (int i = 0; i < pieces.size(); i++) {
184 if (columnOne) { seqName = pieces[i]; columnOne=false; }
185 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
188 setNamesOfGroups(seqGroup);
190 if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "', group = '" + seqGroup + "'\n"); }
192 it = groupmap.find(seqName);
194 if (it != groupmap.end()) { error = 1; m->mothurOut("Your designfile contains more than 1 sequence named " + seqName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
196 groupmap[seqName] = seqGroup; //store data in map
197 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
206 vector<string> pieces = m->splitWhiteSpace(rest);
208 for (int i = 0; i < pieces.size(); i++) {
209 if (columnOne) { seqName = pieces[i]; columnOne=false; }
210 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
213 setNamesOfGroups(seqGroup);
215 if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "', group = '" + seqGroup + "'\n"); }
217 it = groupmap.find(seqName);
219 if (it != groupmap.end()) { error = 1; m->mothurOut("Your designfile contains more than 1 sequence named " + seqName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
221 groupmap[seqName] = seqGroup; //store data in map
222 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
229 m->setAllGroups(namesOfGroups);
232 catch(exception& e) {
233 m->errorOut(e, "GroupMap", "readDesignMap");
237 /************************************************************/
238 int GroupMap::getNumGroups() { return namesOfGroups.size(); }
239 /************************************************************/
241 string GroupMap::getGroup(string sequenceName) {
243 it = groupmap.find(sequenceName);
244 if (it != groupmap.end()) { //sequence name was in group file
251 /************************************************************/
253 void GroupMap::setGroup(string sequenceName, string groupN) {
254 setNamesOfGroups(groupN);
256 it = groupmap.find(sequenceName);
258 if (it != groupmap.end()) { m->mothurOut("Your groupfile contains more than 1 sequence named " + sequenceName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
260 groupmap[sequenceName] = groupN; //store data in map
261 seqsPerGroup[groupN]++; //increment number of seqs in that group
265 /************************************************************/
266 void GroupMap::setNamesOfGroups(string seqGroup) {
269 for (i=0; i<namesOfGroups.size(); i++) {
270 if (namesOfGroups[i] != seqGroup) {
271 count++; //you have not found this group
273 break; //you already have it
276 if (count == namesOfGroups.size()) {
277 namesOfGroups.push_back(seqGroup); //new group
278 seqsPerGroup[seqGroup] = 0;
279 groupIndex[seqGroup] = index;
283 /************************************************************/
284 bool GroupMap::isValidGroup(string groupname) {
286 for (int i = 0; i < namesOfGroups.size(); i++) {
287 if (groupname == namesOfGroups[i]) { return true; }
292 catch(exception& e) {
293 m->errorOut(e, "GroupMap", "isValidGroup");
297 /************************************************************/
298 int GroupMap::getNumSeqs(string group) {
301 map<string, int>::iterator itNum;
303 itNum = seqsPerGroup.find(group);
305 if (itNum == seqsPerGroup.end()) { return 0; }
307 return seqsPerGroup[group];
310 catch(exception& e) {
311 m->errorOut(e, "GroupMap", "getNumSeqs");
316 /************************************************************/
317 vector<string> GroupMap::getNamesSeqs(){
320 vector<string> names;
322 for (it = groupmap.begin(); it != groupmap.end(); it++) {
323 names.push_back(it->first);
328 catch(exception& e) {
329 m->errorOut(e, "GroupMap", "getNamesSeqs");
333 /************************************************************/
334 vector<string> GroupMap::getNamesSeqs(vector<string> picked){
337 vector<string> names;
339 for (it = groupmap.begin(); it != groupmap.end(); it++) {
340 //if you are belong to one the the groups in the picked vector add you
341 if (m->inUsersGroups(it->second, picked)) {
342 names.push_back(it->first);
348 catch(exception& e) {
349 m->errorOut(e, "GroupMap", "getNamesSeqs");
354 /************************************************************/