CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes
DependencyGraph Class Reference

Classes

struct  node
 

Public Member Functions

 DependencyGraph (const ParameterSet &, ActivityRegistry &)
 
void postBeginJob ()
 
void preBeginJob (PathsAndConsumesOfModulesBase const &, ProcessContext const &)
 
void preSourceConstruction (ModuleDescription const &)
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 

Private Types

enum  EDMModuleType {
  EDMModuleType::Unknown, EDMModuleType::Source, EDMModuleType::ESSource, EDMModuleType::ESProducer,
  EDMModuleType::EDAnalyzer, EDMModuleType::EDProducer, EDMModuleType::EDFilter, EDMModuleType::OutputModule
}
 
using GraphvizAttributes = std::map< std::string, std::string >
 

Private Member Functions

bool highlighted (std::string const &module)
 

Static Private Member Functions

static const char * edmModuleType (edm::ModuleDescription const &module)
 
static EDMModuleType edmModuleTypeEnum (edm::ModuleDescription const &module)
 

Private Attributes

std::string m_filename
 
boost::subgraph< boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, boost::property< boost::vertex_attribute_t, GraphvizAttributes, node >, boost::property< boost::edge_index_t, int, boost::property< boost::edge_attribute_t, GraphvizAttributes > >, boost::property< boost::graph_name_t, std::string, boost::property< boost::graph_graph_attribute_t, GraphvizAttributes, boost::property< boost::graph_vertex_attribute_t, GraphvizAttributes, boost::property< boost::graph_edge_attribute_t, GraphvizAttributes > > > > > > m_graph
 
std::unordered_set< std::string > m_highlightModules
 
bool m_initialized
 
bool m_showPathDependencies
 

Static Private Attributes

static constexpr const char * module_type_desc []
 
static constexpr const char * shapes []
 

Detailed Description

Definition at line 55 of file DependencyGraph.cc.

Member Typedef Documentation

◆ GraphvizAttributes

using DependencyGraph::GraphvizAttributes = std::map<std::string, std::string>
private

Definition at line 96 of file DependencyGraph.cc.

Member Enumeration Documentation

◆ EDMModuleType

enum DependencyGraph::EDMModuleType
strongprivate
Enumerator
Unknown 
Source 
ESSource 
ESProducer 
EDAnalyzer 
EDProducer 
EDFilter 
OutputModule 

Definition at line 68 of file DependencyGraph.cc.

68 { Unknown, Source, ESSource, ESProducer, EDAnalyzer, EDProducer, EDFilter, OutputModule };

Constructor & Destructor Documentation

◆ DependencyGraph()

DependencyGraph::DependencyGraph ( const ParameterSet config,
ActivityRegistry registry 
)

Definition at line 168 of file DependencyGraph.cc.

References postBeginJob(), preBeginJob(), preSourceConstruction(), edm::ActivityRegistry::watchPostBeginJob(), edm::ActivityRegistry::watchPreBeginJob(), and edm::ActivityRegistry::watchPreSourceConstruction().

169  : m_filename(config.getUntrackedParameter<std::string>("fileName")),
171  make_unordered_set(config.getUntrackedParameter<std::vector<std::string>>("highlightModules"))),
172  m_showPathDependencies(config.getUntrackedParameter<bool>("showPathDependencies")),
173  m_initialized(false) {
177 }
void watchPreSourceConstruction(PreSourceConstruction::slot_type const &iSlot)
void preBeginJob(PathsAndConsumesOfModulesBase const &, ProcessContext const &)
Definition: config.py:1
void preSourceConstruction(ModuleDescription const &)
std::unordered_set< std::string > m_highlightModules
void watchPreBeginJob(PreBeginJob::slot_type const &iSlot)
convenience function for attaching to signal
std::string m_filename
void watchPostBeginJob(PostBeginJob::slot_type const &iSlot)
convenience function for attaching to signal

Member Function Documentation

◆ edmModuleType()

