]> git.donarmstrong.com Git - mothur.git/blob - readcolumn.cpp
added checks for ^C to quit command instead of program
[mothur.git] / readcolumn.cpp
1 /*\r
2  *  readcolumn.cpp\r
3  *  Mothur\r
4  *\r
5  *  Created by Sarah Westcott on 4/21/09.\r
6  *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.\r
7  *\r
8  */\r
9 \r
10 #include "readcolumn.h"\r
11 #include "progress.hpp"\r
12 \r
13 /***********************************************************************/\r
14 \r
15 ReadColumnMatrix::ReadColumnMatrix(string df) : distFile(df){\r
16         \r
17         successOpen = openInputFile(distFile, fileHandle);\r
18         \r
19 }\r
20 \r
21 /***********************************************************************/\r
22 \r
23 int ReadColumnMatrix::read(NameAssignment* nameMap){\r
24         try {           \r
25 \r
26                 string firstName, secondName;\r
27                 float distance;\r
28                 int nseqs = nameMap->size();\r
29 \r
30                 list = new ListVector(nameMap->getListVector());\r
31         \r
32                 Progress* reading = new Progress("Reading matrix:     ", nseqs * nseqs);\r
33 \r
34                 int lt = 1;\r
35                 int refRow = 0; //we'll keep track of one cell - Cell(refRow,refCol) - and see if it's transpose\r
36                 int refCol = 0; //shows up later - Cell(refCol,refRow).  If it does, then its a square matrix\r
37 \r
38                 //need to see if this is a square or a triangular matrix...\r
39         \r
40                 while(fileHandle && lt == 1){  //let's assume it's a triangular matrix...\r
41 \r
42                 \r
43                         fileHandle >> firstName >> secondName >> distance;      // get the row and column names and distance\r
44                         \r
45                         if (m->control_pressed) {  fileHandle.close();  delete reading; return 0; }\r
46         \r
47                         map<string,int>::iterator itA = nameMap->find(firstName);\r
48                         map<string,int>::iterator itB = nameMap->find(secondName);\r
49                         \r
50                         if(itA == nameMap->end()){\r
51                                 cerr << "AAError: Sequence '" << firstName << "' was not found in the names file, please correct\n"; exit(1);\r
52                         }\r
53                         if(itB == nameMap->end()){\r
54                                 cerr << "ABError: Sequence '" << secondName << "' was not found in the names file, please correct\n"; exit(1);\r
55                         }\r
56 \r
57                         if (distance == -1) { distance = 1000000; }\r
58                         \r
59                         if(distance < cutoff && itA != itB){\r
60                                 if(itA->second > itB->second){\r
61                                         PCell value(itA->second, itB->second, distance);\r
62                         \r
63                                         if(refRow == refCol){           // in other words, if we haven't loaded refRow and refCol...\r
64                                                 refRow = itA->second;\r
65                                                 refCol = itB->second;\r
66                                                 D->addCell(value);\r
67                                         }\r
68                                         else if(refRow == itA->second && refCol == itB->second){\r
69                                                 lt = 0;\r
70                                         }\r
71                                         else{\r
72                                                 D->addCell(value);\r
73                                         }\r
74                                 }\r
75                                 else if(itA->second < itB->second){\r
76                                         PCell value(itB->second, itA->second, distance);\r
77                         \r
78                                         if(refRow == refCol){           // in other words, if we haven't loaded refRow and refCol...\r
79                                                 refRow = itA->second;\r
80                                                 refCol = itB->second;\r
81                                                 D->addCell(value);\r
82                                         }\r
83                                         else if(refRow == itB->second && refCol == itA->second){\r
84                                                 lt = 0;\r
85                                         }\r
86                                         else{\r
87                                                 D->addCell(value);\r
88                                         }\r
89                                 }\r
90                                 reading->update(itA->second * nseqs);\r
91                         }\r
92                         gobble(fileHandle);\r
93                 }\r
94 \r
95                 if(lt == 0){  // oops, it was square\r
96                         fileHandle.close();  //let's start over\r
97                         D->clear();  //let's start over\r
98                    \r
99                         openInputFile(distFile, fileHandle);  //let's start over\r
100 \r
101                         while(fileHandle){\r
102                                 fileHandle >> firstName >> secondName >> distance;\r
103                                 \r
104                                 if (m->control_pressed) {  fileHandle.close();  delete reading; return 0; }\r
105                 \r
106                                 map<string,int>::iterator itA = nameMap->find(firstName);\r
107                                 map<string,int>::iterator itB = nameMap->find(secondName);\r
108                                 \r
109                                 if(itA == nameMap->end()){\r
110                                         cerr << "BError: Sequence '" << firstName << "' was not found in the names file, please correct\n";\r
111                                 }\r
112                                 if(itB == nameMap->end()){\r
113                                         cerr << "BError: Sequence '" << secondName << "' was not found in the names file, please correct\n";\r
114                                 }\r
115                                 \r
116                                 if (distance == -1) { distance = 1000000; }\r
117                                 \r
118                                 if(distance < cutoff && itA->second > itB->second){\r
119                                         PCell value(itA->second, itB->second, distance);\r
120                                         D->addCell(value);\r
121                                         reading->update(itA->second * nseqs);\r
122                                 }\r
123                 \r
124                                 gobble(fileHandle);\r
125                         }\r
126                 }\r
127                 \r
128                 if (m->control_pressed) {  fileHandle.close();  delete reading; return 0; }\r
129                 \r
130                 reading->finish();\r
131                 fileHandle.close();\r
132 \r
133                 list->setLabel("0");\r
134                 \r
135                 return 1;\r
136 \r
137         }\r
138         catch(exception& e) {\r
139                 m->errorOut(e, "ReadColumnMatrix", "read");\r
140                 exit(1);\r
141         }\r
142 }\r
143 \r
144 /***********************************************************************/\r
145 \r
146 ReadColumnMatrix::~ReadColumnMatrix(){\r
147         //delete D;\r
148         //delete list;\r
149 }\r
150 \r
151 \r