histogram.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. /**
  2. * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { arrayMinMax } from '../mol-util/array';
  7. export interface Histogram {
  8. min: number,
  9. max: number,
  10. binWidth: number,
  11. counts: Int32Array
  12. }
  13. export function calculateHistogram(data: ArrayLike<number>, binCount: number, options?: { min: number, max: number, }): Histogram {
  14. if (!options) {
  15. const [min, max] = arrayMinMax(data);
  16. return _calcHistogram(data, binCount, min, max);
  17. } else {
  18. return _calcHistogram(data, binCount, options.min, options.max);
  19. }
  20. }
  21. function _calcHistogram(data: ArrayLike<number>, binCount: number, min: number, max: number): Histogram {
  22. let binWidth = (max - min) / binCount;
  23. if (binWidth === 0) binWidth = 1;
  24. const counts = new Int32Array(binCount);
  25. for (let i = 0, _i = data.length; i < _i; i++) {
  26. let bin = Math.floor((data[i] - min) / binWidth);
  27. if (bin >= binCount) bin = binCount - 1;
  28. else if (bin < 0) bin = 0;
  29. counts[bin]++;
  30. }
  31. return { min, max, binWidth, counts };
  32. }