]> git.donarmstrong.com Git - mothur.git/blobdiff - mothurout.cpp
modified trim.seqs to split by primer name if primer name is given, and warn if dupli...
[mothur.git] / mothurout.cpp
index ca1a40b32ddbd86e185ddee6e59366e4b3aace94..8bf216a39ce9b6d8492e1e2ec10dedc70d46843e 100644 (file)
-/*\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::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
-       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
-\r
-\r
-\r
-\r
-\r
+/*
+ *  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;
+               
+               #ifdef USE_MPI
+                       int pid;
+                       MPI_Comm_rank(MPI_COMM_WORLD, &pid); 
+                                       
+                       if (pid == 0) { //only one process should output to screen
+               #endif
+               
+               openOutputFile(filename, out);
+               
+               #ifdef USE_MPI
+                       }
+               #endif
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "setFileName");
+               exit(1);
+       }
+}
+/*********************************************************************************************/
+void MothurOut::closeLog()  {
+       try {
+               
+               #ifdef USE_MPI
+                       int pid;
+                       MPI_Comm_rank(MPI_COMM_WORLD, &pid); 
+                                       
+                       if (pid == 0) { //only one process should output to screen
+               #endif
+               
+               out.close();
+               
+               #ifdef USE_MPI
+                       }
+               #endif
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "closeLog");
+               exit(1);
+       }
+}
+
+/*********************************************************************************************/
+MothurOut::~MothurOut() {
+       try {
+               _uniqueInstance = 0;
+               
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "MothurOut");
+               exit(1);
+       }
+}
+/*********************************************************************************************/
+void MothurOut::mothurOut(string output) {
+       try {
+               
+               #ifdef USE_MPI
+                       int pid;
+                       MPI_Comm_rank(MPI_COMM_WORLD, &pid); 
+                                       
+                       if (pid == 0) { //only one process should output to screen
+               #endif
+               
+               cout << output;
+               out << output;
+               
+               #ifdef USE_MPI
+                       }
+               #endif
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "MothurOut");
+               exit(1);
+       }
+}
+/*********************************************************************************************/
+void MothurOut::mothurOutEndLine() {
+       try {
+               #ifdef USE_MPI
+                       int pid;
+                       MPI_Comm_rank(MPI_COMM_WORLD, &pid); 
+                                       
+                       if (pid == 0) { //only one process should output to screen
+               #endif
+               
+               cout << endl;
+               out << endl;
+               
+               #ifdef USE_MPI
+                       }
+               #endif
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "MothurOutEndLine");
+               exit(1);
+       }
+}
+/*********************************************************************************************/
+void MothurOut::mothurOutJustToLog(string output) {
+       try {
+               #ifdef USE_MPI
+                       int pid;
+                       MPI_Comm_rank(MPI_COMM_WORLD, &pid); 
+                                       
+                       if (pid == 0) { //only one process should output to screen
+               #endif
+               
+               out << output;
+               
+               #ifdef USE_MPI
+                       }
+               #endif
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "MothurOutJustToLog");
+               exit(1);
+       }
+}
+/*********************************************************************************************/
+void MothurOut::errorOut(exception& e, string object, string function) {
+       double vm, rss;
+       mem_usage(vm, rss);
+       
+       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();
+}
+/*********************************************************************************************/
+//The following was originally from http://stackoverflow.com/questions/669438/how-to-get-memory-usage-at-run-time-in-c 
+// process_mem_usage(double &, double &) - takes two doubles by reference,
+// attempts to read the system-dependent data for a process' virtual memory
+// size and resident set size, and return the results in KB.
+//
+// On failure, returns 0.0, 0.0
+int MothurOut::mem_usage(double& vm_usage, double& resident_set) {
+  #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+  
+          vm_usage     = 0.0;
+          resident_set = 0.0;
+
+          // 'file' stat seems to give the most reliable results
+          //
+          ifstream stat_stream("/proc/self/stat",ios_base::in);
+
+          // dummy vars for leading entries in stat that we don't care about
+          //
+          string pid, comm, state, ppid, pgrp, session, tty_nr;
+          string tpgid, flags, minflt, cminflt, majflt, cmajflt;
+          string utime, stime, cutime, cstime, priority, nice;
+          string O, itrealvalue, starttime;
+
+          // the two fields we want
+          //
+          unsigned long vsize;
+          long rss;
+
+          stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
+                                  >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
+                                  >> utime >> stime >> cutime >> cstime >> priority >> nice
+                                  >> O >> itrealvalue >> starttime >> vsize >> rss; // don't care about the rest
+
+          long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; // in case x86-64 is configured to use 2MB pages
+          vm_usage     = vsize / 1024.0;
+          resident_set = rss * page_size_kb;
+          
+          mothurOut("Memory Usage: vm = " + toString(vm_usage) + " rss = " + toString(resident_set) + "\n");
+               return 0;
+
+       #else
+/*             //windows memory usage
+               // Get the list of process identifiers.
+               DWORD aProcesses[1024], cbNeeded, cProcesses;
+               
+               if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ){ return 1; }
+
+               // Calculate how many process identifiers were returned.
+               cProcesses = cbNeeded / sizeof(DWORD);
+
+               // Print the memory usage for each process
+               for (int i = 0; i < cProcesses; i++ ) {
+                       DWORD processID = aProcesses[i];
+                       
+                       PROCESS_MEMORY_COUNTERS pmc;
+
+                       HANDLE hProcess = OpenProcess((PROCESS_QUERY_INFORMATION | PROCESS_VM_READ), FALSE, processID);
+
+                       // Print the process identifier.
+                       printf( "\nProcess ID: %u\n", processID);
+                       
+                       if (NULL != hProcess) {
+
+                               if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) ) {
+                                       printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
+                                       printf( "\tPeakWorkingSetSize: 0x%08X\n", pmc.PeakWorkingSetSize );
+                                       printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
+                                       printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", pmc.QuotaPeakPagedPoolUsage );
+                                       printf( "\tQuotaPagedPoolUsage: 0x%08X\n", pmc.QuotaPagedPoolUsage );
+                                       printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", pmc.QuotaPeakNonPagedPoolUsage );
+                                       printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", pmc.QuotaNonPagedPoolUsage );
+                                       printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); 
+                                       printf( "\tPeakPagefileUsage: 0x%08X\n", pmc.PeakPagefileUsage );
+                               }
+                               CloseHandle(hProcess);
+                       }
+               }
+*/
+                       return 0;
+
+       #endif
+}
+/*********************************************************************************************/
+
+
+
+
+