waveform_averager( const waveform_type& t ) : size_( t.size() ) , actualAverages_( 1 ) , data_( new lvalue_type[ size_ ] ) { std::copy( t.begin(), t.end(), data_.get() ); }
void operator () ( const waveform_type& data , adportable::counting::counting_result& result , std::vector< double >& processed ) { const bool findUp = method.slope == adcontrols::threshold_method::CrossUp; const unsigned int nfilter = static_cast<unsigned int>( method.response_time / data.meta_.xIncrement ) | 01; double level; if ( method.use_filter ) { waveform_type::apply_filter( processed, data, method ); level = method.threshold_level; } else { level = int( ( method.threshold_level + data.meta_.scaleOffset ) / data.meta_.scaleFactor ); } result.set_algo( static_cast< enum adportable::counting::algo >( method.algo_ ) ); result.set_threshold_level( method.threshold_level ); auto& elements = result.indices2(); adportable::counting::threshold_finder finder( findUp, nfilter ); const bool average( method.algo_ == adcontrols::threshold_method::AverageRelative ); adportable::stddev stddev; if ( ranges.enable() ) { using adcontrols::CountingMethod; for ( const auto& v: ranges ) { if ( std::get< CountingMethod::CountingEnable >( v ) ) { const auto& time_range = std::get< CountingMethod::CountingRange >( v ); // center, width auto offs = waveform_horizontal().range( data.method_, data.meta_, time_range ); if ( offs.second ) { size_t eoffs = offs.first + offs.second; if ( average ) { if ( method.use_filter ) { auto sd = stddev( processed.begin() + offs.first, offs.second ); finder( processed.begin(), processed.begin() + eoffs, elements, level + sd.second, offs.first ); } else if ( data.meta_.dataType == 1 ) { auto sd = stddev( data.template begin<int16_t>() + offs.first, offs.second ); finder( data.template begin<int8_t>(), data.template begin< int8_t >() + eoffs, elements, level + sd.second, offs.first ); } else if ( data.meta_.dataType == 2 ) { auto sd = stddev( data.template begin<int16_t>() + offs.first, offs.second ); finder( data.template begin<int16_t>(), data.template begin< int16_t >() + eoffs, elements, level + sd.second, offs.first ); } else if ( data.meta_.dataType == 4 ) { auto sd = stddev( data.template begin<int32_t>() + offs.first, offs.second ); finder( data.template begin<int32_t>(), data.template begin<int32_t>() + eoffs, elements, level + sd.second, offs.first ); } } else { if ( method.use_filter ) { finder( processed.begin(), processed.begin() + eoffs, elements, level, offs.first ); } else if ( data.meta_.dataType == 1 ) { finder( data.template begin<int8_t>(), data.template begin< int8_t >() + eoffs, elements, level, offs.first ); } else if ( data.meta_.dataType == 2 ) { finder( data.template begin<int16_t>(), data.template begin< int16_t >() + eoffs, elements, level, offs.first ); } else if ( data.meta_.dataType == 4 ) { finder( data.template begin<int32_t>(), data.template begin<int32_t>() + eoffs, elements, level, offs.first ); } } } } } } else { if ( average ) { if ( method.use_filter ) { auto sd = stddev( processed.begin(), processed.size() ); finder( processed.begin(), processed.end(), elements, level + sd.second, 0 ); } else if ( data.meta_.dataType == 1 ) { auto sd = stddev( data.template begin< int8_t >(), data.size() ); finder( data.template begin<int8_t>(), data.template end<int8_t>(), elements, level + sd.second ); } else if ( data.meta_.dataType == 2 ) { auto sd = stddev( data.template begin< int16_t >(), data.size() ); finder( data.template begin<int16_t>(), data.template end<int16_t>(), elements, level + sd.second ); } else if ( data.meta_.dataType == 4 ) { auto sd = stddev( data.template begin< int32_t >(), data.size() ); finder( data.template begin<int32_t>(), data.template end<int32_t>(), elements, level + sd.second ); } } else { if ( method.use_filter ) { finder( processed.begin(), processed.end(), elements, level, 0 ); } else if ( data.meta_.dataType == 1 ) { finder( data.template begin<int8_t>(), data.template end<int8_t>(), elements, level ); } else if ( data.meta_.dataType == 2 ) { finder( data.template begin<int16_t>(), data.template end<int16_t>(), elements, level ); } else if ( data.meta_.dataType == 4 ) { finder( data.template begin<int32_t>(), data.template end<int32_t>(), elements, level ); } } } }