smart_arrays_peaks 2.1.3

  • Readme
  • Changelog
  • Example
  • Installing
  • 62

Smart Arrays Peaks #

What the package can do for you #

This package provides functions that detect peaks (maximum values) in one- or two-dimensional arrays. Peak detection (peak search, peak picking) does not simply mean finding maximum values. Data originating from measurements are often subject to noise, i.e. random small variations of the measured values. The provided algorithms therefore allow you to specify a noise value to exclude noise effects from peak search.

Example #

The major API functionalities #

  • class PeakPicker1D

This example will pick the positive and negative peaks in the entire array using the noise discriminator 2.0. The result contains the array indices of the found peaks.

List<int> peakIndices = PeakPicker1D.detectPeaks( array, 0, array.length, 2.0, 0.0, PeakPicker1D.PICK_POSNEG, 0);

  • class PeakPicker2D:

This example will pick the negative peaks in the entire array2D using the noise discriminator 2.0. The result contains the array indices (row/column pairs) of the found peaks.

List<List<int>> peakIndices = PeakPicker2D.detectPeaks( array2D, 0, array2D.length,0,array2D[0].lebngth, 2.0, 0.00, PeakPicker1D.PICK_NEG, 0);

smart_arrays_base: Basic functions for 1D and 2D arrays

smart_arrays_numerics: Numerics with 1D and 2D arrays

smart_arrays_compress: Compress 1D and 2D arrays to a smaller size.

smart_arrays_sample_data: Computes 1D and 2D arrays containing sample data.

smart_arrays_dbstore: Store 1D and 2D arrays along with metadata on the local device.

smart_arrays_plot_polyline: Plot 1D arrays as polyline along with axes and more.

smart_arrays_contour_finder: Contours the three-dimensional surface represented by the values f(x,y) of a matrix.

smart_arrays_lmfit: Fits (x, y) data given as arrays to a specified model function using the Levenberg-Marquardt algorithm.

smart_lorentz-gauss: Compute Lorentz-Gauss (pseudo-Voigt) line shapes.

smart_signal_processing: Fourier transform and more.

smart_dialogs: Easy-to-use dialogs in Web applications

Smart Arrays Peaks #

Version history #

2.1.3 - 2019-10-02 Docu updates

2.1.2 - 2019-10-01 Docu updates

2.1.1 - 2019-10-01 Docu updates

2.1.0 - 2019-10-01 Example now displays 1D peak picking result as tick marks, and 2D results as a legend in the browser

2.0.0 - 2019-03-13 First version available on pub site

2.0.1 - 2019-03-14 Minor corrections

2.0.2 - 2019-03-14 Docu updates

2.0.3 - 2019-03-15 Docu updates

2.0.4 - 2019-03-24 Docu updates

2.0.5 - 2019-04-04 Docu updates

2.0.6 - 2019-05-05 Docu updates

2.0.7 - 2019-08-04 Using package:pedantic/analysis_options.yaml from now on

2.0.8 - 2019-08-04 Fixed health suggestions of pub.dev

2.0.9 - 2019-09-15 Example result is now graphically displayed in the browser

example/example.dart

// Copyright (c) 2019, Dr. Bruno Guigas. All rights reserved. Use of this source
// code is governed by a BSD-style license that can be found in the LICENSE file.
import 'dart:html';
import 'dart:convert';
import 'dart:typed_data';
import 'dart:math' as math;
import 'package:smart_arrays_peaks/smart_arrays_peaks.dart';
import 'package:smart_arrays_sample_data/smart_arrays_sample_data.dart';
import 'package:smart_arrays_plot_polyline/smart_arrays_plot_polyline.dart';
import 'package:smart_lorentz_gauss/smart_lorentz_gauss.dart';

