Skip to content

Commit e3fa78b

Browse files
aalkinktf
authored andcommitted
Rewrite aod data model graph creator
1 parent e84b799 commit e3fa78b

File tree

1 file changed

+188
-102
lines changed

1 file changed

+188
-102
lines changed

Analysis/DataModel/src/dumpDataModel.cxx

Lines changed: 188 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "Analysis/Centrality.h"
1515
#include "Analysis/TrackSelectionTables.h"
1616
#include "Analysis/Jet.h"
17+
#include "Analysis/StrangenessTables.h"
1718
#include <fmt/printf.h>
1819
#include <map>
1920

@@ -22,6 +23,108 @@ using namespace o2::aod;
2223
using namespace o2::soa;
2324

2425
static int count = 0;
26+
static int width = 10;
27+
static int height = 10;
28+
29+
void inline graphSize()
30+
{
31+
fmt::printf(
32+
R"(
33+
size="%d,%d";
34+
)",
35+
width, height);
36+
}
37+
38+
struct Style {
39+
const char* color;
40+
const char* background;
41+
const char* fontcolor;
42+
const char* headerfontcolor;
43+
const char* headerbgcolor;
44+
const char* methodcolor;
45+
const char* methodbgcolor;
46+
const char* indexcolor;
47+
const char* indexbgcolor;
48+
};
49+
50+
static Style styles[] = {
51+
{"black", "gray80", "black", "black", "gray70", "black", "gray60", "black", "gray50"},
52+
{"/reds9/2", "/reds9/4", "white", "white", "/reds9/7", "black", "/reds9/6", "/reds9/1", "/reds9/5"},
53+
{"/greens9/2", "/greens9/4", "white", "white", "/greens9/7", "black", "/greens9/6", "/greens9/1", "/greens9/5"},
54+
{"/blues9/2", "/blues9/4", "white", "white", "/blues9/7", "black", "/blues9/6", "/blues9/1", "/blues9/5"},
55+
};
56+
57+
Style const& getDefaultStyle()
58+
{
59+
return styles[0];
60+
}
61+
62+
enum StyleType : int {
63+
DEFAULT = 0,
64+
RED = 1,
65+
GREEN = 2,
66+
BLUE = 3,
67+
};
68+
69+
static std::vector<std::pair<std::string, StyleType>> tableStyles = {
70+
{"HfTrackIndexProng", StyleType::GREEN},
71+
{"pidResp", StyleType::GREEN},
72+
{"Mults", StyleType::GREEN},
73+
{"Cents", StyleType::GREEN},
74+
{"Jet", StyleType::BLUE},
75+
{"Mc", StyleType::RED},
76+
{"V0Data", StyleType::GREEN},
77+
{"CascData", StyleType::GREEN}};
78+
79+
template <typename T>
80+
Style getStyleFor()
81+
{
82+
auto label = MetadataTrait<T>::metadata::tableLabel();
83+
auto entry = std::find_if(tableStyles.begin(), tableStyles.end(), [&](auto&& x) { if (std::string(label).find(x.first) != std::string::npos) return true; return false; });
84+
if (entry != tableStyles.end()) {
85+
auto value = *entry;
86+
return styles[value.second];
87+
}
88+
return styles[StyleType::DEFAULT];
89+
}
90+
91+
void inline nodeEmpty()
92+
{
93+
fmt::printf(
94+
R"(node[shape=none,height=0,width=0,label=""])");
95+
}
96+
97+
void inline nodeNormal()
98+
{
99+
fmt::printf(
100+
R"(node[shape=plain,style=filled,fillcolor=gray95])");
101+
}
102+
103+
void inline graphHeader(char const* type, char const* name)
104+
{
105+
fmt::printf(R"(%s %s {
106+
edge[dir=back, arrowtail=empty]
107+
)",
108+
type, name);
109+
nodeNormal();
110+
}
111+
112+
void inline graphFooter()
113+
{
114+
fmt::printf("}\n");
115+
}
116+
117+
template <typename T>
118+
void displayEntity();
119+
120+
template <typename... Ts>
121+
void displayOriginals(pack<Ts...>)
122+
{
123+
graphHeader("subgraph", fmt::format("cluster_{}", count++).c_str());
124+
fmt::printf("label = %s;\n", MetadataTrait<pack_element_t<1, pack<Ts...>>>::metadata::tableLabel());
125+
(..., displayEntity<Ts>());
126+
graphFooter();
127+
}
25128

26129
template <typename C>
27130
void printColumn(char const* fg, char const* bg)
@@ -39,6 +142,20 @@ void printIndexColumn(char const* fg, char const* bg)
39142
}
40143
}
41144

