]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Base/Mori.hxx
...
[FrontAlgorithms.git] / lib / fpa / Base / Mori.hxx
index f0141448ef11996a484e35fe68201d0c6b8dcbb2..3d1a94dfa63e996cbf36aa580a8ae15bdd964660 100644 (file)
@@ -33,6 +33,57 @@ SetOutsideValue( const TOutputValue& v )
   this->SetInitValue( v );
 }
 
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+unsigned long fpa::Base::Mori< _TAlgorithm >::
+GetSignalKernelSize( ) const
+{
+  return( this->m_PeakDetector.GetKernelSize( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+double fpa::Base::Mori< _TAlgorithm >::
+GetSignalThreshold( ) const
+{
+  return( this->m_PeakDetector.GetThreshold( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+double fpa::Base::Mori< _TAlgorithm >::
+GetSignalInfluence( ) const
+{
+  return( this->m_PeakDetector.GetInfluence( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+void fpa::Base::Mori< _TAlgorithm >::
+SetSignalKernelSize( unsigned long k )
+{
+  this->m_PeakDetector.SetKernelSize( k );
+  this->Modified( );
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+void fpa::Base::Mori< _TAlgorithm >::
+SetSignalThreshold( double t )
+{
+  this->m_PeakDetector.SetThreshold( t );
+  this->Modified( );
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+void fpa::Base::Mori< _TAlgorithm >::
+SetSignalInfluence( double i )
+{
+  this->m_PeakDetector.SetInfluence( i );
+  this->Modified( );
+}
+
 // -------------------------------------------------------------------------
 template< class _TAlgorithm >
 void fpa::Base::Mori< _TAlgorithm >::
@@ -64,16 +115,67 @@ SetThresholds(
     this->AddThreshold( thr );
 }
 
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+const typename fpa::Base::Mori< _TAlgorithm >::
+TThresholds& fpa::Base::Mori< _TAlgorithm >::
+GetThresholds( ) const
+{
+  return( this->m_Thresholds );
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+unsigned long fpa::Base::Mori< _TAlgorithm >::
+GetNumberOfEvaluatedThresholds( ) const
+{
+  return( this->m_PeakDetector.GetNumberOfSamples( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+typename fpa::Base::Mori< _TAlgorithm >::
+TInputValue fpa::Base::Mori< _TAlgorithm >::
+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 _TAlgorithm >
+void fpa::Base::Mori< _TAlgorithm >::
+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 _TAlgorithm >
 fpa::Base::Mori< _TAlgorithm >::
 Mori( )
   : Superclass( ),
-    m_InsideValue( TOutputValue( 1 ) )
+     m_InsideValue( TOutputValue( 1 ) )
 {
   this->SetInitValue( TOutputValue( 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 );
 }
 
 // -------------------------------------------------------------------------
@@ -90,31 +192,19 @@ _BeforeGenerateData( )
 {
   this->Superclass::_BeforeGenerateData( );
 
+  // Prepare queues
   this->_QueueClear( );
-  this->m_CurrentQueue = 0;
-  this->m_CurrentThreshold = this->m_Thresholds.begin( );
-  this->m_Predicate->SetLower( *( this->m_CurrentThreshold ) );
-  this->m_CurrentThreshold++;
-  this->m_Predicate->SetUpper( *( this->m_CurrentThreshold ) );
-  this->m_Count = 0;
-  this->m_Signal.clear( );
-}
-
-// -------------------------------------------------------------------------
-template< class _TAlgorithm >
-void fpa::Base::Mori< _TAlgorithm >::
-_AfterGenerateData( )
-{
-  // https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data
-  this->Superclass::_AfterGenerateData( );
+  this->m_CurrQueue = 0;
 
-  typename TSignal::const_iterator sIt = this->m_Signal.begin( );
-  for( ; sIt != this->m_Signal.end( ); ++sIt )
-  {
-    std::cout << int( sIt->first ) << " " << int( sIt->second.first ) << " " << sIt->second.second << std::endl;
+  // Prepare iteration over all thresholds
+  this->m_CurrThr = this->m_Thresholds.begin( );
+  this->m_Predicate->SetLower( *( this->m_CurrThr ) );
+  this->m_CurrThr++;
+  this->m_Predicate->SetUpper( *( this->m_CurrThr ) );
 
-  } // rof
-  std::cerr << ( this->m_CurrentThreshold != this->m_Thresholds.end( ) ) << std::endl;
+  // Prepare counting signal
+  this->m_CurrCount = double( 0 );
+  this->m_PeakDetector.Clear( );
 }
 
 // -------------------------------------------------------------------------
@@ -122,17 +212,26 @@ template< class _TAlgorithm >
 void fpa::Base::Mori< _TAlgorithm >::
 _FinishOneLoop( )
 {
-  if( this->m_Queues[ this->m_CurrentQueue ].size( ) == 0 )
+  if( this->m_Queues[ this->m_CurrQueue ].size( ) == 0 )
   {
-    this->m_Signal[ this->m_Signal.size( ) + 1 ] =
-      TSignalData( *this->m_CurrentThreshold, this->m_Count );
-    std::cerr << *( this->m_CurrentThreshold ) << std::endl;
-    this->m_CurrentThreshold++;
-    this->m_CurrentQueue = ( this->m_CurrentQueue + 1 ) % 2;
-    if( this->m_CurrentThreshold != this->m_Thresholds.end( ) )
+    // Update peak detector
+    TPeak p = this->m_PeakDetector.AddValue(
+      *this->m_CurrThr, this->m_CurrCount
+      );
+    std::cout << *( this->m_CurrThr ) << " " << this->m_CurrCount << std::endl;
+    this->m_CurrThr++;
+    if( this->m_CurrThr != this->m_Thresholds.end( ) )
     {
-      this->m_Predicate->SetUpper( *( this->m_CurrentThreshold ) );
-      this->m_Count = 0;
+      // Update predicate and counting value
+      this->m_Predicate->SetUpper( *( 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( );
@@ -142,22 +241,35 @@ _FinishOneLoop( )
 
 // -------------------------------------------------------------------------
 template< class _TAlgorithm >
-bool fpa::Base::Mori< _TAlgorithm >::
+void fpa::Base::Mori< _TAlgorithm >::
 _ComputeOutputValue( TNode& n )
+{
+  // Do nothing!!!
+}
+
+// -------------------------------------------------------------------------
+template< class _TAlgorithm >
+void fpa::Base::Mori< _TAlgorithm >::
+_UpdateOutputValue( TNode& n )
 {
   TInputValue value = this->_GetInputValue( n.Vertex );
   bool inside = this->m_Predicate->Evaluate( value );
-  n.Value = this->m_InsideValue;
   if( !inside )
   {
+    n.Value = this->m_InitValue;
     n.FrontId++;
-    this->m_Queues[ ( this->m_CurrentQueue + 1 ) % 2 ].push_back( n );
+    this->m_Queues[ ( this->m_CurrQueue + 1 ) % 2 ].push_back( n );
+    n.FrontId = 0;
   }
   else
-    this->m_Count++;
-  return( inside );
+  {
+    n.Value = this->m_InsideValue;
+    this->m_CurrCount += double( 1 );
+
+  } // fi
+  this->Superclass::_UpdateOutputValue( n );
 }
-  
+
 // -------------------------------------------------------------------------
 template< class _TAlgorithm >
 void fpa::Base::Mori< _TAlgorithm >::
@@ -173,8 +285,8 @@ typename fpa::Base::Mori< _TAlgorithm >::
 TNode fpa::Base::Mori< _TAlgorithm >::
 _QueuePop( )
 {
-  TNode n = this->m_Queues[ this->m_CurrentQueue ].front( );
-  this->m_Queues[ this->m_CurrentQueue ].pop_front( );
+  TNode n = this->m_Queues[ this->m_CurrQueue ].front( );
+  this->m_Queues[ this->m_CurrQueue ].pop_front( );
   return( n );
 }
 
@@ -183,7 +295,7 @@ template< class _TAlgorithm >
 void fpa::Base::Mori< _TAlgorithm >::
 _QueuePush( const TNode& node )
 {
-  this->m_Queues[ this->m_CurrentQueue ].push_back( node );
+  this->m_Queues[ this->m_CurrQueue ].push_back( node );
 }
 
 // -------------------------------------------------------------------------
@@ -191,7 +303,7 @@ template< class _TAlgorithm >
 unsigned long fpa::Base::Mori< _TAlgorithm >::
 _QueueSize( ) const
 {
-  return( this->m_Queues[ this->m_CurrentQueue ].size( ) );
+  return( this->m_Queues[ this->m_CurrQueue ].size( ) );
 }
 
 // -------------------------------------------------------------------------
@@ -201,7 +313,7 @@ _PrepareSeeds( TNodes& nodes )
 {
   typename TNodes::iterator nIt = nodes.begin( );
   for( ; nIt != nodes.end( ); ++nIt )
-    nIt->Value = this->m_InsideValue;
+    nIt->Value = this->m_InitValue;
 }
 
 #endif // __fpa__Base__Mori__hxx__