new version of muscle 3.8.31
[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 const char *ElapsedTimeAsStr()\r
19         {\r
20         time_t Now = time(0);\r
21         unsigned long ElapsedSecs = (unsigned long) (Now - g_tLocalStart);\r
22         return SecsToStr(ElapsedSecs);\r
23         }\r
24 \r
25 const char *MemToStr(double MB)\r
26         {\r
27         if (MB < 0)\r
28                 return "";\r
29 \r
30         static char Str[16];\r
31         static double MaxMB = 0;\r
32         static double RAMMB = 0;\r
33 \r
34         if (RAMMB == 0)\r
35                 RAMMB = GetRAMSizeMB();\r
36 \r
37         if (MB > MaxMB)\r
38                 MaxMB = MB;\r
39         double Pct = (MaxMB*100.0)/RAMMB;\r
40         if (Pct > 100)\r
41                 Pct = 100;\r
42         sprintf(Str, "%.0f MB(%.0f%%)", MaxMB, Pct);\r
43         return Str;\r
44         }\r
45 \r
46 void SetInputFileName(const char *pstrFileName)\r
47         {\r
48         NameFromPath(pstrFileName, g_strFileName, sizeof(g_strFileName));\r
49         }\r
50 \r
51 void SetSeqStats(unsigned uSeqCount, unsigned uMaxL, unsigned uAvgL)\r
52         {\r
53         if (g_bQuiet)\r
54                 return;\r
55 \r
56         fprintf(g_fProgress, "%s %u seqs, max length %u, avg  length %u\n",\r
57           g_strFileName, uSeqCount, uMaxL, uAvgL);\r
58         if (g_bVerbose)\r
59                 Log("%u seqs, max length %u, avg  length %u\n",\r
60                   uSeqCount, uMaxL, uAvgL);\r
61         }\r
62 \r
63 void SetStartTime()\r
64         {\r
65         time(&g_tLocalStart);\r
66         }\r
67 \r
68 unsigned long GetStartTime()\r
69         {\r
70         return (unsigned long) g_tLocalStart;\r
71         }\r
72 \r
73 void SetIter(unsigned uIter)\r
74         {\r
75         g_uIter = uIter;\r
76         }\r
77 \r
78 void IncIter()\r
79         {\r
80         ++g_uIter;\r
81         }\r
82 \r
83 void SetMaxIters(unsigned uMaxIters)\r
84         {\r
85         g_uLocalMaxIters = uMaxIters;\r
86         }\r
87 \r
88 void SetProgressDesc(const char szDesc[])\r
89         {\r
90         strncpy(g_strDesc, szDesc, sizeof(g_strDesc));\r
91         g_strDesc[sizeof(g_strDesc) - 1] = 0;\r
92         }\r
93 \r
94 static void Wipe(int n)\r
95         {\r
96         for (int i = 0; i < n; ++i)\r
97                 fprintf(g_fProgress, " ");\r
98         }\r
99 \r
100 void Progress(const char *szFormat, ...)\r
101         {\r
102         CheckMaxTime();\r
103 \r
104         if (g_bQuiet)\r
105                 return;\r
106 \r
107         double MB = GetMemUseMB();\r
108 \r
109         char szStr[4096];\r
110         va_list ArgList;\r
111         va_start(ArgList, szFormat);\r
112         vsprintf(szStr, szFormat, ArgList);\r
113 \r
114         fprintf(g_fProgress, "%8.8s  %12s  %s",\r
115           ElapsedTimeAsStr(),\r
116           MemToStr(MB),\r
117           szStr);\r
118 \r
119         fprintf(g_fProgress, "\n");\r
120         fflush(g_fProgress);\r
121         }\r
122 \r
123 void Progress(unsigned uStep, unsigned uTotalSteps)\r
124         {\r
125         CheckMaxTime();\r
126 \r
127         if (g_bQuiet)\r
128                 return;\r
129 \r
130         double dPct = ((uStep + 1)*100.0)/uTotalSteps;\r
131         double MB = GetMemUseMB();\r
132         fprintf(g_fProgress, "%8.8s  %12s  Iter %3u  %6.2f%%  %s",\r
133           ElapsedTimeAsStr(),\r
134           MemToStr(MB),\r
135           g_uIter,\r
136           dPct,\r
137           g_strDesc);\r
138 \r
139         if (g_bWipeDesc)\r
140                 {\r
141                 int n = g_nPrevDescLength - (int) strlen(g_strDesc);\r
142                 Wipe(n);\r
143                 g_bWipeDesc = false;\r
144                 }\r
145 \r
146         fprintf(g_fProgress, "\r");\r
147 \r
148         g_uTotalSteps = uTotalSteps;\r
149         }\r
150 \r
151 void ProgressStepsDone()\r
152         {\r
153         CheckMaxTime();\r
154 \r
155         if (g_bVerbose)\r
156                 {\r
157                 double MB = GetMemUseMB();\r
158                 Log("Elapsed time %8.8s  Peak memory use %12s  Iteration %3u %s\n",\r
159                  ElapsedTimeAsStr(),\r
160                  MemToStr(MB),\r
161                  g_uIter,\r
162                  g_strDesc);\r
163                 }\r
164 \r
165         if (g_bQuiet)\r
166                 return;\r
167 \r
168         Progress(g_uTotalSteps - 1, g_uTotalSteps);\r
169         fprintf(g_fProgress, "\n");\r
170         g_bWipeDesc = true;\r
171         g_nPrevDescLength = (int) strlen(g_strDesc);\r
172         }\r