145+
template <typename... C>
146+
void displayColumns(pack<C...>, const char* fg, const char* bg)
147+
{
148+
(printColumn<C>(fg, bg), ...);
149+
fmt::printf("%s", "\n");
150+
}
151+
152+
template <typename... C>
153+
void displayIndexColumns(pack<C...>, char const* fg, char const* bg)
154+
{
155+
(printIndexColumn<C>(fg, bg), ...);
156+
fmt::printf("%s", "\n");
157+
}
158+
42159
template <typename C, typename T>
43160
void printIndex()
44161
{
@@ -47,140 +164,109 @@ void printIndex()
47164
auto b = MetadataTrait<T>::metadata::tableLabel();
48165
fmt::printf("%s -> %s []\n", a, b);
49166
} else {
50-
using main_original = pack_element_t<0, typename C::binding_t::originals>;
167+
using main_original = pack_element_t<1, typename C::binding_t::originals>;
51168
auto a = MetadataTrait<main_original>::metadata::tableLabel();
52169
auto b = MetadataTrait<T>::metadata::tableLabel();
53170
fmt::printf("%s -> %s []\n", a, b);
54171
}
55172
}
56173

57-
template <typename... C>
58-
void dumpColumns(pack<C...>, const char* fg, const char* bg)
59-
{
60-
(printColumn<C>(fg, bg), ...);
61-
fmt::printf("%s", "\n");
62-
}
63-
64-
template <typename... C>
65-
void dumpIndexColumns(pack<C...>, char const* fg, char const* bg)
66-
{
67-
(printIndexColumn<C>(fg, bg), ...);
68-
fmt::printf("%s", "\n");
69-
}
70-
71174
template <typename T, typename... C>
72175
void dumpIndex(pack<C...>)
73176
{
74177
(printIndex<C, T>(), ...);
75178
fmt::printf("%s", "\n");
76179
}
77180

78-
struct Style {
79-
const char* color;
80-
const char* background;
81-
const char* fontcolor;
82-
const char* headerfontcolor;
83-
const char* headerbgcolor;
84-
const char* methodcolor;
85-
const char* methodbgcolor;
86-
const char* indexcolor;
87-
const char* indexbgcolor;
88-
};
89-
90-
static Style styles[] = {
91-
{"black", "gray80", "black", "black", "gray70", "black", "gray60", "black", "gray50"},
92-
{"/reds9/2", "/reds9/4", "white", "white", "/reds9/7", "black", "/reds9/6", "/reds9/1", "/reds9/5"},
93-
{"/greens9/2", "/greens9/4", "white", "white", "/greens9/7", "black", "/greens9/6", "/greens9/1", "/greens9/5"},
94-
{"/blues9/2", "/blues9/4", "white", "white", "/blues9/7", "black", "/blues9/6", "/blues9/1", "/blues9/5"},
95-
};
96-
97-
Style const& getDefaultStyle()
98-
{
99-
return styles[0];
100-
}
101-
102-
enum struct StyleType : int {
103-
DEFAULT = 0,
104-
RED = 1,
105-
GREEN = 2,
106-
BLUE = 3,
107-
};
108-
109181
template <typename T>
110-
void dumpTable(bool index = true, enum StyleType styleId = StyleType::DEFAULT)
182+
void displayTable()
111183
{
112-
auto style = styles[static_cast<int>(styleId)];
113-
// nodes.push_back({MetadataTrait<T>::metadata::label(), nodeCount});
184+
auto style = getStyleFor<T>();
114185
auto label = MetadataTrait<T>::metadata::tableLabel();
115186
fmt::printf(R"(%s[color="%s" cellpadding="0" fillcolor="%s" fontcolor="%s" label = <
116187
<TABLE cellpadding='2' cellspacing='0' cellborder='0' ><TH cellpadding='0' bgcolor="black"><TD bgcolor="%s"><font color="%s">%s</font></TD></TH>)",
117188
label, style.color, style.background, style.fontcolor, style.headerbgcolor, style.headerfontcolor, label);
118189
if (pack_size(typename T::iterator::persistent_columns_t{}) -
119-
pack_size(typename T::iterator::external_index_columns_t{})) {
120-
dumpColumns(typename T::iterator::persistent_columns_t{}, style.color, style.background);
190+
pack_size(typename T::iterator::external_index_columns_t{}) >
191+
0) {
192+
displayColumns(typename T::iterator::persistent_columns_t{}, style.color, style.background);
121193
fmt::printf("%s", "HR");
122194
}
123195
if (pack_size(typename T::iterator::dynamic_columns_t{})) {
124-
dumpColumns(typename T::iterator::dynamic_columns_t{}, style.methodcolor, style.methodbgcolor);
196+
displayColumns(typename T::iterator::dynamic_columns_t{}, style.methodcolor, style.methodbgcolor);
125197
fmt::printf("%s", "HR");
126198
}
127-
dumpIndexColumns(typename T::iterator::external_index_columns_t{}, style.indexcolor, style.indexbgcolor);
199+
displayIndexColumns(typename T::iterator::external_index_columns_t{}, style.indexcolor, style.indexbgcolor);
128200
fmt::printf("%s", "</TABLE>\n>]\n");
129-
if (index)
130-
dumpIndex<T>(typename T::iterator::external_index_columns_t{});
201+
dumpIndex<T>(typename T::iterator::external_index_columns_t{});
131202
}
132203

