DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
segregate.cpp
Go to the documentation of this file.
1// DUNE DAQ modification notice:
2// This file has been modified from the original ATLAS dbe source for the DUNE DAQ project.
3// Fork baseline commit: dbe-02-12-17 (2022-05-12).
4// Renamed since fork: yes (from src/graphtool/segregate.cpp to apps/graphtool/segregate.cpp).
5
6/*
7 * segregate.cpp
8 *
9 * Created on: 14 Jun 2016
10 * Author: Leonidas Georgopoulos
11 */
12
13#include "dbe/segregate.hpp"
14#include "dbe/dbcontroller.hpp"
15
16#include <boost/graph/connected_components.hpp>
17#include <boost/graph/filtered_graph.hpp>
18
19#include <array>
20#include <future>
21
22#define GTOOL_MAX_THREADS 10
23
24namespace dbe
25{
26namespace tool
27{
28namespace graph
29{
30
32 size_t const minc,
33 size_t const maxc )
34 :
35 this_dest_prefix ( oprfx ),
38{
39}
40
42{
43 typedef long unsigned int t_int;
44 gtool::t_graph const & G = tool.getgraph();
45 std::vector<t_int> compindices ( boost::num_vertices ( G ) );
46 t_int total_connected = boost::connected_components ( G, &compindices[0] );
47
48 std::vector<gtool::t_graph> components ( total_connected );
49 std::vector<gtool::t_registry> component_registries ( total_connected );
50
51 // Build the components as seperate graphs
52 for ( t_int vector_i = 0; vector_i != compindices.size(); ++vector_i )
53 {
54 t_int component_j = compindices[vector_i];
55 std::string oname = boost::get ( &gtool::vertex_label::uid, G ) [vector_i];
56 std::string cname = boost::get ( &gtool::vertex_label::cname, G ) [vector_i];
58 components[component_j],
60 { oname, cname } ),
61 component_registries[component_j] );
62 }
63
64 // from the graphs built output only those that are within the range specified
65
66 int max_punits = GTOOL_MAX_THREADS;
67
68 std::vector<std::future<void>> punits;
69
70 unsigned long long int c = 0;
71
72 for ( auto const & g : components )
73 {
74 size_t const component_size = g.vertex_set().size();
75
76 if ( component_size > this_min_component_size
77 and component_size < this_max_component_size )
78 {
79 if ( --max_punits )
80 {
81 std::string output_file
82 { this_dest_prefix + std::string ( "_" ) + std::to_string ( ++c ) + std::string ( ".dot" ) };
83
84 try
85 {
86 punits.push_back ( std::async ( std::launch::async, graph::write, g, output_file ) );
87 }
88 catch ( std::system_error const & e )
89 {
90 if ( e.code() == std::errc::resource_unavailable_try_again )
91 {
92
93 ERROR (
94 "Could not launch another thread", e.what(), "for file:", output_file,
95 "try to launch in deferred" );
96
97 punits.push_back (
98 std::async ( std::launch::deferred, graph::write, g, output_file ) );
99
100 WARN (
101 "File write policy change", "Program execution correction", " for file:",
102 output_file, " launched in deferred" );
103
104 }
105 else
106 {
107 throw e;
108 }
109 }
110 }
111 else
112 {
113 // The standard dictates ( C++11 ) that wait is called on the destructor
114 // and the futures launched are either async or defered, which puts them
115 // always in a valid state. All that is needed to do is clear the vector
116 // of futures to initiate calling the destructors.
117 punits.clear();
118 max_punits = GTOOL_MAX_THREADS;
119 }
120 }
121 }
122
123 return EXIT_SUCCESS;
124}
125
126} /* namespace graph */
127} /* namespace tool */
128} /* namespace dbe */
static configobject::tref get(dbe::cokey const &desc)
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, vertex_label > t_graph
Definition gtool.hpp:55
static t_vertex add_object_and_friends(t_graph &, tref const &, t_registry &registry)
Definition gtool.cpp:166
int operator()(gtool const &) const
Definition segregate.cpp:41
segregated_graph_write(std::string const &ofn_prefix, size_t const minc=0, size_t const maxc=0)
Definition segregate.cpp:31
#define ERROR(...)
Definition messenger.hpp:93
#define WARN(...)
Definition messenger.hpp:85
void write(gtool::t_graph const &, std::string const &)
Definition gtool.cpp:226
Include QT Headers.
#define GTOOL_MAX_THREADS
Definition segregate.cpp:22