annotate clustalomega/clustal-omega-1.0.2/src/clustal/progress.c @ 1:bc707542e5de

Uploaded
author clustalomega
date Thu, 21 Jul 2011 13:35:08 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
1 /* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
2
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
3 /*********************************************************************
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
4 * Clustal Omega - Multiple sequence alignment
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
5 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
6 * Copyright (C) 2010 University College Dublin
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
7 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
8 * Clustal-Omega is free software; you can redistribute it and/or
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
9 * modify it under the terms of the GNU General Public License as
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
10 * published by the Free Software Foundation; either version 2 of the
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
11 * License, or (at your option) any later version.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
12 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
13 * This file is part of Clustal-Omega.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
14 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
15 ********************************************************************/
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
16
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
17 /*
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
18 * RCS $Id: progress.c 230 2011-04-09 15:37:50Z andreas $
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
19 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
20
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
21 #ifdef HAVE_CONFIG_H
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
22 #include "config.h"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
23 #endif
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
24
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
25 #include <stdlib.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
26 #include <stdio.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
27 #include <assert.h>
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
28
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
29 #include "util.h"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
30 #include "log.h"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
31 #include "progress.h"
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
32
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
33 #define LOGLEVEL_THRESHOLD LOG_INFO
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
34
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
35 /**
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
36 * @brief Allocates a new progress structure and initialises its members.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
37 * Free with FreeProgress()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
38 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
39 * @note Starts the internal stopwatch immediatly!
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
40 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
41 * @see FreeProgress()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
42 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
43 * @param[out] pprProgress
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
44 * Pointer pointer to progress structure. Progress structure will be
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
45 * allocated here.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
46 * @param[in] prFile
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
47 * Where to log messages to
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
48 * @param[in] pcPrefix
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
49 * What prefix to use for messages
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
50 * @param[in] bPrintCR
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
51 * If TRUE carriage return instead of newline will be printed between log messages
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
52 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
53 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
54 NewProgress(progress_t **pprProgress, FILE *prFile,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
55 char *pcPrefix, bool bPrintCR)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
56 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
57 assert(NULL!=pprProgress);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
58 assert(NULL!=prFile);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
59 assert(NULL!=pcPrefix);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
60
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
61 (*pprProgress) = (progress_t *) CKMALLOC(1*sizeof(progress_t));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
62 (*pprProgress)->prFile = prFile;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
63 (*pprProgress)->bPrintCR = bPrintCR;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
64 (*pprProgress)->pcPrefix = CkStrdup(pcPrefix);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
65 strcpy((*pprProgress)->pcLastLogMsg, "\0");
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
66 (*pprProgress)->prStopwatch = StopwatchCreate();
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
67 StopwatchZero((*pprProgress)->prStopwatch);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
68 StopwatchStart((*pprProgress)->prStopwatch);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
69
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
70 return;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
71 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
72 /*** end: NewProgress() ***/
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
73
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
74
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
75
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
76 /**
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
77 * @brief Frees progress structure and its members
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
78 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
79 * @param[out] pprProgress
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
80 * Pointer pointer to progress structure
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
81 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
82 * @see NewProgress()
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
83 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
84 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
85 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
86 FreeProgress(progress_t **pprProgress)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
87 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
88 (*pprProgress)->prFile = NULL;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
89 CKFREE((*pprProgress)->pcPrefix);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
90 StopwatchFree((*pprProgress)->prStopwatch);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
91
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
92 CKFREE(*pprProgress);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
93 return;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
94 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
95 /*** end: FreeProgress() ***/
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
96
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
97
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
98
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
99
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
100 /**
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
101 * @brief Prints a progress update (and a carriage return)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
102 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
103 * @param[in] prProgress
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
104 * Pointer to the progress structure
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
105 * @param[in] iStep
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
106 * Current step number
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
107 * @param[in] iTotalSteps
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
108 * Total step number
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
109 * @param[in] bForceOutput
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
110 * If percentage hasn't changed output is normally supressed
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
111 * normally. Output can be forced with this flag.
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
112 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
113 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
114 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
115 ProgressLog(progress_t *prProgress,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
116 unsigned long int iStep, unsigned long int iTotalSteps,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
117 bool bForceOutput)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
118 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
119 char pcLogMsg[1024];
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
120 assert(0!=iTotalSteps);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
121
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
122 if (rLog.iLogLevelEnabled>LOGLEVEL_THRESHOLD) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
123 return;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
124 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
125
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
126 (void) snprintf(pcLogMsg, sizeof(pcLogMsg), "%s: %lu %%",
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
127 prProgress->pcPrefix, (unsigned long int)(iStep/(float)iTotalSteps*100.0));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
128
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
129 if (! bForceOutput) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
130 /* Skip logging, if we've just logged the same message */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
131 if (STR_EQ(pcLogMsg, prProgress->pcLastLogMsg)) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
132 return;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
133 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
134 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
135
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
136 strncpy(prProgress->pcLastLogMsg, pcLogMsg,
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
137 sizeof(prProgress->pcLastLogMsg));
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
138
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
139 fprintf(prProgress->prFile, "%s (%lu out of %lu)", pcLogMsg, iStep, iTotalSteps);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
140 if (prProgress->bPrintCR) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
141 fprintf(prProgress->prFile, "\r");
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
142 } else {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
143 fprintf(prProgress->prFile, "\n");
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
144
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
145 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
146 (void) fflush(prProgress->prFile);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
147
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
148 return;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
149 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
150 /*** end: ProgressLog() ***/
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
151
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
152
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
153 /**
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
154 * @brief Finishes progress output by printing the elapsed time
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
155 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
156 * @param[in] prProgress
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
157 * Pointer to the progress structure
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
158 *
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
159 */
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
160 void
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
161 ProgressDone(progress_t *prProgress)
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
162 {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
163 char pcBuf[1024];
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
164
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
165 if (rLog.iLogLevelEnabled>LOGLEVEL_THRESHOLD) {
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
166 return;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
167 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
168
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
169 (void) snprintf(pcBuf, sizeof(pcBuf), "%s done. CPU time: ",
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
170 prProgress->pcPrefix);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
171 StopwatchStop(prProgress->prStopwatch);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
172 StopwatchDisplay(prProgress->prFile, pcBuf, prProgress->prStopwatch);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
173 (void) fflush(prProgress->prFile);
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
174
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
175 return;
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
176 }
bc707542e5de Uploaded
clustalomega
parents:
diff changeset
177 /*** end: ProgressDone() ***/