6 namespace GraphDrawing {
8 std::string GraphCreatorHelper::FromGraphLeafToDot(std::shared_ptr<GraphNode> leaf)
11 std::stringstream dotStringLabels;
13 std::stringstream dotStringGraph;
17 dotStringLabels <<
"\t" << leaf->fCounter <<
" [label=\"" << leaf->fName <<
"\", style=\"filled\", fillcolor=\""
18 << leaf->fColor <<
"\", shape=\"" << leaf->fShape <<
"\"];\n";
19 if (leaf->fPrevNode) {
20 dotStringGraph <<
"\t" << leaf->fPrevNode->fCounter <<
" -> " << leaf->fCounter <<
";\n";
22 leaf = leaf->fPrevNode;
25 return "digraph {\n" + dotStringLabels.str() + dotStringGraph.str() +
"}";
28 std::string GraphCreatorHelper::FromGraphActionsToDot(std::vector<std::shared_ptr<GraphNode>> leaves)
31 std::stringstream dotStringLabels;
33 std::stringstream dotStringGraph;
35 for (
auto leaf : leaves) {
36 while (leaf && !leaf->fIsExplored) {
37 dotStringLabels <<
"\t" << leaf->fCounter <<
" [label=\"" << leaf->fName
38 <<
"\", style=\"filled\", fillcolor=\"" << leaf->fColor <<
"\", shape=\"" << leaf->fShape
40 if (leaf->fPrevNode) {
41 dotStringGraph <<
"\t" << leaf->fPrevNode->fCounter <<
" -> " << leaf->fCounter <<
";\n";
44 leaf->fIsExplored =
true;
45 leaf = leaf->fPrevNode;
48 return "digraph {\n" + dotStringLabels.str() + dotStringGraph.str() +
"}";
51 bool CheckIfDefaultOrDSColumn(
const std::string &name,
52 const std::shared_ptr<ROOT::Detail::RDF::RCustomColumnBase> &column)
54 return (ROOT::Internal::RDF::IsInternalColumn(name) || column->IsDataSourceColumn());
57 std::string GraphCreatorHelper::RepresentGraph(ROOT::RDataFrame &rDataFrame)
59 auto loopManager = rDataFrame.GetLoopManager();
63 return RepresentGraph(loopManager);
66 std::string GraphCreatorHelper::RepresentGraph(RLoopManager *loopManager)
69 auto actions = loopManager->GetAllActions();
70 std::vector<std::shared_ptr<GraphNode>> leaves;
71 for (
auto action : actions) {
73 leaves.push_back(action->GetGraph());
76 return FromGraphActionsToDot(leaves);
79 std::shared_ptr<GraphNode>
80 CreateDefineNode(
const std::string &columnName,
const ROOT::Detail::RDF::RCustomColumnBase *columnPtr)
84 auto &sColumnsMap = GraphCreatorHelper::GetStaticColumnsMap();
85 auto duplicateDefineIt = sColumnsMap.find(columnPtr);
86 if (duplicateDefineIt != sColumnsMap.end()) {
87 auto duplicateDefine = duplicateDefineIt->second.lock();
88 return duplicateDefine;
91 auto node = std::make_shared<GraphNode>(
"Define\n" + columnName);
94 sColumnsMap[columnPtr] = node;
98 std::shared_ptr<GraphNode> CreateFilterNode(
const ROOT::Detail::RDF::RFilterBase *filterPtr)
101 auto &sFiltersMap = GraphCreatorHelper::GetStaticFiltersMap();
102 auto duplicateFilterIt = sFiltersMap.find(filterPtr);
103 if (duplicateFilterIt != sFiltersMap.end()) {
104 auto duplicateFilter = duplicateFilterIt->second.lock();
105 duplicateFilter->SetIsNew(
false);
106 return duplicateFilter;
108 auto filterName = (filterPtr->HasName() ? filterPtr->GetName() :
"Filter");
109 auto node = std::make_shared<GraphNode>(filterName);
111 sFiltersMap[filterPtr] = node;
116 std::shared_ptr<GraphNode> CreateRangeNode(
const ROOT::Detail::RDF::RRangeBase *rangePtr)
119 auto &sRangesMap = GraphCreatorHelper::GetStaticRangesMap();
120 auto duplicateRangeIt = sRangesMap.find(rangePtr);
121 if (duplicateRangeIt != sRangesMap.end()) {
122 auto duplicateRange = duplicateRangeIt->second.lock();
123 duplicateRange->SetIsNew(
false);
124 return duplicateRange;
126 auto node = std::make_shared<GraphNode>(
"Range");
129 sRangesMap[rangePtr] = node;