/// Demonstrates peak picking for 1D and 2D arrays.
/// The result is shown in the browser.
main() {
  // compute a 1D array containing a sinc function
  final double VAL0 = 100.0, NOISE = 0.01 * VAL0;
  Float64List array = Sinc1D(1000, VAL0, 0.0, 8, 0.0).array;
  // add random "noise" to simulate "experimental" data
  math.Random rand = math.Random();
  for (int i = 0; i < array.length; i++) {
    array[i] += NOISE * (2 * rand.nextDouble() - 1.0).sign;
  }

  // Pick peaks on [array], neglect "noise peaks"
  List<int> peakIndices = PeakPicker1D.detectPeaks(
      array, 0, array.length, 2 * NOISE, 0.001, PeakPicker1D.PICK_POSNEG, 0);

  // Compute a sample 2D matrix with a negative and a positive peak
  // (the sum of 2 Lorentzian line shapes
  List<Float64List> matrix = LorentzGaussMatrix(
          rows_cols, amplitudes, centers, lineWidths, mixingFactors)
      .matrix;

  // Pick the 2D peaks on [matrix]
  List<List<int>> peakIndices2D = PeakPicker2D().detectPeaks(
      matrix,
      0,
      matrix.length,
      0,
      matrix[0].length,
      0.0,
      0.0,
      PeakPicker1D.PICK_POSNEG,
      0);

  // show result in the browser
  plotResult(array, matrix, peakIndices, peakIndices2D, null);
}

/// The Lorentz-Gauss shape parameters
List<int> rows_cols = [200, 300];
List<double> amplitudes = [100, -150];
List<List<double>> centers = [
  [80, 100],
  [150, 200]
];
List<List<double>> lineWidths = [
  [15, 15],
  [20, 20]
];
List<List<double>> mixingFactors = [
  [0.0, 0.0],
  [0.0, 0.0]
];

/// Displays the [matrix] computed by [main] in the browser using the
/// package 'smart_arrays_plot_polyline'.
void plotResult(
    Float64List array,
    List<Float64List> matrix,
    List<int> peakIndices,
    List<List<int>> peakIndices2D,
    List<Map<MarA, String>> markerAttrList) {
  // get divs from 'example.html' (application and plot containers)
  DivElement appDiv = (querySelector("#app_div") as DivElement);
  DivElement plotDiv = (querySelector("#plot_div") as DivElement);

  // the plot will take all available space of [appDiv] in this example
  plotDiv.style
    ..width = "${appDiv.clientWidth}px"
    ..height = "${appDiv.clientHeight}px";

  // setup some polyline, axis and legend attributes
  List<Map<PyA, String>> plotAttr = [
    {PyA.YPOSITION_ZERO: "0.8"}
  ];

  // x axis labeling
  Map<AxA, String> xaxisAttr = {
    AxA.PHYS_X_START: "0",
    AxA.PHYS_X_WIDTH: "${array.length}",
    AxA.LEGENDTEXT: "Number of points"
  };

  // y axis labeling
  Map<AxA, String> yaxisAttr = {AxA.LEGENDTEXT: "Function value"};

  // legend text and position
  Map<LegA, String> legendAttr = {
    LegA.TOP_TITLE: "Peak picking a noisy sinc function: " +
        "Red ticks = positive peaks, green ticks = negative peaks",
    LegA.SUB_TITLES: json.encode(["100 * sin(x) / x"]),
    LegA.X: "45",
    LegA.Y: "15"
  };

  // plot the arrays into [plotDiv]
  SimplePlot splot = SimplePlot(
      [array], plotDiv, plotAttr, xaxisAttr, yaxisAttr, legendAttr, null);

  // setup peak marker: Use peak indices and respective array values for output
  List<double> markerIndices = List(peakIndices.length);
  List<String> markerLabels = List(peakIndices.length);
  for (int i = 0; i < peakIndices.length; i++) {
    int ipeak = peakIndices[i];
    markerIndices[i] = ipeak.toDouble();
    markerLabels[i] = "$ipeak / ${array[ipeak].toStringAsFixed(2)}";
  }

  // draw the peak markers
  splot.polylines[0].drawMarkers(markerIndices, markerLabels, markerAttrList);

  List<String> peak2DPrintout = [];
  peak2DPrintout.add("Result of Lorentz-Gauss matrix peak picking");
  peak2DPrintout.add("# / row / col / value: ");
  for (int i = 0; i < peakIndices2D.length; i++) {
    int row = peakIndices2D[i][0];
    int col = peakIndices2D[i][1];

    peak2DPrintout
        .add("${i + 1} / $row / $col / ${matrix[row][col].toStringAsFixed(2)}");
  }

  Map<LegA, String> legend2Attr = {
    LegA.TOP_TITLE: "2D peak picking result:",
    LegA.SUB_TITLES: json.encode(peak2DPrintout),
    LegA.TEXT_COLOR: "darkgreen",
    LegA.X: "${splot.pl.dataAreaRect.width ~/ 3}",
    LegA.Y: "100"
  };

  // append the fitResultPrintOut legend to the plot's data area
  Legend legend2 = SimplePlot.createLegend(legend2Attr, null);
  splot.pl.dataArea.append(legend2.legendContainer);
}

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  smart_arrays_peaks: ^2.1.3

