TSoftwareAdcModule.cc

TSoftwareAdcModuleクラスの解説 TSoftwareAdcModule.hh
// ============================================================================
//  $Id$
//  $Name$
// ============================================================================
#include "TSoftwareAdcModule.hh"
#include "TDataSegment.hh"
#include "TDataElement.hh"

Tlong TSoftwareAdcModule::theSeed = (Tlong)time( 0 );
TRandomEngine TSoftwareAdcModule::theRandomEngine = TRandomEngine( theSeed );

TSoftwareAdcModule::TSoftwareAdcModule( Tint nchannel, Tint scale, Tint id )
  : TSoftwareModule( nchannel, tStatusSuccess, id ), theScale( scale ),
    theRandomFlat( TSoftwareAdcModule::theRandomEngine ), 
    theRandomGaussian( TSoftwareAdcModule::theRandomEngine )
{
  if ( scale < 0 )
    theScale = tDefaultScale;
  theChannel = new TChannel( theNumberOfChannels );
  for ( Tint i = 0; i < theNumberOfChannels; i ++ )
    theChannel -> Add( new Tint( 0 ) );

  setParameters();
}

TSoftwareAdcModule::~TSoftwareAdcModule()
{
  delete [] theMean;
  delete [] theSigma;
  delete theChannel;
}

Tint TSoftwareAdcModule::Clear()
{
  theChannel -> Clear();
  return( theStatus = tStatusSuccess );
}

Tint TSoftwareAdcModule::Update()
{
  theStatus = tStatusSuccess;
  Clear();
  for ( Tint i = 0; i < theNumberOfChannels; i ++ ) {
    Tdouble ddata = theRandomGaussian.fire( (Tdouble)theMean[ i ], (Tdouble)theSigma[ i ] );
    Tint idata = (Tint)ddata;
    if ( idata > theScale ) {
      idata = tDataOverFlow;
      theStatus = -EFAULT;
    }
    theChannel -> Add( new Tint( idata ) );
  }
  return( theStatus );
}

Tint TSoftwareAdcModule::Initialize()
{
  Clear();
  delete [] theMean;
  delete [] theSigma;
  for ( Tint i = 0; i < theNumberOfChannels; i ++ )
    theChannel -> Add( new Tint( 0 ) );
  setParameters();
  return( theStatus = tStatusSuccess );
}

Tvoid TSoftwareAdcModule::FillData( TDataSegment* segment )
{
  for ( Tint i = 0; i < theNumberOfChannels; i ++ )
    segment -> Add( new TDataElement( theChannel -> Get( i ), tTypeInt, i ) );
  return;
}

Tvoid TSoftwareAdcModule::FillData( TDataElement* element )
{
  Tint ch = element -> GetID();
  if ( ch < 0 || ( ch >= theChannel -> GetNumberOfEntries() ) ) {
    Tint tmp = -EFAULT;
    element -> FillData( &tmp, tTypeInt );
  } else {
    element -> FillData( theChannel -> Get( ch ), tTypeInt );
  }
  return;
}

Tvoid TSoftwareAdcModule::setParameters()
{
  theMean = new Tint[ theNumberOfChannels ];
  theSigma = new Tint[ theNumberOfChannels ];

  for ( Tint i = 0; i < theNumberOfChannels; i ++ ) {
    theMean[ i ] = theRandomFlat.fireInt( theScale );

    Tdouble distance = (Tdouble)theMean[ i ];
    if ( (Tdouble)theScale / 2.0 < distance )
      distance = theScale - distance;
    // 3sigma = 0.997
    theSigma[ i ] = theRandomFlat.fireInt( (Tint)( distance / 3.0 ) );
  }
  return;
}

Tvoid TSoftwareAdcModule::Print( Tostream& tos ) const
{
  Tstring head = Twspace + Twspace + Twspace + "* Software ADC, ";
  tos << head << "Status: " << theStatus << Twspace;
  tos << "Scale: " << theScale << Twspace;
  tos << "ID: " << theID << Tendl;

  for ( Tint i = 0; i < theNumberOfChannels; i ++ ) {
    tos << Twspace << head << "Channel: " << i;
    tos << Twspace << "Mean: " << theMean[ i ];
    tos << Twspace << "Sigma: " << theSigma[ i ];
    tos << Twspace << "Data: " << *( theChannel -> Get( i ) ) << Tendl;
  }

  return;
}
$Id$
$Name$