21#include <unordered_map>
27static constexpr const char *
kUnits[] = {
"B",
"KB",
"MB",
"GB",
"TB",
"PB",
"EB"};
33 uint64_t
h = 14695981039346656037ULL;
35 h = (
h ^
static_cast<uint8_t
>(
c)) * 1099511628211ULL;
45static std::string
GetFloatStr(
const float &
n,
const uint8_t &precision)
47 std::stringstream stream;
48 stream << std::fixed << std::setprecision(precision) <<
n;
54 const uint64_t order = std::log10(
bytes) / 3.0f;
55 const std::string unit =
kUnits[order];
56 const float finalSize =
static_cast<float>(
bytes) / std::pow(1000, order);
60static std::vector<std::pair<std::string, uint64_t>>
GetDiskOccupation(
const std::vector<RTreeMapBase::Node> &nodes)
62 std::unordered_map<std::string, uint64_t> acc;
63 for (
const auto &node : nodes) {
64 if (node.fNChildren > 0)
66 acc[node.fType] += node.fSize;
69 std::vector<std::pair<std::string, uint64_t>> vec;
70 vec.reserve(acc.size());
72 vec.emplace_back(std::move(
p.first),
p.second);
74 std::sort(vec.begin(), vec.end(), [](
const auto &
a,
const auto &
b) { return a.second > b.second; });
80 uint64_t totalSize,
bool horizontalRows)
85 for (
const auto &
child : row)
86 sumRow +=
child.fSize;
89 float worstRatio = 0.0f;
90 for (
const auto &
child : row) {
91 float ratio = horizontalRows ?
static_cast<float>(
child.fSize *
width * totalSize) / (sumRow * sumRow *
height)
92 :
static_cast<float>(
child.fSize *
height * totalSize) / (sumRow * sumRow *
width);
93 float aspectRatio = std::max(ratio, 1.0f / ratio);
94 if (aspectRatio > worstRatio)
95 worstRatio = aspectRatio;
100static std::vector<std::pair<RTreeMapBase::Node, RTreeMapBase::Rect>>
106 std::vector<RTreeMapBase::Node> remainingChildren = children;
107 std::sort(remainingChildren.begin(), remainingChildren.end(),
109 std::vector<std::pair<RTreeMapBase::Node, RTreeMapBase::Rect>>
result;
111 while (!remainingChildren.empty()) {
112 std::vector<RTreeMapBase::Node> row;
113 float currentWorstRatio = std::numeric_limits<float>::max();
114 float remainingWidth =
rect.fTopRight.x - remainingBegin.
x;
115 float remainingHeight =
rect.fTopRight.y - remainingBegin.
y;
116 if (remainingWidth <= 0 || remainingHeight <= 0)
118 while (!remainingChildren.empty()) {
119 row.push_back(remainingChildren.front());
120 remainingChildren.erase(remainingChildren.begin());
121 float newWorstRatio =
ComputeWorstRatio(row, remainingWidth, remainingHeight, totalSize, horizontalRows);
122 if (newWorstRatio > currentWorstRatio) {
123 remainingChildren.insert(remainingChildren.begin(), row.back());
127 currentWorstRatio = newWorstRatio;
130 for (
const auto &
child : row)
131 sumRow +=
child.fSize;
134 float dimension = horizontalRows ? (
static_cast<float>(sumRow) / totalSize *
height)
135 : (
static_cast<float>(sumRow) / totalSize *
width);
136 float position = 0.0f;
137 for (
const auto &
child : row) {
138 float childDimension =
static_cast<float>(
child.fSize) / sumRow * (horizontalRows ?
width :
height);
144 ?
RTreeMapBase::Vec2{remainingBegin.
x + position + childDimension, remainingBegin.
y + dimension}
145 :
RTreeMapBase::Vec2{remainingBegin.
x + dimension, remainingBegin.
y + position + childDimension};
147 position += childDimension;
150 remainingBegin.
y += dimension;
152 remainingBegin.
x += dimension;
162 const uint64_t totalSize =
fNodes[0].fSize;
167 for (
const auto &entry : diskOccupation) {
168 const auto &typeName = entry.first;
169 const uint64_t entrySize = entry.second;
173 const auto offset = 0.835f, factor = 0.05f;
174 const auto posY =
offset - counter * factor;
178 const float percent = (entrySize /
static_cast<float>(totalSize)) * 100.0f;
181 float currOffset = 0.0125f;
197 AddBox(drawRect, boxColor, 0.15f);
204 float rectWidth =
rect.fTopRight.x -
rect.fBottomLeft.x;
205 float rectHeight =
rect.fTopRight.y -
rect.fBottomLeft.y;
206 float textSize = std::min(std::min(rectWidth, rectHeight) * 0.1f,
kTextSizeFactor);
214 std::vector<RTreeMapBase::Node> children;
215 for (std::uint64_t i = 0; i < element.
fNChildren; ++i)
217 uint64_t totalSize = 0;
218 for (
const auto &
child : children)
219 totalSize +=
child.fSize;
225 auto childRects =
SquarifyChildren(children, innerRect, horizontalRows, totalSize);
226 for (
const auto &[
child, childRect] : childRects)
static std::vector< std::pair< RTreeMapBase::Node, RTreeMapBase::Rect > > SquarifyChildren(const std::vector< RTreeMapBase::Node > &children, RTreeMapBase::Rect rect, bool horizontalRows, uint64_t totalSize)
static float ComputeWorstRatio(const std::vector< RTreeMapBase::Node > &row, float width, float height, uint64_t totalSize, bool horizontalRows)
static constexpr float kTextSizeFactor
static std::string GetDataStr(uint64_t bytes)
static constexpr const char * kUnits[]
static constexpr float kIndentationOffset
static std::string GetFloatStr(const float &n, const uint8_t &precision)
static constexpr float kPadTextOffset
static RTreeMapBase::RGBColor ComputeColor(const std::string &str)
static std::vector< std::pair< std::string, uint64_t > > GetDiskOccupation(const std::vector< RTreeMapBase::Node > &nodes)
static uint64_t ComputeFnv(const std::string &str)
static void indent(ostringstream &buf, int indent_level)
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t rect
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t child
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t bytes
Option_t Option_t TPoint TPoint percent
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
virtual void AddText(const Vec2 &pos, const std::string &content, float size, const RGBColor &color=RGBColor(0, 0, 0), bool alignCenter=false) const =0
Logic for drawing a text.
std::vector< Node > fNodes
void DrawLegend() const
Logic for drawing the legend of leaf types.
virtual void AddBox(const Rect &rect, const RGBColor &color, float borderWidth=0.15f) const =0
Logic for drawing a box.
void DrawTreeMap(const Node &elem, Rect rect, int depth) const
Logic for drawing the entirety of the treemap.
Namespace for ROOT features in testing.