ROOT logo
#pragma implementation

// -----------------------------------------------------------------------------

#include <Rtypes.h>
#include "TString.h"
#include <stdio.h>
#include "hsuprogress.h"

// -----------------------------------------------------------------------------
//*-- Author : Marcin Jaskula
// -----------------------------------------------------------------------------

ClassImp(HSUProgress)

// -----------------------------------------------------------------------------

static const Char_t* g_pctHSUProgressConst[] = { ".oOo", "-\\|/" };

//______________________________________________________________________________
// A progress bar class.
// It gives a simple interface for showing a progress bar of some Long_t task
// as well as it may estimate the time left to the end of the job.
// A typical output of the progress bar looks like:
//
// ##########  10 % done in     1.85 s; ~    16.65 s left;    540.54 evts/s
// ##########  20 % done in     3.65 s; ~    14.60 s left;    547.95 evts/s
// ##########  30 % done in     5.42 s; ~    12.65 s left;    553.51 evts/s
// ##########  40 % done in     7.21 s; ~    10.82 s left;    554.79 evts/s
// ##########  50 % done in     9.08 s; ~     9.08 s left;    550.66 evts/s
// ####-
// ....
//
// 10000 events done in    18.05 s;   554.02 evts/s
//
// All parameters of the display are configurable:
//
// Progress bars on the left: ("#####" in the example)
// - turn it on/off with SetProgressOn method (default on)
// - how often a new character in the bar appears may be set by:
//     - SetProgressPer
//     - SetProgressEvents
//     methods. Default: each 1% of the max events
// - the character in the bar may be changed by GetProgressChar method (def. #)
//
// Spinning character: ("-" in the example)
// - turn it on/off with SetSpinOn method (default on)
// - how often it spins may be changed by:
//     - SetSpinPer
//     - SetSpinEvents
//     methods. Default: 0.1%
// - characters which define a spin may be set by methods:
//     - SetSpinChars(Int_t iType)
//          iType = 0: ".oOo"
//                = 1: "-\\|/"
//     - SetSpinChars(const Char_t *pStr) - sets user define string
//          e.g. SetSpinChars("Hades is fine")
//
// Timing information: ("10% done ..." in the example)
// - turn in on/off with SetTimerOn method (default on)
// - how often it appears may be changed by:
//     - SetTimerPer
//     - SetProgressEvents
//     methods. Default: 10%
//
// Information about full time of the loop: (the last line)
// - turn it on/off with SetFullTimerOn method (default on)
//
//
// If the counter overflows the maximum value defined in the constructor
// a warning is reported for the first time.
//

HSUProgress::HSUProgress(Int_t iMax)
{
// Constructor in which a maximum number of steps may be set.
// The default value of iMax = 100
    Reset();
    m_iMax = iMax;
}

// -----------------------------------------------------------------------------