const char * DependencyGraph::edmModuleType ( edm::ModuleDescription const &  module)
staticprivate

Definition at line 156 of file DependencyGraph.cc.

References edm::edmModuleTypeEnum(), and edm::module_type_desc.

156  {
157  return module_type_desc[static_cast<std::underlying_type_t<EDMModuleType>>(edmModuleTypeEnum(module))];
158 }
static constexpr const char * module_type_desc[]
static EDMModuleType edmModuleTypeEnum(edm::ModuleDescription const &module)

◆ edmModuleTypeEnum()

DependencyGraph::EDMModuleType DependencyGraph::edmModuleTypeEnum ( edm::ModuleDescription const &  module)
staticprivate

Definition at line 135 of file DependencyGraph.cc.

References mixOne_cfi::ESProducer, edm::pset::Registry::instance(), edm::module_type_desc, muonDTDigis_cfi::pset, CollectionTags_cfi::Source, AlCaHLTBitMon_QueryRunRegistry::string, submitPVValidationJobs::t, reco::Unknown, and findQualityFiles::v.

Referenced by preBeginJob().

135  {
136  auto const &registry = *edm::pset::Registry::instance();
137  auto const &pset = *registry.getMapped(module.parameterSetID());
138 
139  if (not pset.existsAs<std::string>("@module_edm_type"))
140  return EDMModuleType::Unknown;
141 
142  std::string const &t = pset.getParameter<std::string>("@module_edm_type");
150  if (t == module_type_desc[static_cast<std::underlying_type_t<EDMModuleType>>(v)])
151  return v;
152  }
153  return EDMModuleType::Unknown;
154 }
EDMModuleType
Definition: EDMModuleType.h:8
static constexpr const char * module_type_desc[]
static Registry * instance()
Definition: Registry.cc:12

◆ fillDescriptions()

void DependencyGraph::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 160 of file DependencyGraph.cc.

References edm::ConfigurationDescriptions::add(), submitPVResolutionJobs::desc, and AlCaHLTBitMon_QueryRunRegistry::string.

160  {
162  desc.addUntracked<std::string>("fileName", "dependency.dot");
163  desc.addUntracked<std::vector<std::string>>("highlightModules", {});
164  desc.addUntracked<bool>("showPathDependencies", true);
165  descriptions.add("DependencyGraph", desc);
166 }
void add(std::string const &label, ParameterSetDescription const &psetDescription)

◆ highlighted()

bool DependencyGraph::highlighted ( std::string const &  module)
inlineprivate

Definition at line 66 of file DependencyGraph.cc.

Referenced by preBeginJob(), and preSourceConstruction().

66 { return (m_highlightModules.find(module) != m_highlightModules.end()); }
std::unordered_set< std::string > m_highlightModules

◆ postBeginJob()

void DependencyGraph::postBeginJob ( )

Definition at line 330 of file DependencyGraph.cc.

References m_filename, m_graph, m_initialized, and MillePedeFileConverter_cfg::out.

Referenced by DependencyGraph().

330  {
331  if (not m_initialized)
332  return;
333 
334  // draw the dependency graph
335  std::ofstream out(m_filename);
336  boost::write_graphviz(out, m_graph);
337  out.close();
338 }
boost::subgraph< boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, boost::property< boost::vertex_attribute_t, GraphvizAttributes, node >, boost::property< boost::edge_index_t, int, boost::property< boost::edge_attribute_t, GraphvizAttributes > >, boost::property< boost::graph_name_t, std::string, boost::property< boost::graph_graph_attribute_t, GraphvizAttributes, boost::property< boost::graph_vertex_attribute_t, GraphvizAttributes, boost::property< boost::graph_edge_attribute_t, GraphvizAttributes > > > > > > m_graph
std::string m_filename

◆ preBeginJob()

void DependencyGraph::preBeginJob ( PathsAndConsumesOfModulesBase const &  pathsAndConsumes,
ProcessContext const &  context 
)

