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;
2223using namespace o2 ::soa;
2324
2425static 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
26129template <typename C>
27130void 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+
42159template <typename C, typename T>
43160void 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-
71174template <typename T, typename ... C>
72175void 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-
109181template <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
146222int 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