ROOT logo
// $Id: TimeMaker.cxx 2767 2012-06-11 05:42:25Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

//__________________________________________________________________________
// TimeMaker
//
//

#include "TimeMaker.h"
#include "TimeMaker.c7"
#include <Glasses/ZHashList.h>
#include <Glasses/Eventor.h>
#include <Glasses/ZQueen.h>

#include <TMath.h>

ClassImp(TimeMaker);

/**************************************************************************/

void TimeMaker::_init()
{
  mFactor = 1;  mConstant = 0;

  mWrapMode = WM_None;
  mMinT  = 0;  mMaxT  = 1;
  mOmega = 1;  mDelta = 0;
  mLastT = 0;  bLastTOK = false;

  bApplyFormula = false;

  bPushToStack = bPopFromStack = true;

  bEmitStamps = false;
  bPrintOut   = false;
}

/**************************************************************************/

void TimeMaker::AddClient(ZGlass* lens)
{
  if(lens == 0) return;

  if(mClients == 0) {
    ZList* l = new ZHashList("TimeMakerClients");
    mQueen->CheckIn(l);
    SetClients(l);
  }

  mClients->Add(lens);
}

void TimeMaker::RemoveClient(ZGlass* lens)
{
  mClients->RemoveAll(lens);
}

/**************************************************************************/

void TimeMaker::EmitFormulaRay()
{
  mTF1.Compile(mFormula);
}

/**************************************************************************/

void TimeMaker::ResetRecursively()
{
  bLastTOK = false;
  PARENT_GLASS::ResetRecursively();
}

void TimeMaker::Operate(Operator::Arg* op_arg)
{
  Operator::PreOperate(op_arg);

  Double_t t = mFactor*op_arg->fEventor->GetEventTime() + mConstant;

  if (mWrapMode != WM_None)
  {
    switch (mWrapMode)
    {
      case WM_Clip:
        if(t < mMinT)      t = mMinT;
        else if(t > mMaxT) t = mMaxT;
        break;
      case WM_SawTooth:
      {
        const Double_t D  = mMaxT - mMinT;
        const Double_t ft = (t - mMinT)/D;
        t = mMinT + D * (ft - TMath::Floor(ft));
        break;
      }
      case WM_Triangular:
      {
        const Double_t D  = 2*(mMaxT - mMinT);
        const Double_t ft = (t - mMinT)/D;
        t = mMinT + D * (ft - TMath::Floor(ft));
        if(t > mMaxT) t -= 2*(t - mMaxT);
        break;
      }
      case WM_SineWave:
      {
        const Double_t D = mMaxT - mMinT;
        t = mMinT + 0.5*D*(TMath::Sin(mOmega*t + mDelta) + 1);
        break;
      }
      default:
        break;
    }
  }

  Double_t dt;
  if (bApplyFormula) {
    Double_t t_pf = t;
    t = mTF1.Eval(t);
    dt = bLastTOK ? t - mLastT : 0;
    if (bPrintOut)
      printf("%s Operate t_in = %g, t_pf = %g, t = %g, dt = %g\n",
	     Identify().Data(), op_arg->fEventor->GetEventTime(), t_pf, t, dt);
  } else {
    dt = bLastTOK ? t - mLastT : 0;
    if (bPrintOut)
      printf("%s Operate t_in = %g, t = %g, dt = %g\n",
	     Identify().Data(), op_arg->fEventor->GetEventTime(), t, dt);
  }

  if (mClients != 0)
  {
    list<TimeMakerClient*> clients;
    mClients->CopyListByClass<TimeMakerClient>(clients);
    for (list<TimeMakerClient*>::iterator i=clients.begin(); i!=clients.end(); ++i)
    {
      (*i)->TimeTick(t, dt);
    }
  }

  if (bPushToStack)
    op_arg->fEventor->PushEventTime(t);

  Operator::PostOperate(op_arg);

  if (bPopFromStack)
    op_arg->fEventor->PopEventTime();

  mLastT   = t;
  bLastTOK = true;

  if (bEmitStamps) Stamp(FID());
}