Definition at line 208 of file DependencyGraph.cc.

References edm::PathsAndConsumesOfModulesBase::allModules(), OfflineOutput_cfi::consumer, visDQMUpload::context, edmModuleTypeEnum(), edm::PathsAndConsumesOfModulesBase::endPaths(), newFWLiteAna::found, get, highlighted(), mps_fire::i, edm::PathsAndConsumesOfModulesBase::largestModuleID(), m_graph, m_initialized, m_showPathDependencies, callgraph::module, edm::PathsAndConsumesOfModulesBase::modulesOnEndPath(), edm::PathsAndConsumesOfModulesBase::modulesOnPath(), edm::PathsAndConsumesOfModulesBase::modulesWhoseProductsAreConsumedBy(), Skims_PA_cff::paths, edm::PathsAndConsumesOfModulesBase::paths(), callgraph::previous, shapes, and findQualityFiles::size.

Referenced by DependencyGraph().

209  {
210  // if the Service is not in the main Process do not do anything
211  if (context.isSubProcess() and not m_initialized) {
212  edm::LogError("DependencyGraph") << "You have requested an instance of the DependencyGraph Service in the \""
213  << context.processName()
214  << "\" SubProcess, which is not supported.\nPlease move it to the main process.";
215  return;
216  }
217 
218  if (not context.isSubProcess()) {
219  // set the graph name property to the process name
220  boost::get_property(m_graph, boost::graph_name) = context.processName();
221  boost::get_property(m_graph, boost::graph_graph_attribute)["label"] = "process " + context.processName();
222  boost::get_property(m_graph, boost::graph_graph_attribute)["labelloc"] = "top";
223 
224  // create graph vertices associated to all modules in the process
225  auto size = pathsAndConsumes.largestModuleID() - boost::num_vertices(m_graph) + 1;
226  for (size_t i = 0; i < size; ++i)
227  boost::add_vertex(m_graph);
228 
229  m_initialized = true;
230  } else {
231  // create a subgraph to match the subprocess
232  auto &graph = m_graph.create_subgraph();
233 
234  // set the subgraph name property to the subprocess name
235  boost::get_property(graph, boost::graph_name) = "cluster" + context.processName();
236  boost::get_property(graph, boost::graph_graph_attribute)["label"] = "subprocess " + context.processName();
237  boost::get_property(graph, boost::graph_graph_attribute)["labelloc"] = "top";
238 
239  // create graph vertices associated to all modules in the subprocess
240  auto size = pathsAndConsumes.largestModuleID() - boost::num_vertices(m_graph) + 1;
241  for (size_t i = 0; i < size; ++i)
242  boost::add_vertex(graph);
243  }
244 
245  // set the vertices properties (use the module id as the global index into the graph)
246  for (edm::ModuleDescription const *module : pathsAndConsumes.allModules()) {
247  m_graph.m_graph[module->id()] = {
248  module->moduleLabel(), module->moduleName(), module->id(), edmModuleTypeEnum(*module), false};
249 
250  auto &attributes = boost::get(boost::get(boost::vertex_attribute, m_graph), module->id());
251  attributes["label"] = module->moduleLabel();
252  attributes["tooltip"] = module->moduleName();
253  attributes["shape"] = shapes[static_cast<std::underlying_type_t<EDMModuleType>>(edmModuleTypeEnum(*module))];
254  attributes["style"] = "filled";
255  attributes["color"] = "black";
256  attributes["fillcolor"] = highlighted(module->moduleLabel()) ? "green" : "lightgrey";
257  }
258 
259  // paths and endpaths
260  auto const &paths = pathsAndConsumes.paths();
261  auto const &endps = pathsAndConsumes.endPaths();
262 
263  // add graph edges associated to module dependencies
264  for (edm::ModuleDescription const *consumer : pathsAndConsumes.allModules()) {
265  for (edm::ModuleDescription const *module : pathsAndConsumes.modulesWhoseProductsAreConsumedBy(consumer->id())) {
266  edm::LogInfo("DependencyGraph") << "module " << consumer->moduleLabel() << " depends on module "
267  << module->moduleLabel();
268  auto edge_status = boost::add_edge(consumer->id(), module->id(), m_graph);
269  // highlight the arrow between highlighted nodes
270  if (highlighted(module->moduleLabel()) and highlighted(consumer->moduleLabel())) {
271  auto const &edge = edge_status.first;
272  auto &attributes = boost::get(boost::get(boost::edge_attribute, m_graph), edge);
273  attributes["color"] = "darkgreen";
274  }
275  }
276  }
277 
278  // marke the modules in the paths as scheduled, and add a soft dependency to reflect the order of modules along each path
280  for (unsigned int i = 0; i < paths.size(); ++i) {
281  previous = nullptr;
282  for (edm::ModuleDescription const *module : pathsAndConsumes.modulesOnPath(i)) {
283  m_graph.m_graph[module->id()].scheduled = true;
284  auto &attributes = boost::get(boost::get(boost::vertex_attribute, m_graph), module->id());
285  attributes["fillcolor"] = highlighted(module->moduleLabel()) ? "lightgreen" : "white";
287  edm::LogInfo("DependencyGraph") << "module " << module->moduleLabel() << " follows module "
288  << previous->moduleLabel() << " in Path " << i;
289  auto edge_status = boost::lookup_edge(module->id(), previous->id(), m_graph);
290  bool found = edge_status.second;
291  if (not found) {
292  edge_status = boost::add_edge(module->id(), previous->id(), m_graph);
293  auto const &edge = edge_status.first;
294  auto &edgeAttributes = boost::get(boost::get(boost::edge_attribute, m_graph), edge);
295  edgeAttributes["style"] = "dashed";
296  // highlight the arrow between highlighted nodes
297  if (highlighted(module->moduleLabel()) and highlighted(previous->moduleLabel()))
298  edgeAttributes["color"] = "darkgreen";
299  }
300  }
301  previous = module;
302  }
303  }
304  for (unsigned int i = 0; i < endps.size(); ++i) {
305  previous = nullptr;
306  for (edm::ModuleDescription const *module : pathsAndConsumes.modulesOnEndPath(i)) {
307  m_graph.m_graph[module->id()].scheduled = true;
308  auto &attributes = boost::get(boost::get(boost::vertex_attribute, m_graph), module->id());
309  attributes["fillcolor"] = highlighted(module->moduleLabel()) ? "lightgreen" : "white";
311  edm::LogInfo("DependencyGraph") << "module " << module->moduleLabel() << " follows module "
312  << previous->moduleLabel() << " in EndPath " << i;
313  auto edge_status = boost::lookup_edge(module->id(), previous->id(), m_graph);
314  bool found = edge_status.second;
315  if (not found) {
316  edge_status = boost::add_edge(module->id(), previous->id(), m_graph);
317  auto const &edge = edge_status.first;
318  auto &edgeAttributes = boost::get(boost::get(boost::edge_attribute, m_graph), edge);
319  edgeAttributes["style"] = "dashed";
320  // highlight the arrow between highlighted nodes
321  if (highlighted(module->moduleLabel()) and highlighted(previous->moduleLabel()))
322  edgeAttributes["color"] = "darkgreen";
323  }
324  }
325  previous = module;
326  }
327  }
328 }
size
Write out results.
boost::subgraph< boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, boost::property< boost::vertex_attribute_t, GraphvizAttributes, node >, boost::property< boost::edge_index_t, int, boost::property< boost::edge_attribute_t, GraphvizAttributes > >, boost::property< boost::graph_name_t, std::string, boost::property< boost::graph_graph_attribute_t, GraphvizAttributes, boost::property< boost::graph_vertex_attribute_t, GraphvizAttributes, boost::property< boost::graph_edge_attribute_t, GraphvizAttributes > > > > > > m_graph
Log< level::Error, false > LogError
Log< level::Info, false > LogInfo
static EDMModuleType edmModuleTypeEnum(edm::ModuleDescription const &module)
static constexpr const char * shapes[]
bool highlighted(std::string const &module)
#define get

