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 it = groupmap.find(seqName);
49 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(); }
51 groupmap[seqName] = seqGroup; //store data in map
52 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
61 vector<string> pieces = m->splitWhiteSpace(rest);
63 for (int i = 0; i < pieces.size(); i++) {
64 if (columnOne) { seqName = pieces[i]; columnOne=false; }
65 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
68 setNamesOfGroups(seqGroup);
70 it = groupmap.find(seqName);
72 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(); }
74 groupmap[seqName] = seqGroup; //store data in map
75 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
82 m->setAllGroups(namesOfGroups);
86 m->errorOut(e, "GroupMap", "readMap");
90 /************************************************************/
91 int GroupMap::readDesignMap() {
93 string seqName, seqGroup;
97 bool pairDone = false;
98 bool columnOne = true;
100 while (!fileHandle.eof()) {
101 if (m->control_pressed) { fileHandle.close(); return 1; }
103 fileHandle.read(buffer, 4096);
104 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
106 for (int i = 0; i < pieces.size(); i++) {
107 if (columnOne) { seqName = pieces[i]; columnOne=false; }
108 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
111 setNamesOfGroups(seqGroup);
113 it = groupmap.find(seqName);
115 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(); }
117 groupmap[seqName] = seqGroup; //store data in map
118 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
127 vector<string> pieces = m->splitWhiteSpace(rest);
129 for (int i = 0; i < pieces.size(); i++) {
130 if (columnOne) { seqName = pieces[i]; columnOne=false; }
131 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
134 setNamesOfGroups(seqGroup);
136 it = groupmap.find(seqName);
138 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(); }
140 groupmap[seqName] = seqGroup; //store data in map
141 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
149 m->setAllGroups(namesOfGroups);
152 catch(exception& e) {
153 m->errorOut(e, "GroupMap", "readDesignMap");
157 /************************************************************/
158 int GroupMap::readDesignMap(string filename) {
160 groupFileName = filename;
161 m->openInputFile(filename, fileHandle);
163 string seqName, seqGroup;
167 bool pairDone = false;
168 bool columnOne = true;
170 while (!fileHandle.eof()) {
171 if (m->control_pressed) { fileHandle.close(); return 1; }
173 fileHandle.read(buffer, 4096);
174 vector<string> pieces = m->splitWhiteSpace(rest, buffer, fileHandle.gcount());
176 for (int i = 0; i < pieces.size(); i++) {
177 if (columnOne) { seqName = pieces[i]; columnOne=false; }
178 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
181 setNamesOfGroups(seqGroup);
183 it = groupmap.find(seqName);
185 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(); }
187 groupmap[seqName] = seqGroup; //store data in map
188 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
197 vector<string> pieces = m->splitWhiteSpace(rest);
199 for (int i = 0; i < pieces.size(); i++) {
200 if (columnOne) { seqName = pieces[i]; columnOne=false; }
201 else { seqGroup = pieces[i]; pairDone = true; columnOne=true; }
204 setNamesOfGroups(seqGroup);
206 it = groupmap.find(seqName);
208 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(); }
210 groupmap[seqName] = seqGroup; //store data in map
211 seqsPerGroup[seqGroup]++; //increment number of seqs in that group
218 m->setAllGroups(namesOfGroups);
221 catch(exception& e) {
222 m->errorOut(e, "GroupMap", "readDesignMap");
226 /************************************************************/
227 int GroupMap::getNumGroups() { return namesOfGroups.size(); }
228 /************************************************************/
230 string GroupMap::getGroup(string sequenceName) {
232 it = groupmap.find(sequenceName);
233 if (it != groupmap.end()) { //sequence name was in group file
240 /************************************************************/
242 void GroupMap::setGroup(string sequenceName, string groupN) {
243 setNamesOfGroups(groupN);
245 it = groupmap.find(sequenceName);
247 if (it != groupmap.end()) { m->mothurOut("Your groupfile contains more than 1 sequence named " + sequenceName + ", sequence names must be unique. Please correct."); m->mothurOutEndLine(); }
249 groupmap[sequenceName] = groupN; //store data in map
250 seqsPerGroup[groupN]++; //increment number of seqs in that group
254 /************************************************************/
255 void GroupMap::setNamesOfGroups(string seqGroup) {
258 for (i=0; i<namesOfGroups.size(); i++) {
259 if (namesOfGroups[i] != seqGroup) {
260 count++; //you have not found this group
262 break; //you already have it
265 if (count == namesOfGroups.size()) {
266 namesOfGroups.push_back(seqGroup); //new group
267 seqsPerGroup[seqGroup] = 0;
268 groupIndex[seqGroup] = index;
272 /************************************************************/
273 bool GroupMap::isValidGroup(string groupname) {
275 for (int i = 0; i < namesOfGroups.size(); i++) {
276 if (groupname == namesOfGroups[i]) { return true; }
281 catch(exception& e) {
282 m->errorOut(e, "GroupMap", "isValidGroup");
286 /************************************************************/
287 int GroupMap::getNumSeqs(string group) {
290 map<string, int>::iterator itNum;
292 itNum = seqsPerGroup.find(group);
294 if (itNum == seqsPerGroup.end()) { return 0; }
296 return seqsPerGroup[group];
299 catch(exception& e) {
300 m->errorOut(e, "GroupMap", "getNumSeqs");
305 /************************************************************/
306 vector<string> GroupMap::getNamesSeqs(){
309 vector<string> names;
311 for (it = groupmap.begin(); it != groupmap.end(); it++) {
312 names.push_back(it->first);
317 catch(exception& e) {
318 m->errorOut(e, "GroupMap", "getNamesSeqs");
322 /************************************************************/
323 vector<string> GroupMap::getNamesSeqs(vector<string> picked){
326 vector<string> names;
328 for (it = groupmap.begin(); it != groupmap.end(); it++) {
329 //if you are belong to one the the groups in the picked vector add you
330 if (m->inUsersGroups(it->second, picked)) {
331 names.push_back(it->first);
337 catch(exception& e) {
338 m->errorOut(e, "GroupMap", "getNamesSeqs");
343 /************************************************************/