void HSUProgress::Reset()
{
// Reset all parameters to the default values
    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()
{
// An empty destructor
}

// -----------------------------------------------------------------------------

void HSUProgress::Restart(void)
{
// Reset the counter
    m_iLast = -1;
}

// -----------------------------------------------------------------------------

void HSUProgress::SetSpinPer(Float_t f)
{
// How often the spin changes - in per cent of the iMax
    m_bSpinInPer = kTRUE;
    m_fSpinSet = (f <= 0.0f) ? 0.01f : f;
}

// -----------------------------------------------------------------------------

void HSUProgress::SetSpinEvents(Int_t i)
{
// How often the spin changes - in events
    m_bSpinInPer = kFALSE;
    m_fSpinSet = (i <= 0) ? 1.0f : (Float_t)i;
}

// -----------------------------------------------------------------------------

void HSUProgress::SetSpinChars(const Char_t *pStr)
{
// Set the string of characters used by spin
    m_psSpinChars = pStr;
    m_iSpinLen    = strlen(m_psSpinChars);
}

// -----------------------------------------------------------------------------

void HSUProgress::SetSpinChars(Int_t iType)
{
// Set the string of characters used by spin from two defaults:
// 0 - ".oOo"
// 1 - "-\\|/"
    if((iType >= 0) && (iType < (Int_t)sizeof(g_pctHSUProgressConst)))
        m_psSpinChars = g_pctHSUProgressConst[iType];

    m_iSpinLen = strlen(m_psSpinChars);
}

// -----------------------------------------------------------------------------

Float_t HSUProgress::GetSpinReal(void)
{
// How often (in events) spin changes
    m_fSpinReal = (m_bSpinInPer)
                    ? m_fSpinSet : (100.0f * m_fSpinSet / m_iMax);

    return m_fSpinReal;
}

// -----------------------------------------------------------------------------

void HSUProgress::SetProgressPer(Float_t f)
{
// How often the progress bar changes - in per cent
    m_bProgressInPer = kTRUE;
    m_fProgressSet = (f <= 0.0f) ? 0.01f : f;
}

// -----------------------------------------------------------------------------

void HSUProgress::SetProgressEvents(Int_t i)
{
// How often the progress bar changes - in events
    m_bProgressInPer = kFALSE;
    m_fProgressSet = (i <= 0) ? 1.0f : (Float_t)i;
}

// -----------------------------------------------------------------------------

Float_t HSUProgress::GetProgressReal(void)
{
// How often (in events) progress bar changes
    m_fProgressReal = (m_bProgressInPer)
                    ? m_fProgressSet : (100.0f * m_fProgressSet / m_iMax);

    return m_fProgressReal;
}

// -----------------------------------------------------------------------------

void HSUProgress::SetTimerPer(Float_t f)
{
// How often the timer info appears - in per cent
    m_bTimerInPer = kTRUE;
    m_fTimerSet = (f <= 0.0f) ? 0.01f : f;
}

// -----------------------------------------------------------------------------

void HSUProgress::SetTimerEvents(Int_t i)
{
// How often the timer info appears - in events
    m_bTimerInPer = kFALSE;
    m_fTimerSet = (i <= 0) ? 1.0f : (Float_t)i;
}

// -----------------------------------------------------------------------------

Float_t HSUProgress::GetTimerReal(void)
{
// How often (in events) the timer info appears
    m_fTimerReal = (m_bTimerInPer)
                    ? m_fTimerSet : (100.0f * m_fTimerSet / m_iMax);

    return m_fTimerReal;
}

// -----------------------------------------------------------------------------

void HSUProgress::Next(Int_t iSteps)
{
// Execute the progress for the next step
// Default iSteps = 1
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;

        // clear spin
    if((bChangeSpin != 0) && (fPrev != 0.0f))
        printf("\b");

        // write progress
    for(i = 0; i < iChangeProgress; i++)
        printf("%c", m_cProgressChar);

        // write the timer info
    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();
    }

        // write the spin or the total time
    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)
{
// Print the final line of the progress bar
    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;
}
 hsuprogress.cc:1
 hsuprogress.cc:2
 hsuprogress.cc:3
 hsuprogress.cc:4
 hsuprogress.cc:5
 hsuprogress.cc:6
 hsuprogress.cc:7
 hsuprogress.cc:8
 hsuprogress.cc:9
 hsuprogress.cc:10
 hsuprogress.cc:11
 hsuprogress.cc:12
 hsuprogress.cc:13
 hsuprogress.cc:14
 hsuprogress.cc:15
 hsuprogress.cc:16
 hsuprogress.cc:17
 hsuprogress.cc:18
 hsuprogress.cc:19
 hsuprogress.cc:20
 hsuprogress.cc:21
 hsuprogress.cc:22
 hsuprogress.cc:23
 hsuprogress.cc:24
 hsuprogress.cc:25
 hsuprogress.cc:26
 hsuprogress.cc:27
 hsuprogress.cc:28
 hsuprogress.cc:29
 hsuprogress.cc:30
 hsuprogress.cc:31
 hsuprogress.cc:32
 hsuprogress.cc:33
 hsuprogress.cc:34
 hsuprogress.cc:35
 hsuprogress.cc:36
 hsuprogress.cc:37
 hsuprogress.cc:38
 hsuprogress.cc:39
 hsuprogress.cc:40
 hsuprogress.cc:41
 hsuprogress.cc:42
 hsuprogress.cc:43
 hsuprogress.cc:44
 hsuprogress.cc:45
 hsuprogress.cc:46
 hsuprogress.cc:47
 hsuprogress.cc:48
 hsuprogress.cc:49
 hsuprogress.cc:50
 hsuprogress.cc:51
 hsuprogress.cc:52
 hsuprogress.cc:53
 hsuprogress.cc:54
 hsuprogress.cc:55
 hsuprogress.cc:56
 hsuprogress.cc:57
 hsuprogress.cc:58
 hsuprogress.cc:59
 hsuprogress.cc:60
 hsuprogress.cc:61
 hsuprogress.cc:62
 hsuprogress.cc:63
 hsuprogress.cc:64
 hsuprogress.cc:65
 hsuprogress.cc:66
 hsuprogress.cc:67
 hsuprogress.cc:68
 hsuprogress.cc:69
 hsuprogress.cc:70
 hsuprogress.cc:71
 hsuprogress.cc:72
 hsuprogress.cc:73
 hsuprogress.cc:74
 hsuprogress.cc:75
 hsuprogress.cc:76
 hsuprogress.cc:77
 hsuprogress.cc:78
 hsuprogress.cc:79
 hsuprogress.cc:80
 hsuprogress.cc:81
 hsuprogress.cc:82
 hsuprogress.cc:83
 hsuprogress.cc:84
 hsuprogress.cc:85
 hsuprogress.cc:86
 hsuprogress.cc:87
 hsuprogress.cc:88
 hsuprogress.cc:89
 hsuprogress.cc:90
 hsuprogress.cc:91
 hsuprogress.cc:92
 hsuprogress.cc:93
 hsuprogress.cc:94
 hsuprogress.cc:95
 hsuprogress.cc:96
 hsuprogress.cc:97
 hsuprogress.cc:98
 hsuprogress.cc:99
 hsuprogress.cc:100
 hsuprogress.cc:101
 hsuprogress.cc:102
 hsuprogress.cc:103
 hsuprogress.cc:104
 hsuprogress.cc:105
 hsuprogress.cc:106
 hsuprogress.cc:107
 hsuprogress.cc:108
 hsuprogress.cc:109
 hsuprogress.cc:110
 hsuprogress.cc:111
 hsuprogress.cc:112
 hsuprogress.cc:113
 hsuprogress.cc:114
 hsuprogress.cc:115
 hsuprogress.cc:116
 hsuprogress.cc:117
 hsuprogress.cc:118
 hsuprogress.cc:119
 hsuprogress.cc:120
 hsuprogress.cc:121
 hsuprogress.cc:122
 hsuprogress.cc:123
 hsuprogress.cc:124
 hsuprogress.cc:125
 hsuprogress.cc:126
 hsuprogress.cc:127
 hsuprogress.cc:128
 hsuprogress.cc:129
 hsuprogress.cc:130
 hsuprogress.cc:131
 hsuprogress.cc:132
 hsuprogress.cc:133
 hsuprogress.cc:134
 hsuprogress.cc:135
 hsuprogress.cc:136
 hsuprogress.cc:137
 hsuprogress.cc:138
 hsuprogress.cc:139
 hsuprogress.cc:140
 hsuprogress.cc:141
 hsuprogress.cc:142
 hsuprogress.cc:143
 hsuprogress.cc:144
 hsuprogress.cc:145
 hsuprogress.cc:146
 hsuprogress.cc:147
 hsuprogress.cc:148
 hsuprogress.cc:149
 hsuprogress.cc:150
 hsuprogress.cc:151
 hsuprogress.cc:152
 hsuprogress.cc:153
 hsuprogress.cc:154
 hsuprogress.cc:155
 hsuprogress.cc:156
 hsuprogress.cc:157
 hsuprogress.cc:158
 hsuprogress.cc:159
 hsuprogress.cc:160
 hsuprogress.cc:161
 hsuprogress.cc:162
 hsuprogress.cc:163
 hsuprogress.cc:164
 hsuprogress.cc:165
 hsuprogress.cc:166
 hsuprogress.cc:167
 hsuprogress.cc:168
 hsuprogress.cc:169
 hsuprogress.cc:170
 hsuprogress.cc:171
 hsuprogress.cc:172
 hsuprogress.cc:173
 hsuprogress.cc:174
 hsuprogress.cc:175
 hsuprogress.cc:176
 hsuprogress.cc:177
 hsuprogress.cc:178
 hsuprogress.cc:179
 hsuprogress.cc:180
 hsuprogress.cc:181
 hsuprogress.cc:182
 hsuprogress.cc:183
 hsuprogress.cc:184
 hsuprogress.cc:185
 hsuprogress.cc:186
 hsuprogress.cc:187
 hsuprogress.cc:188
 hsuprogress.cc:189
 hsuprogress.cc:190
 hsuprogress.cc:191
 hsuprogress.cc:192
 hsuprogress.cc:193
 hsuprogress.cc:194
 hsuprogress.cc:195
 hsuprogress.cc:196
 hsuprogress.cc:197
 hsuprogress.cc:198
 hsuprogress.cc:199
 hsuprogress.cc:200
 hsuprogress.cc:201
 hsuprogress.cc:202
 hsuprogress.cc:203
 hsuprogress.cc:204
 hsuprogress.cc:205
 hsuprogress.cc:206
 hsuprogress.cc:207
 hsuprogress.cc:208
 hsuprogress.cc:209
 hsuprogress.cc:210
 hsuprogress.cc:211
 hsuprogress.cc:212
 hsuprogress.cc:213
 hsuprogress.cc:214
 hsuprogress.cc:215
 hsuprogress.cc:216
 hsuprogress.cc:217
 hsuprogress.cc:218
 hsuprogress.cc:219
 hsuprogress.cc:220
 hsuprogress.cc:221
 hsuprogress.cc:222
 hsuprogress.cc:223
 hsuprogress.cc:224
 hsuprogress.cc:225
 hsuprogress.cc:226
 hsuprogress.cc:227
 hsuprogress.cc:228
 hsuprogress.cc:229
 hsuprogress.cc:230
 hsuprogress.cc:231
 hsuprogress.cc:232
 hsuprogress.cc:233
 hsuprogress.cc:234
 hsuprogress.cc:235
 hsuprogress.cc:236
 hsuprogress.cc:237
 hsuprogress.cc:238
 hsuprogress.cc:239
 hsuprogress.cc:240
 hsuprogress.cc:241
 hsuprogress.cc:242
 hsuprogress.cc:243
 hsuprogress.cc:244
 hsuprogress.cc:245
 hsuprogress.cc:246
 hsuprogress.cc:247
 hsuprogress.cc:248
 hsuprogress.cc:249
 hsuprogress.cc:250
 hsuprogress.cc:251
 hsuprogress.cc:252
 hsuprogress.cc:253
 hsuprogress.cc:254
 hsuprogress.cc:255
 hsuprogress.cc:256
 hsuprogress.cc:257
 hsuprogress.cc:258
 hsuprogress.cc:259
 hsuprogress.cc:260
 hsuprogress.cc:261
 hsuprogress.cc:262
 hsuprogress.cc:263
 hsuprogress.cc:264
 hsuprogress.cc:265
 hsuprogress.cc:266
 hsuprogress.cc:267
 hsuprogress.cc:268
 hsuprogress.cc:269
 hsuprogress.cc:270
 hsuprogress.cc:271
 hsuprogress.cc:272
 hsuprogress.cc:273
 hsuprogress.cc:274
 hsuprogress.cc:275
 hsuprogress.cc:276
 hsuprogress.cc:277
 hsuprogress.cc:278
 hsuprogress.cc:279
 hsuprogress.cc:280
 hsuprogress.cc:281
 hsuprogress.cc:282
 hsuprogress.cc:283
 hsuprogress.cc:284
 hsuprogress.cc:285
 hsuprogress.cc:286
 hsuprogress.cc:287
 hsuprogress.cc:288
 hsuprogress.cc:289
 hsuprogress.cc:290
 hsuprogress.cc:291
 hsuprogress.cc:292
 hsuprogress.cc:293
 hsuprogress.cc:294
 hsuprogress.cc:295
 hsuprogress.cc:296
 hsuprogress.cc:297
 hsuprogress.cc:298
 hsuprogress.cc:299
 hsuprogress.cc:300
 hsuprogress.cc:301
 hsuprogress.cc:302
 hsuprogress.cc:303
 hsuprogress.cc:304
 hsuprogress.cc:305
 hsuprogress.cc:306
 hsuprogress.cc:307
 hsuprogress.cc:308
 hsuprogress.cc:309
 hsuprogress.cc:310
 hsuprogress.cc:311
 hsuprogress.cc:312
 hsuprogress.cc:313
 hsuprogress.cc:314
 hsuprogress.cc:315
 hsuprogress.cc:316
 hsuprogress.cc:317
 hsuprogress.cc:318
 hsuprogress.cc:319
 hsuprogress.cc:320
 hsuprogress.cc:321
 hsuprogress.cc:322
 hsuprogress.cc:323
 hsuprogress.cc:324
 hsuprogress.cc:325
 hsuprogress.cc:326
 hsuprogress.cc:327
 hsuprogress.cc:328
 hsuprogress.cc:329
 hsuprogress.cc:330
 hsuprogress.cc:331
 hsuprogress.cc:332
 hsuprogress.cc:333
 hsuprogress.cc:334
 hsuprogress.cc:335
 hsuprogress.cc:336
 hsuprogress.cc:337
 hsuprogress.cc:338
 hsuprogress.cc:339
 hsuprogress.cc:340
 hsuprogress.cc:341
 hsuprogress.cc:342
 hsuprogress.cc:343
 hsuprogress.cc:344
 hsuprogress.cc:345
 hsuprogress.cc:346
 hsuprogress.cc:347
 hsuprogress.cc:348
 hsuprogress.cc:349
 hsuprogress.cc:350
 hsuprogress.cc:351
 hsuprogress.cc:352
 hsuprogress.cc:353
 hsuprogress.cc:354
 hsuprogress.cc:355
 hsuprogress.cc:356
 hsuprogress.cc:357
 hsuprogress.cc:358
 hsuprogress.cc:359
 hsuprogress.cc:360
 hsuprogress.cc:361
 hsuprogress.cc:362
 hsuprogress.cc:363
 hsuprogress.cc:364
 hsuprogress.cc:365
 hsuprogress.cc:366
 hsuprogress.cc:367
 hsuprogress.cc:368
 hsuprogress.cc:369
 hsuprogress.cc:370
 hsuprogress.cc:371
 hsuprogress.cc:372
 hsuprogress.cc:373
 hsuprogress.cc:374
 hsuprogress.cc:375
 hsuprogress.cc:376
 hsuprogress.cc:377
 hsuprogress.cc:378
 hsuprogress.cc:379
 hsuprogress.cc:380
 hsuprogress.cc:381
 hsuprogress.cc:382
 hsuprogress.cc:383