◆ preSourceConstruction()

void DependencyGraph::preSourceConstruction ( ModuleDescription const &  module)

Definition at line 194 of file DependencyGraph.cc.

References get, highlighted(), m_graph, shapes, and Source.

Referenced by DependencyGraph().

194  {
195  // create graph vertex for the source module and fill its attributes
196  boost::add_vertex(m_graph);
197  m_graph.m_graph[module.id()] =
198  node{module.moduleLabel(), module.moduleName(), module.id(), EDMModuleType::Source, true};
199  auto &attributes = boost::get(boost::get(boost::vertex_attribute, m_graph), 0);
200  attributes["label"] = module.moduleLabel();
201  attributes["tooltip"] = module.moduleName();
202  attributes["shape"] = shapes[static_cast<std::underlying_type_t<EDMModuleType>>(EDMModuleType::Source)];
203  attributes["style"] = "filled";
204  attributes["color"] = "black";
205  attributes["fillcolor"] = highlighted(module.moduleLabel()) ? "lightgreen" : "white";
206 }
boost::subgraph< boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, boost::property< boost::vertex_attribute_t, GraphvizAttributes, node >, boost::property< boost::edge_index_t, int, boost::property< boost::edge_attribute_t, GraphvizAttributes > >, boost::property< boost::graph_name_t, std::string, boost::property< boost::graph_graph_attribute_t, GraphvizAttributes, boost::property< boost::graph_vertex_attribute_t, GraphvizAttributes, boost::property< boost::graph_edge_attribute_t, GraphvizAttributes > > > > > > m_graph
static constexpr const char * shapes[]
bool highlighted(std::string const &module)
#define get

