summaryrefslogtreecommitdiffstats
path: root/pkg/data/heatmap.go
blob: 7a0aa6fc6193db5dba3164e627269cfd3b832c6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package data

import "math"

type Heatmap struct {
	X, Y       []Bin
	Z          [][]float64
	MinX, MaxX uint64
	MinY, MaxY uint64
	MinZ, MaxZ uint64
}

func NewHeatmap(x, y []Bin, z [][]uint64) *Heatmap {
	h := new(Heatmap)
	h.X, h.Y = x, y
	h.Z = make([][]float64, len(z))
	h.MinX, h.MinY, h.MinZ = math.MaxUint64, math.MaxUint64, math.MaxUint64
	h.MaxX, h.MaxY, h.MaxZ = 0, 0, 0
	for _, b := range x {
		if b.Count > h.MaxX {
			h.MaxX = b.Count
		}
		if b.Count < h.MinX {
			h.MinX = b.Count
		}
	}
	for _, b := range x {
		b.CountNorm = float64(b.Count-h.MinX) / float64(h.MaxX-h.MinX)
	}
	for _, b := range y {
		if b.Count > h.MaxY {
			h.MaxY = b.Count
		}
		if b.Count < h.MinY {
			h.MinY = b.Count
		}
	}
	for _, b := range y {
		b.CountNorm = float64(b.Count-h.MinY) / float64(h.MaxY-h.MinY)
	}
	for i := range z {
		h.Z[i] = make([]float64, len(z[i]))
		for _, b := range z[i] {
			if b > h.MaxZ {
				h.MaxZ = b
			}
			if b < h.MinZ {
				h.MinZ = b
			}
		}
	}
	for i := range z {
		for j := range z[i] {
			h.Z[i][j] = float64(z[i][j]-h.MinZ) / float64(h.MaxZ-h.MinZ)
		}
	}
	if h.MaxX == 0 {
		h.MaxX = 1
	}
	if h.MaxY == 0 {
		h.MaxY = 1
	}
	if h.MaxZ == 0 {
		h.MaxZ = 1
	}

	return h
}