Next version of JABA
[jabaws.git] / binaries / src / muscle / progress.cpp
1 #include "muscle.h"\r
2 #include <stdio.h>\r
3 #include <time.h>\r
4 \r
5 // Functions that provide visible feedback to the user\r
6 // that progress is being made.\r
7 \r
8 static unsigned g_uIter = 0;            // Main MUSCLE iteration 1, 2..\r
9 static unsigned g_uLocalMaxIters = 0;   // Max iters\r
10 static FILE *g_fProgress = stderr;      // Default to standard error\r
11 static char g_strFileName[32];          // File name\r
12 static time_t g_tLocalStart;                            // Start time\r
13 static char g_strDesc[32];                      // Description\r
14 static bool g_bWipeDesc = false;\r
15 static int g_nPrevDescLength;\r
16 static unsigned g_uTotalSteps;\r
17 \r
18 double GetCheckMemUseMB()\r
19         {\r
20         unsigned MB = (unsigned) GetMemUseMB();\r
21         if (0 == g_uMaxMB || MB <= g_uMaxMB)\r
22                 return MB;\r
23         fprintf(stderr, "\n\n*** MAX MEMORY %u MB EXCEEDED***\n", g_uMaxMB);\r
24         fprintf(stderr, "Memory allocated so far %u MB, physical RAM %u MB\n",\r
25           MB, (unsigned) GetRAMSizeMB());\r
26         fprintf(stderr, "Use -maxmb <n> option to increase limit, where <n> is in MB.\n");\r
27         SaveCurrentAlignment();\r
28         exit(EXIT_FatalError);\r
29         return MB;\r
30         }\r
31 \r
32 const char *ElapsedTimeAsStr()\r
33         {\r
34         time_t Now = time(0);\r
35         unsigned long ElapsedSecs = (unsigned long) (Now - g_tLocalStart);\r
36         return SecsToStr(ElapsedSecs);\r
37         }\r
38 \r
39 const char *MemToStr(double MB)\r
40         {\r
41         if (MB < 0)\r
42                 return "";\r
43 \r
44         static char Str[9];\r
45         static double MaxMB = 0;\r
46         static double RAMMB = 0;\r
47 \r
48         if (RAMMB == 0)\r
49                 RAMMB = GetRAMSizeMB();\r
50 \r
51         if (MB > MaxMB)\r
52                 MaxMB = MB;\r
53         double Pct = (MaxMB*100.0)/RAMMB;\r
54         if (Pct > 100)\r
55                 Pct = 100;\r
56         sprintf(Str, "%.0f MB(%.0f%%)", MaxMB, Pct);\r
57         return Str;\r
58         }\r
59 \r
60 void SetInputFileName(const char *pstrFileName)\r
61         {\r
62         NameFromPath(pstrFileName, g_strFileName, sizeof(g_strFileName));\r
63         }\r
64 \r
65 void SetSeqStats(unsigned uSeqCount, unsigned uMaxL, unsigned uAvgL)\r
66         {\r
67         if (g_bQuiet)\r
68                 return;\r
69 \r
70         fprintf(g_fProgress, "%s %u seqs, max length %u, avg  length %u\n",\r
71           g_strFileName, uSeqCount, uMaxL, uAvgL);\r
72         if (g_bVerbose)\r
73                 Log("%u seqs, max length %u, avg  length %u\n",\r
74                   uSeqCount, uMaxL, uAvgL);\r
75         }\r
76 \r
77 void SetStartTime()\r
78         {\r
79         time(&g_tLocalStart);\r
80         }\r
81 \r
82 unsigned long GetStartTime()\r
83         {\r
84         return (unsigned long) g_tLocalStart;\r
85         }\r
86 \r
87 void SetIter(unsigned uIter)\r
88         {\r
89         g_uIter = uIter;\r
90         }\r
91 \r
92 void IncIter()\r
93         {\r
94         ++g_uIter;\r
95         }\r
96 \r
97 void SetMaxIters(unsigned uMaxIters)\r
98         {\r
99         g_uLocalMaxIters = uMaxIters;\r
100         }\r
101 \r
102 void SetProgressDesc(const char szDesc[])\r
103         {\r
104         strncpy(g_strDesc, szDesc, sizeof(g_strDesc));\r
105         g_strDesc[sizeof(g_strDesc) - 1] = 0;\r
106         }\r
107 \r
108 static void Wipe(int n)\r
109         {\r
110         for (int i = 0; i < n; ++i)\r
111                 fprintf(g_fProgress, " ");\r
112         }\r
113 \r
114 void Progress(const char *szFormat, ...)\r
115         {\r
116         CheckMaxTime();\r
117 \r
118         if (g_bQuiet)\r
119                 return;\r
120 \r
121         double MB = GetCheckMemUseMB();\r
122 \r
123         char szStr[4096];\r
124         va_list ArgList;\r
125         va_start(ArgList, szFormat);\r
126         vsprintf(szStr, szFormat, ArgList);\r
127 \r
128         fprintf(g_fProgress, "%8.8s  %12s  %s",\r
129           ElapsedTimeAsStr(),\r
130           MemToStr(MB),\r
131           szStr);\r
132 \r
133         fprintf(g_fProgress, "\n");\r
134         fflush(g_fProgress);\r
135         }\r
136 \r
137 void Progress(unsigned uStep, unsigned uTotalSteps)\r
138         {\r
139         CheckMaxTime();\r
140 \r
141         if (g_bQuiet)\r
142                 return;\r
143 \r
144         double dPct = ((uStep + 1)*100.0)/uTotalSteps;\r
145         double MB = GetCheckMemUseMB();\r
146         fprintf(g_fProgress, "%8.8s  %12s  Iter %3u  %6.2f%%  %s",\r
147           ElapsedTimeAsStr(),\r
148           MemToStr(MB),\r
149           g_uIter,\r
150           dPct,\r
151           g_strDesc);\r
152 \r
153         if (g_bWipeDesc)\r
154                 {\r
155                 int n = g_nPrevDescLength - (int) strlen(g_strDesc);\r
156                 Wipe(n);\r
157                 g_bWipeDesc = false;\r
158                 }\r
159 \r
160         fprintf(g_fProgress, "\r");\r
161 \r
162         g_uTotalSteps = uTotalSteps;\r
163         }\r
164 \r
165 void ProgressStepsDone()\r
166         {\r
167         CheckMaxTime();\r
168 \r
169         if (g_bVerbose)\r
170                 {\r
171                 double MB = GetCheckMemUseMB();\r
172                 Log("Elapsed time %8.8s  Peak memory use %12s  Iteration %3u %s\n",\r
173                  ElapsedTimeAsStr(),\r
174                  MemToStr(MB),\r
175                  g_uIter,\r
176                  g_strDesc);\r
177                 }\r
178 \r
179         if (g_bQuiet)\r
180                 return;\r
181 \r
182         Progress(g_uTotalSteps - 1, g_uTotalSteps);\r
183         fprintf(g_fProgress, "\n");\r
184         g_bWipeDesc = true;\r
185         g_nPrevDescLength = (int) strlen(g_strDesc);\r
186         }\r