Member Data Documentation

◆ m_filename

std::string DependencyGraph::m_filename
private

Definition at line 124 of file DependencyGraph.cc.

Referenced by postBeginJob().

◆ m_graph

boost::subgraph<boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, boost::property<boost::vertex_attribute_t, GraphvizAttributes, node>, boost::property<boost::edge_index_t, int, boost::property<boost::edge_attribute_t, GraphvizAttributes> >, boost::property< boost::graph_name_t, std::string, boost::property<boost::graph_graph_attribute_t, GraphvizAttributes, boost::property<boost::graph_vertex_attribute_t, GraphvizAttributes, boost::property<boost::graph_edge_attribute_t, GraphvizAttributes> > > > > > DependencyGraph::m_graph
private

Definition at line 122 of file DependencyGraph.cc.

Referenced by postBeginJob(), preBeginJob(), and preSourceConstruction().

◆ m_highlightModules

std::unordered_set<std::string> DependencyGraph::m_highlightModules
private

Definition at line 125 of file DependencyGraph.cc.

◆ m_initialized

bool DependencyGraph::m_initialized
private

Definition at line 128 of file DependencyGraph.cc.

Referenced by postBeginJob(), and preBeginJob().

◆ m_showPathDependencies

bool DependencyGraph::m_showPathDependencies
private

Definition at line 127 of file DependencyGraph.cc.

Referenced by preBeginJob().

◆ module_type_desc

constexpr const char * DependencyGraph::module_type_desc
staticprivate
Initial value:
{
"Unknown", "Source", "ESSource", "ESProducer", "EDAnalyzer", "EDProducer", "EDFilter", "OutputModule"}

Definition at line 70 of file DependencyGraph.cc.

◆ shapes

constexpr const char * DependencyGraph::shapes
staticprivate
Initial value:
{
"note",
"oval",
"cylinder",
"cylinder",
"oval",
"box",
"diamond",
"oval",
}

Definition at line 73 of file DependencyGraph.cc.

Referenced by preBeginJob(), and preSourceConstruction().