// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Filters__Mori__hxx__ #define __fpa__Filters__Mori__hxx__ // ------------------------------------------------------------------------- template< class _TTraits > typename fpa::Filters::Mori< _TTraits >:: TOutputValue fpa::Filters::Mori< _TTraits >:: GetOutsideValue( ) const { return( this->GetInitValue( ) ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: SetOutsideValue( const TOutputValue& v ) { this->SetInitValue( v ); } // ------------------------------------------------------------------------- template< class _TTraits > unsigned long fpa::Filters::Mori< _TTraits >:: GetSignalKernelSize( ) const { return( this->m_PeakDetector.GetKernelSize( ) ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: SetSignalKernelSize( unsigned long k ) { this->m_PeakDetector.SetKernelSize( k ); this->Modified( ); } // ------------------------------------------------------------------------- template< class _TTraits > double fpa::Filters::Mori< _TTraits >:: GetSignalThreshold( ) const { return( this->m_PeakDetector.GetThreshold( ) ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: SetSignalThreshold( double t ) { this->m_PeakDetector.SetThreshold( t ); this->Modified( ); } // ------------------------------------------------------------------------- template< class _TTraits > double fpa::Filters::Mori< _TTraits >:: GetSignalInfluence( ) const { return( this->m_PeakDetector.GetInfluence( ) ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: SetSignalInfluence( double i ) { this->m_PeakDetector.SetInfluence( i ); this->Modified( ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: ClearThresholds( ) { this->m_Thresholds.clear( ); this->Modified( ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: AddThreshold( const TInputValue& thr ) { if( this->m_Thresholds.insert( thr ).second ) this->Modified( ); } // ------------------------------------------------------------------------- template< class _TTraits > const typename fpa::Filters::Mori< _TTraits >:: TThresholds& fpa::Filters::Mori< _TTraits >:: GetThresholds( ) const { return( this->m_Thresholds ); } // ------------------------------------------------------------------------- template< class _TTraits > unsigned long fpa::Filters::Mori< _TTraits >:: GetNumberOfEvaluatedThresholds( ) const { return( this->m_PeakDetector.GetNumberOfSamples( ) ); } // ------------------------------------------------------------------------- template< class _TTraits > typename fpa::Filters::Mori< _TTraits >:: TInputValue fpa::Filters::Mori< _TTraits >:: GetOptimumThreshold( ) const { TInputValue thr = TInputValue( 0 ); unsigned long n = this->m_PeakDetector.GetNumberOfSamples( ); if( n > 1 ) thr = TInputValue( this->m_PeakDetector.GetXValues( )[ n - 2 ] ); return( thr ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: GetSignalValues( unsigned long i, double& x, double& y, TPeak& p ) const { if( i < this->m_PeakDetector.GetNumberOfSamples( ) ) { x = this->m_PeakDetector.GetXValues( )[ i ]; y = this->m_PeakDetector.GetYValues( )[ i ]; p = this->m_PeakDetector.GetPeaks( )[ i ]; } // fi } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: SetThresholds( const TInputValue& lower, const TInputValue& upper, const TInputValue& delta ) { for( TInputValue t = lower; t <= upper; t += delta ) this->AddThreshold( t ); } // ------------------------------------------------------------------------- template< class _TTraits > fpa::Filters::Mori< _TTraits >:: Mori( ) : Superclass( ), m_InsideValue( TOutputValue( 1 ) ) { this->SetOutsideValue( 0 ); this->m_Predicate = TPredicate::New( ); this->m_Predicate->StrictOff( ); if( std::numeric_limits< TInputValue >::is_integer ) this->m_MinimumThreshold = std::numeric_limits< TInputValue >::min( ); else this->m_MinimumThreshold = -std::numeric_limits< TInputValue >::max( ); this->m_PeakDetector.SetKernelSize( 20 ); this->m_PeakDetector.SetThreshold( 500 ); this->m_PeakDetector.SetInfluence( 0.5 ); } // ------------------------------------------------------------------------- template< class _TTraits > fpa::Filters::Mori< _TTraits >:: ~Mori( ) { } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: _BeforeGenerateData( ) { this->Superclass::_BeforeGenerateData( ); // Prepare queues this->_QueueClear( ); this->m_CurrQueue = 0; // Prepare iteration over all thresholds this->m_CurrThr = this->m_Thresholds.begin( ); this->m_Predicate->SetLowerThreshold( *( this->m_CurrThr ) ); this->m_CurrThr++; this->m_Predicate->SetUpperThreshold( *( this->m_CurrThr ) ); // Prepare counting signal this->m_CurrCount = double( 0 ); this->m_PeakDetector.Clear( ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: _Reinitialize( ) { if( this->m_Queues[ this->m_CurrQueue ].size( ) == 0 ) { // Update peak detector TPeak p = this->m_PeakDetector.AddValue( *this->m_CurrThr, this->m_CurrCount ); this->m_CurrThr++; this->m_CurrQueue = ( this->m_CurrQueue + 1 ) % 2; if( this->m_CurrThr != this->m_Thresholds.end( ) ) { // Update predicate and counting value this->m_Predicate->SetUpperThreshold( *( this->m_CurrThr ) ); this->m_CurrCount = double( 0 ); // Peak detected? -> stop! if( p == TPeakDetector::PosPeak && this->m_MinimumThreshold < *( this->m_CurrThr ) ) this->_QueueClear( ); } else this->_QueueClear( ); } // fi } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: _UpdateOutputValue( TNode& n ) { TInputValue value = this->_GetInputValue( n.Vertex ); bool inside = this->m_Predicate->Evaluate( value ); if( !inside ) { n.Value = this->m_InitValue; n.FrontId++; this->m_Queues[ ( this->m_CurrQueue + 1 ) % 2 ].push_back( n ); n.FrontId = 0; } else { n.Value = this->m_InsideValue; this->m_CurrCount += double( 1 ); } // fi } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: _QueueClear( ) { this->m_Queues[ 0 ].clear( ); this->m_Queues[ 1 ].clear( ); } // ------------------------------------------------------------------------- template< class _TTraits > typename fpa::Filters::Mori< _TTraits >:: TNode fpa::Filters::Mori< _TTraits >:: _QueuePop( ) { TNode n = this->m_Queues[ this->m_CurrQueue ].front( ); this->m_Queues[ this->m_CurrQueue ].pop_front( ); return( n ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: _QueuePush( const TNode& n ) { this->m_Queues[ this->m_CurrQueue ].push_back( n ); } // ------------------------------------------------------------------------- template< class _TTraits > unsigned long fpa::Filters::Mori< _TTraits >:: _QueueSize( ) const { return( this->m_Queues[ this->m_CurrQueue ].size( ) ); } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Mori< _TTraits >:: _ComputeOutputValue( TNode& n ) { // Do nothing } #endif // __fpa__Filters__Mori__hxx__ // eof - $RCSfile$