#pragma implementation
#include <Rtypes.h>
#include "TString.h"
#include <stdio.h>
#include "hsuprogress.h"
ClassImp(HSUProgress)
static const Char_t* g_pctHSUProgressConst[] = { ".oOo", "-\\|/" };
HSUProgress::HSUProgress(Int_t iMax)
{
Reset();
m_iMax = iMax;
}
void HSUProgress::Reset()
{
m_iMax = 100;
m_iLast = -1;
m_bSpin = kTRUE;
m_bSpinInPer = kFALSE;
m_fSpinSet = 0.1f;
m_fSpinReal = 0.0f;
m_psSpinChars = g_pctHSUProgressConst[0];
m_iSpinLen = strlen(m_psSpinChars);
m_bProgress = kTRUE;
m_bProgressInPer = kTRUE;
m_fProgressSet = 1.0f;
m_fProgressReal = 0.0f;
m_cProgressChar = '#';
m_bTimer = kTRUE;
m_bTimerInPer = kTRUE;
m_fTimerSet = 10.0f;
m_fTimerReal = 0.0f;
m_bFullTimer = kTRUE;
tTimer.Reset();
m_bWasOutOfRange = kFALSE;
}
HSUProgress::~HSUProgress()
{
}
void HSUProgress::Restart(void)
{
m_iLast = -1;
}
void HSUProgress::SetSpinPer(Float_t f)
{
m_bSpinInPer = kTRUE;
m_fSpinSet = (f <= 0.0f) ? 0.01f : f;
}
void HSUProgress::SetSpinEvents(Int_t i)
{
m_bSpinInPer = kFALSE;
m_fSpinSet = (i <= 0) ? 1.0f : (Float_t)i;
}
void HSUProgress::SetSpinChars(const Char_t *pStr)
{
m_psSpinChars = pStr;
m_iSpinLen = strlen(m_psSpinChars);
}
void HSUProgress::SetSpinChars(Int_t iType)
{
if((iType >= 0) && (iType < (Int_t)sizeof(g_pctHSUProgressConst)))
m_psSpinChars = g_pctHSUProgressConst[iType];
m_iSpinLen = strlen(m_psSpinChars);
}
Float_t HSUProgress::GetSpinReal(void)
{
m_fSpinReal = (m_bSpinInPer)
? m_fSpinSet : (100.0f * m_fSpinSet / m_iMax);
return m_fSpinReal;
}
void HSUProgress::SetProgressPer(Float_t f)
{
m_bProgressInPer = kTRUE;
m_fProgressSet = (f <= 0.0f) ? 0.01f : f;
}
void HSUProgress::SetProgressEvents(Int_t i)
{
m_bProgressInPer = kFALSE;
m_fProgressSet = (i <= 0) ? 1.0f : (Float_t)i;
}
Float_t HSUProgress::GetProgressReal(void)
{
m_fProgressReal = (m_bProgressInPer)
? m_fProgressSet : (100.0f * m_fProgressSet / m_iMax);
return m_fProgressReal;
}
void HSUProgress::SetTimerPer(Float_t f)
{
m_bTimerInPer = kTRUE;
m_fTimerSet = (f <= 0.0f) ? 0.01f : f;
}
void HSUProgress::SetTimerEvents(Int_t i)
{
m_bTimerInPer = kFALSE;
m_fTimerSet = (i <= 0) ? 1.0f : (Float_t)i;
}
Float_t HSUProgress::GetTimerReal(void)
{
m_fTimerReal = (m_bTimerInPer)
? m_fTimerSet : (100.0f * m_fTimerSet / m_iMax);
return m_fTimerReal;
}
void HSUProgress::Next(Int_t iSteps)
{
Float_t fPrev;
Float_t fCur;
Int_t iChangeSpin = 0;
Bool_t bChangeSpin = kFALSE;
Int_t iChangeProgress = 0;
Bool_t bChangeTimer = kFALSE;
Int_t i;
if(m_iMax <= 0)
{
if( ! m_bSpin)
return;
if(m_iLast < 0)
{
fPrev = 0.0;
m_iLast = iSteps;
m_fTimerReal = ((m_bTimerInPer) || (m_fTimerSet <= 0))
? 10 : m_fTimerSet;
}
else
{
fPrev = m_iLast / m_fTimerReal;
m_iLast += iSteps;
}
fCur = m_iLast / m_fTimerReal;
if(Int_t(fCur) != Int_t(fPrev))
{
iChangeSpin = Int_t(fCur);
bChangeSpin = kTRUE;
}
}
else
{
if(m_iLast >= m_iMax)
{
if( ! m_bWasOutOfRange)
{
printf("\nProgress out of range: %d / %d\n", m_iLast, m_iMax);
m_bWasOutOfRange = kTRUE;
}
m_iLast += iSteps;
return;
}
if(m_iLast < 0)
{
GetSpinReal();
GetProgressReal();
GetTimerReal();
fPrev = 0.0f;
m_iLast = iSteps;
fCur = (100.0f * m_iLast) / m_iMax;
bChangeSpin = m_bSpin;
tTimer.Start(kTRUE);
}
else
{
fPrev = (100.0f * m_iLast) / m_iMax;
m_iLast += iSteps;
fCur = (100.0f * m_iLast) / m_iMax;
}
if(m_bSpin)
{
iChangeSpin = (Int_t)(fCur / m_fSpinReal);
if((Int_t)(fPrev / m_fSpinReal) != iChangeSpin)
bChangeSpin = kTRUE;
}
if(m_bProgress)
{
iChangeProgress = (Int_t)(fCur / m_fProgressReal)
- (Int_t)(fPrev / m_fProgressReal);
}
if(m_bTimer)
{
if((Int_t)(fPrev / m_fTimerReal) != (Int_t)(fCur / m_fTimerReal))
bChangeTimer = kTRUE;
}
}
if((m_bSpin) && ((iChangeProgress > 0) || (bChangeTimer)))
bChangeSpin = kTRUE;
if((bChangeSpin != 0) && (fPrev != 0.0f))
printf("\b");
for(i = 0; i < iChangeProgress; i++)
printf("%c", m_cProgressChar);
if(bChangeTimer)
{
printf(" %3d %% done in %8.2f s; ~ %8.2f s left; %8.2f evts/s\n",
(Int_t)fCur, tTimer.RealTime(),
(100.0f - fCur) * tTimer.RealTime() / fCur,
((double)m_iLast / tTimer.RealTime()));
tTimer.Continue();
}
if((m_iMax <= 0) || (m_iLast < m_iMax))
{
if(bChangeSpin)
printf("%c", m_psSpinChars[iChangeSpin % m_iSpinLen]);
}
else
{
if(m_bFullTimer)
Final();
}
if((bChangeSpin) || (iChangeProgress > 0) || (bChangeTimer))
fflush(stdout);
}
void HSUProgress::Final(void)
{
if(m_iLast <= m_iMax)
{
printf("\n%d events done in %8.2f s; %8.2f evts/s\n",
m_iLast, tTimer.RealTime(), ((double)m_iLast / tTimer.RealTime()));
}
m_iLast = m_iMax + 1;
}
Last change: Sat May 22 13:13:04 2010
Last generated: 2010-05-22 13:13
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.