forked from mothur/mothur
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mothur.cpp
255 lines (213 loc) · 7.22 KB
/
mothur.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
/*
* interface.cpp
*
*
* Created by Pat Schloss on 8/14/08.
* Copyright 2008 Patrick D. Schloss. All rights reserved.
*
*/
#include "mothur.h"
#include "engine.hpp"
#include "mothurout.h"
#include "referencedb.h"
/**************************************************************************************************/
CommandFactory* CommandFactory::_uniqueInstance = 0;
MothurOut* MothurOut::_uniqueInstance = 0;
ReferenceDB* ReferenceDB::myInstance = 0;
/***********************************************************************/
volatile int ctrlc_pressed = 0;
void ctrlc_handler ( int sig ) {
MothurOut* m = MothurOut::getInstance();
ctrlc_pressed = 1;
m->control_pressed = ctrlc_pressed;
if (m->executing) { //if mid command quit execution, else quit mothur
m->mothurOutEndLine(); m->mothurOut("quitting command..."); m->mothurOutEndLine();
}else{
m->mothurOut("quitting mothur"); m->mothurOutEndLine();
exit(1);
}
}
/***********************************************************************/
int main(int argc, char *argv[]){
MothurOut* m = MothurOut::getInstance();
try {
signal(SIGINT, ctrlc_handler );
time_t ltime = time(NULL); /* calendar time */
string logFileName = "mothur." + toString(ltime) + ".logfile";
#ifdef USE_MPI
MPI_Init(&argc, &argv);
#endif
m->setFileName(logFileName);
#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
system("clear");
#else
system("CLS");
#endif
#ifdef MOTHUR_FILES
string temp = MOTHUR_FILES;
//add / to name if needed
string lastChar = temp.substr(temp.length()-1);
#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
if (lastChar != "/") { temp += "/"; }
#else
if (lastChar != "\\") { temp += "\\"; }
#endif
temp = m->getFullPathName(temp);
m->setDefaultPath(temp);
#endif
#ifdef USE_MPI
int version, subversion;
MPI_Get_version(&version, &subversion);
#endif
//get releaseDate from Make
string releaseDate = RELEASE_DATE;
string mothurVersion = VERSION;
m->setReleaseDate(releaseDate);
m->setVersion(mothurVersion);
//will make the gui output "pretty"
bool outputHeader = true;
if (argc>1) {
string guiInput = argv[1];
if (guiInput[0] == '+') { outputHeader = false; }
if (guiInput[0] == '-') { outputHeader = false; }
}
if (outputHeader) {
//version
#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
#if defined (__APPLE__) || (__MACH__)
m->mothurOutJustToLog("Mac version");
m->mothurOutEndLine(); m->mothurOutEndLine();
#else
m->mothurOutJustToLog("Linux version");
m->mothurOutEndLine(); m->mothurOutEndLine();
#endif
#else
m->mothurOutJustToLog("Windows version");
m->mothurOutEndLine(); m->mothurOutEndLine();
#endif
#ifdef USE_READLINE
m->mothurOutJustToLog("Using ReadLine");
m->mothurOutEndLine(); m->mothurOutEndLine();
#endif
#ifdef MOTHUR_FILES
m->mothurOutJustToLog("Using default file location " + temp);
m->mothurOutEndLine(); m->mothurOutEndLine();
#endif
#ifdef BIT_VERSION
m->mothurOutJustToLog("Running 64Bit Version");
m->mothurOutEndLine(); m->mothurOutEndLine();
#else
m->mothurOutJustToLog("Running 32Bit Version");
m->mothurOutEndLine(); m->mothurOutEndLine();
#endif
//header
m->mothurOut("mothur v." + mothurVersion);
m->mothurOutEndLine();
m->mothurOut("Last updated: " + releaseDate);
m->mothurOutEndLine();
m->mothurOutEndLine();
m->mothurOut("by");
m->mothurOutEndLine();
m->mothurOut("Patrick D. Schloss");
m->mothurOutEndLine();
m->mothurOutEndLine();
m->mothurOut("Department of Microbiology & Immunology");
m->mothurOutEndLine();
m->mothurOut("University of Michigan");
m->mothurOutEndLine();
m->mothurOut("pschloss@umich.edu");
m->mothurOutEndLine();
m->mothurOut("http://www.mothur.org");
m->mothurOutEndLine();
m->mothurOutEndLine();
m->mothurOut("When using, please cite:");
m->mothurOutEndLine();
m->mothurOut("Schloss, P.D., et al., Introducing mothur: Open-source, platform-independent, community-supported software for describing and comparing microbial communities. Appl Environ Microbiol, 2009. 75(23):7537-41.");
m->mothurOutEndLine();
m->mothurOutEndLine();
m->mothurOut("Distributed under the GNU General Public License");
m->mothurOutEndLine();
m->mothurOutEndLine();
m->mothurOut("Type 'help()' for information on the commands that are available");
m->mothurOutEndLine();
m->mothurOutEndLine();
m->mothurOut("Type 'quit()' to exit program");
m->mothurOutEndLine();
#ifdef USE_MPI
m->mothurOutJustToLog("Using MPI\tversion ");
m->mothurOutJustToLog(toString(version) + "." + toString(subversion) + "\n");
#endif
}
//srand(54321);
srand( (unsigned)time( NULL ) );
Engine* mothur = NULL;
bool bail = 0;
string input;
if(argc>1){
input = argv[1];
//m->mothurOut("input = " + input); m->mothurOutEndLine();
if (input[0] == '#') {
m->mothurOutJustToLog("Script Mode");
m->mothurOutEndLine(); m->mothurOutEndLine();
mothur = new ScriptEngine(argv[0], argv[1]);
}else if (input[0] == '+') {
mothur = new ScriptEngine(argv[0], argv[1]);
m->gui = true;
}else if (input == "-version") {
m->mothurOut("Mothur version=" + mothurVersion + "\nRelease Date=" + releaseDate); m->mothurOutEndLine(); m->mothurOutEndLine(); m->closeLog();
#ifdef USE_MPI
MPI_Finalize();
#endif
return 0;
}else{
m->mothurOutJustToLog("Batch Mode");
m->mothurOutEndLine(); m->mothurOutEndLine();
mothur = new BatchEngine(argv[0], argv[1]);
}
}
else{
m->mothurOutJustToLog("Interactive Mode");
m->mothurOutEndLine(); m->mothurOutEndLine();
mothur = new InteractEngine(argv[0]);
}
while(bail == 0) { bail = mothur->getInput(); }
//closes logfile so we can rename
m->closeLog();
string outputDir = mothur->getOutputDir();
string tempLog = mothur->getLogFileName();
bool append = mothur->getAppend();
string newlogFileName;
if (tempLog != "") {
newlogFileName = outputDir + tempLog;
if (!append) {
//need this because m->mothurOut makes the logfile, but doesn't know where to put it
rename(logFileName.c_str(), newlogFileName.c_str()); //logfile with timestamp
}else {
ofstream outNewLog;
m->openOutputFileAppend(newlogFileName, outNewLog);
if (!m->gui) {
outNewLog << endl << endl << "*********************************************************************************" << endl << endl;
}else {
outNewLog << endl;
}
outNewLog.close();
m->appendFiles(logFileName, newlogFileName);
m->mothurRemove(logFileName);
}
}else{
newlogFileName = outputDir + logFileName;
//need this because m->mothurOut makes the logfile, but doesn't know where to put it
rename(logFileName.c_str(), newlogFileName.c_str()); //logfile with timestamp
}
if (mothur != NULL) { delete mothur; }
#ifdef USE_MPI
MPI_Finalize();
#endif
return 0;
}
catch(exception& e) {
m->errorOut(e, "mothur", "main");
exit(1);
}
}
/**************************************************************************************************/