133-
template <typename... Ts>
134-
void dumpCluster()
204+
template <typename T>
205+
void displayEntity()
135206
{
136-
fmt::printf(R"(subgraph cluster_%d {
137-
node[shape=plain,style=filled,fillcolor=gray95]
138-
edge[dir=back, arrowtail=empty]
139-
)",
140-
count++);
141-
(dumpTable<Ts>(false), ...);
142-
fmt::printf("%s", "}\n");
143-
(dumpIndex<Ts>(typename Ts::iterator::external_index_columns_t{}), ...);
207+
if constexpr (is_soa_join_t<T>::value) {
208+
displayOriginals(typename T::originals{});
209+
} else {
210+
displayTable<T>();
211+
}
212+
}
213+
214+
template <typename... T>
215+
void displayEntities()
216+
{
217+
graphHeader("subgraph", fmt::format("cluster_{}", count++).c_str());
218+
(..., displayEntity<T>());
219+
graphFooter();
144220
}
145221

146222
int main(int, char**)
147223
{
148-
fmt::printf("%s", R"(digraph hierarchy {
149-
size="5,5"
150-
node[shape=plain,style=filled,fillcolor=gray95]
151-
edge[dir=back, arrowtail=empty]
224+
graphHeader("digraph", "hierarchy");
225+
graphSize();
226+
fmt::printf(R"(compound = true;
152227
)");
153-
/// FIXME: topology should account for predefined Joins
154-
dumpCluster<StoredTracks, TracksExtension, StoredTracksCov, TracksCovExtension, TracksExtra, TracksExtended, TrackSelection>();
155-
dumpTable<Collisions>();
156-
dumpTable<Calos>();
157-
dumpTable<CaloTriggers>();
158-
dumpCluster<StoredMuons, MuonsExtension>();
159-
dumpTable<MuonClusters>();
160-
dumpTable<Zdcs>();
161-
dumpTable<Run2V0s>();
162-
dumpTable<StoredV0s>();
163-
dumpTable<StoredCascades>();
164-
dumpTable<BCs>();
165-
dumpTable<FT0s>();
166-
dumpTable<FV0s>();
167-
dumpTable<FDDs>();
168-
dumpTable<Timestamps>();
169-
dumpTable<HfTrackIndexProng2>(true, StyleType::GREEN);
170-
dumpTable<HfTrackIndexProng3>(true, StyleType::GREEN);
171-
172-
dumpTable<pidRespTOF>(true, StyleType::GREEN);
173-
dumpTable<pidRespTPC>(true, StyleType::GREEN);
174-
dumpTable<Mults>(true, StyleType::GREEN);
175-
dumpTable<Cents>(true, StyleType::GREEN);
176-
177-
dumpTable<Jets>(true, StyleType::BLUE);
178-
dumpTable<JetConstituents>(true, StyleType::BLUE);
179-
dumpTable<UnassignedTracks>();
180-
dumpTable<McCollisions>(true, StyleType::RED);
181-
dumpTable<McTrackLabels>(true, StyleType::RED);
182-
dumpTable<McCaloLabels>(true, StyleType::RED);
183-
dumpTable<McCollisionLabels>(true, StyleType::RED);
184-
dumpTable<McParticles>(true, StyleType::RED);
185-
fmt::printf("%s\n", R"(})");
228+
229+
displayEntity<BCs>();
230+
/// rank trick to avoid BCs moving
231+
nodeEmpty();
232+
fmt::printf(R"({rank = same; BCs -> root[style=invis];};)");
233+
nodeNormal();
234+
235+
displayEntity<Zdcs>();
236+
displayEntity<FT0s>();
237+
displayEntity<FV0s>();
238+
displayEntity<FDDs>();
239+
240+
displayEntities<Collisions, Cents, Mults, Timestamps>();
241+
displayEntity<McCollisions>();
242+
displayEntity<McCollisionLabels>();
243+
244+
displayEntity<Calos>();
245+
displayEntity<CaloTriggers>();
246+
displayEntity<McCaloLabels>();
247+
248+
displayEntity<Run2V0s>();
249+
250+
displayEntities<Tracks, TracksCov, TracksExtra, TracksExtended, TrackSelection, pidRespTOF, pidRespTPC>();
251+
displayEntity<UnassignedTracks>();
252+
253+
displayEntity<McParticles>();
254+
displayEntity<McTrackLabels>();
255+
256+
displayEntity<HfTrackIndexProng2>();
257+
displayEntity<HfTrackIndexProng3>();
258+
259+
displayEntity<Jets>();
260+
displayEntity<JetConstituents>();
261+
262+
displayEntities<V0s, V0DataFull>();
263+
displayEntity<V0FinderData>();
264+
265+
displayEntities<Cascades, CascDataFull>();
266+
267+
displayEntity<Muons>();
268+
displayEntity<MuonClusters>();
269+
270+
graphFooter();
271+
return 0;
186272
}

0 commit comments

Comments
 (0)