-/*
- * m->mothurOut.cpp
- * Mothur
- *
- * Created by westcott on 2/25/10.
- * Copyright 2010 Schloss Lab. All rights reserved.
- *
- */
-
-#include "mothurout.h"
-
-/******************************************************/
-MothurOut* MothurOut::getInstance() {
- if( _uniqueInstance == 0) {
- _uniqueInstance = new MothurOut();
- }
- return _uniqueInstance;
-}
-/*********************************************************************************************/
-void MothurOut::setFileName(string filename) {
- try {
- logFileName = filename;
- openOutputFile(filename, out);
- }
- catch(exception& e) {
- errorOut(e, "MothurOut", "setFileName");
- exit(1);
- }
-}
-/*********************************************************************************************/
-MothurOut::~MothurOut() {
- try {
- _uniqueInstance = 0;
- out.close();
- }
- catch(exception& e) {
- errorOut(e, "MothurOut", "MothurOut");
- exit(1);
- }
-}
-
-/*********************************************************************************************/
-void MothurOut::mothurOut(string output) {
- try {
-
- cout << output;
- out << output;
-
- }
- catch(exception& e) {
- errorOut(e, "MothurOut", "MothurOut");
- exit(1);
- }
-}
-/*********************************************************************************************/
-void MothurOut::mothurOutEndLine() {
- try {
- cout << endl;
- out << endl;
- }
- catch(exception& e) {
- errorOut(e, "MothurOut", "MothurOutEndLine");
- exit(1);
- }
-}
-/*********************************************************************************************/
-void MothurOut::mothurOutJustToLog(string output) {
- try {
- out << output;
- }
- catch(exception& e) {
- errorOut(e, "MothurOut", "MothurOutJustToLog");
- exit(1);
- }
-}
-/*********************************************************************************************/
-void MothurOut::errorOut(exception& e, string object, string function) {
- mothurOut("Error: ");
- mothurOut(toString(e.what()));
- mothurOut(" has occurred in the " + object + " class function " + function + ". Please contact Pat Schloss at mothur.bugs@gmail.com, and be sure to include the mothur.logFile with your inquiry.");
- mothurOutEndLine();
-}
-/*********************************************************************************************/
-
-
-
-
-
+/*\r
+ * m->mothurOut.cpp\r
+ * Mothur\r
+ *\r
+ * Created by westcott on 2/25/10.\r
+ * Copyright 2010 Schloss Lab. All rights reserved.\r
+ *\r
+ */\r
+\r
+#include "mothurout.h"\r
+\r
+/******************************************************/\r
+MothurOut* MothurOut::getInstance() {\r
+ if( _uniqueInstance == 0) {\r
+ _uniqueInstance = new MothurOut();\r
+ }\r
+ return _uniqueInstance;\r
+}\r
+/*********************************************************************************************/\r
+void MothurOut::setFileName(string filename) {\r
+ try {\r
+ logFileName = filename;\r
+ \r
+ #ifdef USE_MPI\r
+ int pid;\r
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid); \r
+ \r
+ if (pid == 0) { //only one process should output to screen\r
+ #endif\r
+ \r
+ openOutputFile(filename, out);\r
+ \r
+ #ifdef USE_MPI\r
+ }\r
+ #endif\r
+ }\r
+ catch(exception& e) {\r
+ errorOut(e, "MothurOut", "setFileName");\r
+ exit(1);\r
+ }\r
+}\r
+/*********************************************************************************************/\r
+void MothurOut::setDefaultPath(string pathname) {\r
+ try {\r
+ \r
+ //add / to name if needed\r
+ string lastChar = pathname.substr(pathname.length()-1);\r
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)\r
+ if (lastChar != "/") { pathname += "/"; }\r
+ #else\r
+ if (lastChar != "\\") { pathname += "\\"; } \r
+ #endif\r
+ \r
+ defaultPath = pathname;\r
+ \r
+ }\r
+ catch(exception& e) {\r
+ errorOut(e, "MothurOut", "setDefaultPath");\r
+ exit(1);\r
+ }\r
+}\r
+/*********************************************************************************************/\r
+void MothurOut::closeLog() {\r
+ try {\r
+ \r
+ #ifdef USE_MPI\r
+ int pid;\r
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid); \r
+ \r
+ if (pid == 0) { //only one process should output to screen\r
+ #endif\r
+ \r
+ out.close();\r
+ \r
+ #ifdef USE_MPI\r
+ }\r
+ #endif\r
+ }\r
+ catch(exception& e) {\r
+ errorOut(e, "MothurOut", "closeLog");\r
+ exit(1);\r
+ }\r
+}\r
+\r
+/*********************************************************************************************/\r
+MothurOut::~MothurOut() {\r
+ try {\r
+ _uniqueInstance = 0;\r
+ \r
+ }\r
+ catch(exception& e) {\r
+ errorOut(e, "MothurOut", "MothurOut");\r
+ exit(1);\r
+ }\r
+}\r
+/*********************************************************************************************/\r
+void MothurOut::mothurOut(string output) {\r
+ try {\r
+ \r
+ #ifdef USE_MPI\r
+ int pid;\r
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid); \r
+ \r
+ if (pid == 0) { //only one process should output to screen\r
+ #endif\r
+ \r
+ cout << output;\r
+ out << output;\r
+ \r
+ #ifdef USE_MPI\r
+ }\r
+ #endif\r
+ }\r
+ catch(exception& e) {\r
+ errorOut(e, "MothurOut", "MothurOut");\r
+ exit(1);\r
+ }\r
+}\r
+/*********************************************************************************************/\r
+void MothurOut::mothurOutEndLine() {\r
+ try {\r
+ #ifdef USE_MPI\r
+ int pid;\r
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid); \r
+ \r
+ if (pid == 0) { //only one process should output to screen\r
+ #endif\r
+ \r
+ cout << endl;\r
+ out << endl;\r
+ \r
+ #ifdef USE_MPI\r
+ }\r
+ #endif\r
+ }\r
+ catch(exception& e) {\r
+ errorOut(e, "MothurOut", "MothurOutEndLine");\r
+ exit(1);\r
+ }\r
+}\r
+/*********************************************************************************************/\r
+void MothurOut::mothurOutJustToLog(string output) {\r
+ try {\r
+ #ifdef USE_MPI\r
+ int pid;\r
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid); \r
+ \r
+ if (pid == 0) { //only one process should output to screen\r
+ #endif\r
+ \r
+ out << output;\r
+ \r
+ #ifdef USE_MPI\r
+ }\r
+ #endif\r
+ }\r
+ catch(exception& e) {\r
+ errorOut(e, "MothurOut", "MothurOutJustToLog");\r
+ exit(1);\r
+ }\r
+}\r
+/*********************************************************************************************/\r
+void MothurOut::errorOut(exception& e, string object, string function) {\r
+ double vm, rss;\r
+ //mem_usage(vm, rss);\r
+ \r
+ mothurOut("Error: ");\r
+ mothurOut(toString(e.what()));\r
+ mothurOut(" has occurred in the " + object + " class function " + function + ". Please contact Pat Schloss at mothur.bugs@gmail.com, and be sure to include the mothur.logFile with your inquiry.");\r
+ mothurOutEndLine();\r
+}\r
+/*********************************************************************************************/\r
+//The following was originally from http://stackoverflow.com/questions/669438/how-to-get-memory-usage-at-run-time-in-c \r
+// process_mem_usage(double &, double &) - takes two doubles by reference,\r
+// attempts to read the system-dependent data for a process' virtual memory\r
+// size and resident set size, and return the results in KB.\r
+//\r
+// On failure, returns 0.0, 0.0\r
+int MothurOut::mem_usage(double& vm_usage, double& resident_set) {\r
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)\r
+ \r
+ vm_usage = 0.0;\r
+ resident_set = 0.0;\r
+\r
+ // 'file' stat seems to give the most reliable results\r
+ //\r
+ ifstream stat_stream("/proc/self/stat",ios_base::in);\r
+\r
+ // dummy vars for leading entries in stat that we don't care about\r
+ //\r
+ string pid, comm, state, ppid, pgrp, session, tty_nr;\r
+ string tpgid, flags, minflt, cminflt, majflt, cmajflt;\r
+ string utime, stime, cutime, cstime, priority, nice;\r
+ string O, itrealvalue, starttime;\r
+\r
+ // the two fields we want\r
+ //\r
+ unsigned long vsize;\r
+ long rss;\r
+\r
+ stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr\r
+ >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt\r
+ >> utime >> stime >> cutime >> cstime >> priority >> nice\r
+ >> O >> itrealvalue >> starttime >> vsize >> rss; // don't care about the rest\r
+\r
+ long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; // in case x86-64 is configured to use 2MB pages\r
+ vm_usage = vsize / 1024.0;\r
+ resident_set = rss * page_size_kb;\r
+ \r
+ mothurOut("Memory Usage: vm = " + toString(vm_usage) + " rss = " + toString(resident_set) + "\n");\r
+ return 0;\r
+\r
+ #else\r
+/* //windows memory usage\r
+ // Get the list of process identifiers.\r
+ DWORD aProcesses[1024], cbNeeded, cProcesses;\r
+ \r
+ if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ){ return 1; }\r
+\r
+ // Calculate how many process identifiers were returned.\r
+ cProcesses = cbNeeded / sizeof(DWORD);\r
+\r
+ // Print the memory usage for each process\r
+ for (int i = 0; i < cProcesses; i++ ) {\r
+ DWORD processID = aProcesses[i];\r
+ \r
+ PROCESS_MEMORY_COUNTERS pmc;\r
+\r
+ HANDLE hProcess = OpenProcess((PROCESS_QUERY_INFORMATION | PROCESS_VM_READ), FALSE, processID);\r
+\r
+ // Print the process identifier.\r
+ printf( "\nProcess ID: %u\n", processID);\r
+ \r
+ if (NULL != hProcess) {\r
+\r
+ if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) ) {\r
+ printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );\r
+ printf( "\tPeakWorkingSetSize: 0x%08X\n", pmc.PeakWorkingSetSize );\r
+ printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );\r
+ printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", pmc.QuotaPeakPagedPoolUsage );\r
+ printf( "\tQuotaPagedPoolUsage: 0x%08X\n", pmc.QuotaPagedPoolUsage );\r
+ printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", pmc.QuotaPeakNonPagedPoolUsage );\r
+ printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", pmc.QuotaNonPagedPoolUsage );\r
+ printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); \r
+ printf( "\tPeakPagefileUsage: 0x%08X\n", pmc.PeakPagefileUsage );\r
+ }\r
+ CloseHandle(hProcess);\r
+ }\r
+ }\r
+*/\r
+ return 0;\r
+\r
+ #endif\r
+}\r
+/*********************************************************************************************/\r
+\r
+\r
+\r
+\r
+\r
+\r