/**************************************************************************/
 TimeMaker.cxx:1
 TimeMaker.cxx:2
 TimeMaker.cxx:3
 TimeMaker.cxx:4
 TimeMaker.cxx:5
 TimeMaker.cxx:6
 TimeMaker.cxx:7
 TimeMaker.cxx:8
 TimeMaker.cxx:9
 TimeMaker.cxx:10
 TimeMaker.cxx:11
 TimeMaker.cxx:12
 TimeMaker.cxx:13
 TimeMaker.cxx:14
 TimeMaker.cxx:15
 TimeMaker.cxx:16
 TimeMaker.cxx:17
 TimeMaker.cxx:18
 TimeMaker.cxx:19
 TimeMaker.cxx:20
 TimeMaker.cxx:21
 TimeMaker.cxx:22
 TimeMaker.cxx:23
 TimeMaker.cxx:24
 TimeMaker.cxx:25
 TimeMaker.cxx:26
 TimeMaker.cxx:27
 TimeMaker.cxx:28
 TimeMaker.cxx:29
 TimeMaker.cxx:30
 TimeMaker.cxx:31
 TimeMaker.cxx:32
 TimeMaker.cxx:33
 TimeMaker.cxx:34
 TimeMaker.cxx:35
 TimeMaker.cxx:36
 TimeMaker.cxx:37
 TimeMaker.cxx:38
 TimeMaker.cxx:39
 TimeMaker.cxx:40
 TimeMaker.cxx:41
 TimeMaker.cxx:42
 TimeMaker.cxx:43
 TimeMaker.cxx:44
 TimeMaker.cxx:45
 TimeMaker.cxx:46
 TimeMaker.cxx:47
 TimeMaker.cxx:48
 TimeMaker.cxx:49
 TimeMaker.cxx:50
 TimeMaker.cxx:51
 TimeMaker.cxx:52
 TimeMaker.cxx:53
 TimeMaker.cxx:54
 TimeMaker.cxx:55
 TimeMaker.cxx:56
 TimeMaker.cxx:57
 TimeMaker.cxx:58
 TimeMaker.cxx:59
 TimeMaker.cxx:60
 TimeMaker.cxx:61
 TimeMaker.cxx:62
 TimeMaker.cxx:63
 TimeMaker.cxx:64
 TimeMaker.cxx:65
 TimeMaker.cxx:66
 TimeMaker.cxx:67
 TimeMaker.cxx:68
 TimeMaker.cxx:69
 TimeMaker.cxx:70
 TimeMaker.cxx:71
 TimeMaker.cxx:72
 TimeMaker.cxx:73
 TimeMaker.cxx:74
 TimeMaker.cxx:75
 TimeMaker.cxx:76
 TimeMaker.cxx:77
 TimeMaker.cxx:78
 TimeMaker.cxx:79
 TimeMaker.cxx:80
 TimeMaker.cxx:81
 TimeMaker.cxx:82
 TimeMaker.cxx:83
 TimeMaker.cxx:84
 TimeMaker.cxx:85
 TimeMaker.cxx:86
 TimeMaker.cxx:87
 TimeMaker.cxx:88
 TimeMaker.cxx:89
 TimeMaker.cxx:90
 TimeMaker.cxx:91
 TimeMaker.cxx:92
 TimeMaker.cxx:93
 TimeMaker.cxx:94
 TimeMaker.cxx:95
 TimeMaker.cxx:96
 TimeMaker.cxx:97
 TimeMaker.cxx:98
 TimeMaker.cxx:99
 TimeMaker.cxx:100
 TimeMaker.cxx:101
 TimeMaker.cxx:102
 TimeMaker.cxx:103
 TimeMaker.cxx:104
 TimeMaker.cxx:105
 TimeMaker.cxx:106
 TimeMaker.cxx:107
 TimeMaker.cxx:108
 TimeMaker.cxx:109
 TimeMaker.cxx:110
 TimeMaker.cxx:111
 TimeMaker.cxx:112
 TimeMaker.cxx:113
 TimeMaker.cxx:114
 TimeMaker.cxx:115
 TimeMaker.cxx:116
 TimeMaker.cxx:117
 TimeMaker.cxx:118
 TimeMaker.cxx:119
 TimeMaker.cxx:120
 TimeMaker.cxx:121
 TimeMaker.cxx:122
 TimeMaker.cxx:123
 TimeMaker.cxx:124
 TimeMaker.cxx:125
 TimeMaker.cxx:126
 TimeMaker.cxx:127
 TimeMaker.cxx:128
 TimeMaker.cxx:129
 TimeMaker.cxx:130
 TimeMaker.cxx:131
 TimeMaker.cxx:132
 TimeMaker.cxx:133
 TimeMaker.cxx:134
 TimeMaker.cxx:135
 TimeMaker.cxx:136
 TimeMaker.cxx:137
 TimeMaker.cxx:138
 TimeMaker.cxx:139
 TimeMaker.cxx:140
 TimeMaker.cxx:141
 TimeMaker.cxx:142
 TimeMaker.cxx:143
 TimeMaker.cxx:144
 TimeMaker.cxx:145
 TimeMaker.cxx:146
 TimeMaker.cxx:147
 TimeMaker.cxx:148
 TimeMaker.cxx:149
 TimeMaker.cxx:150
 TimeMaker.cxx:151
 TimeMaker.cxx:152
 TimeMaker.cxx:153
 TimeMaker.cxx:154
 TimeMaker.cxx:155