1
+ // / \file ROOT/RTreeMapBase.hxx
2
+ // / \ingroup TreeMap ROOT7
3
+ // / \author Patryk Tymoteusz Pilichowski <[email protected] >
4
+ // / \date 2025-08-21
5
+ // / \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback
6
+ // / is welcome!
7
+
8
+ /* ************************************************************************
9
+ * Copyright (C) 1995-2025, Rene Brun and Fons Rademakers. *
10
+ * All rights reserved. *
11
+ * *
12
+ * For the licensing terms see $ROOTSYS/LICENSE. *
13
+ * For the list of contributors see $ROOTSYS/README/CREDITS. *
14
+ *************************************************************************/
15
+
16
+ #ifndef RTREEMAPBASE_HXX
17
+ #define RTREEMAPBASE_HXX
18
+
19
+ #include < cstdint>
20
+ #include < string>
21
+ #include < vector>
22
+
23
+ namespace ROOT ::Experimental {
24
+
25
+ // clang-format off
26
+ /* *
27
+ \class ROOT::Experimental::RTreeMapBase
28
+ \ingroup TreeMap
29
+ \brief Base logic for drawing a treemap visualization
30
+
31
+ A treemap can be used for analyzing a hierarchical data structure whose elements have a certain size. It visualizes this
32
+ hierarchical data as nested rectangles which allows for easy comparison of proportions within categories, but
33
+ also the whole structure. The squarification algorithm is used to make these rectangles as close to squares as
34
+ possible for visual clarity.
35
+
36
+ Furthermore, we assume that each node has a type and that the size of a non-leaf node equals to the total size of its children. This
37
+ allows for drawing a legend of types of leaf nodes, and see which types occupy how much of the total space.
38
+
39
+ Note: this visualization class/technique is independent/unrelated to `TTree`.
40
+ */
41
+ // clang-format on
42
+ class RTreeMapBase {
43
+ public:
44
+ struct Node {
45
+ std::string fName , fType ;
46
+ uint64_t fSize ;
47
+ uint64_t fChildrenIdx ;
48
+ uint64_t fNChildren ;
49
+ Node () = default ;
50
+ Node (const std::string &name, const std::string &type, uint64_t size, uint64_t childrenIdx, uint64_t nChildren)
51
+ : fName (name), fType (type), fSize (size), fChildrenIdx (childrenIdx), fNChildren (nChildren)
52
+ {
53
+ }
54
+ };
55
+
56
+ struct Vec2 {
57
+ float x, y;
58
+ Vec2 (float xArg, float yArg) : x(xArg), y(yArg) {}
59
+ };
60
+ struct Rect {
61
+ Vec2 fBottomLeft , fTopRight ;
62
+ Rect (const Vec2 &bottomLeftArg, const Vec2 &topRightArg) : fBottomLeft (bottomLeftArg), fTopRight (topRightArg) {}
63
+ };
64
+ struct RGBColor {
65
+ uint8_t r, g, b, a;
66
+ RGBColor (uint8_t rArg, uint8_t gArg , uint8_t bArg, uint8_t aArg = 255 ) : r(rArg), g(gArg ), b(bArg), a(aArg) {}
67
+ };
68
+ std::vector<Node> fNodes ;
69
+ RTreeMapBase () = default ;
70
+ virtual ~RTreeMapBase () = default ;
71
+
72
+ protected:
73
+ // ///////////////////////////////////////////////////////////////////////////
74
+ // / \brief Logic for drawing the entirety of the treemap.
75
+ void DrawTreeMap (const Node &elem, Rect rect, int depth) const ;
76
+
77
+ // ///////////////////////////////////////////////////////////////////////////
78
+ // / \brief Logic for drawing the legend of leaf types
79
+ void DrawLegend () const ;
80
+
81
+ // ///////////////////////////////////////////////////////////////////////////
82
+ // / \brief Logic for drawing a box
83
+ virtual void AddBox (const Rect &rect, const RGBColor &color, float borderWidth = 0 .15f ) const = 0;
84
+
85
+ // ///////////////////////////////////////////////////////////////////////////
86
+ // / \brief Logic for drawing a text
87
+ virtual void AddText (const Vec2 &pos, const std::string &content, float size,
88
+ const RGBColor &color = RGBColor(0 , 0 , 0 ), bool alignCenter = false) const = 0;
89
+ };
90
+ } // namespace ROOT::Experimental
91
+ #endif
0 commit comments