2. Install it

You can install packages from the command line:

with pub:


$ pub get

with Flutter:


$ flutter pub get

Alternatively, your editor might support pub get or flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:smart_arrays_peaks/smart_arrays_peaks.dart';
  
Popularity:
Describes how popular the package is relative to other packages. [more]
25
Health:
Code health derived from static analysis. [more]
100
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
100
Overall:
Weighted score of the above. [more]
62
Learn more about scoring.

We analyzed this package on Oct 18, 2019, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.5.1
  • pana: 0.12.21

Platforms

Detected platforms: Flutter, web, other

No platform restriction found in primary library package:smart_arrays_peaks/smart_arrays_peaks.dart.

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.5.0 <3.0.0
build_runner ^1.6.2 1.7.1 1.7.2
build_web_compilers ^2.1.4 2.7.0
pedantic ^1.7.0 1.8.0+1
smart_arrays_base ^2.0.0 2.1.0
smart_arrays_plot_polyline ^2.1.0 2.2.1
smart_arrays_sample_data ^2.0.3 2.0.5
smart_lorentz_gauss ^2.1.2 2.1.2
Transitive dependencies
analyzer 0.38.5
archive 2.0.10
args 1.5.2
async 2.4.0
bazel_worker 0.1.22
build 1.2.0
build_config 0.4.1+1
build_daemon 2.1.0
build_modules 2.6.2
build_resolvers 1.2.1
build_runner_core 4.1.0
built_collection 4.2.2
built_value 6.7.1
charcode 1.1.2
checked_yaml 1.0.2
code_builder 3.2.0
collection 1.14.12
convert 2.1.1
crypto 2.1.3
csslib 0.16.1
dart_style 1.3.1
fixnum 0.10.9
front_end 0.1.27
glob 1.2.0
graphs 0.2.0
html 0.14.0+3
http 0.12.0+2
http_multi_server 2.1.0
http_parser 3.1.3
io 0.3.3
js 0.6.1+1
json_annotation 3.0.0
kernel 0.3.27
logging 0.11.3+2
matcher 0.12.5
meta 1.1.7
mime 0.9.6+3
node_interop 1.0.3
node_io 1.0.1+2
package_config 1.1.0
package_resolver 1.0.10
path 1.6.4
pool 1.4.0
protobuf 0.14.4 1.0.0
pub_semver 1.4.2
pubspec_parse 0.1.5
quiver 2.0.5
scratch_space 0.0.4+1
shelf 0.7.5
shelf_web_socket 0.2.3
smart_arrays_compress 2.1.0
smart_arrays_contour_finder 2.0.6
smart_arrays_numerics 2.1.1
source_maps 0.10.8
source_span 1.5.5
stack_trace 1.9.3
stream_channel 2.0.0
stream_transform 0.0.19
string_scanner 1.0.5
term_glyph 1.1.0
timing 0.1.1+2
typed_data 1.1.6
watcher 0.9.7+12
web_socket_channel 1.1.0
yaml 2.2.0