artdaq_mpich_plugin  v1_00_06
DispatcherMain.cc
1 #include <iostream>
2 #include <boost/program_options.hpp>
3 #include <boost/lexical_cast.hpp>
4 #include "artdaq/Application/TaskType.hh"
5 #include "artdaq/DAQdata/Globals.hh"
6 #include "artdaq/Application/DispatcherApp.hh"
7 #include "artdaq/ExternalComms/MakeCommanderPlugin.hh"
8 #include "artdaq/Application/LoadParameterSet.hh"
9 #include "artdaq-mpich-plugin/Application/MPISentry.hh"
10 #include "artdaq/BuildInfo/GetPackageBuildInfo.hh"
11 #include "cetlib_except/exception.h"
12 
13 int main(int argc, char* argv[])
14 {
15  // initialization
16 
17  int const wanted_threading_level{ MPI_THREAD_FUNNELED };
18 
19  MPI_Comm local_group_comm;
20  std::unique_ptr<artdaq::MPISentry> mpiSentry;
21 
22  try
23  {
24  mpiSentry.reset(new artdaq::MPISentry(&argc, &argv, wanted_threading_level, artdaq::TaskType::DispatcherTask, local_group_comm));
25  }
26  catch (cet::exception& errormsg)
27  {
28  TLOG_ERROR("DispatcherMain") << errormsg ;
29  TLOG_ERROR("DispatcherMain") << "MPISentry error encountered in DispatcherMain; exiting..." ;
30  throw errormsg;
31  }
32 
33  struct Config
34  {
35  fhicl::TableFragment<artdaq::CommanderInterface::Config> commander_config;
36  fhicl::Atom<std::string> application_name{ fhicl::Name{ "application_name" }, fhicl::Comment{ "Name of the application for metrics and logging" }, "Dispatcher" };
37  fhicl::TableFragment<artdaq::PortManager::Config> portsConfig;
38  };
39 
40  fhicl::ParameterSet config = LoadParameterSet<Config>(argc, argv, "DispatcherMain", "This is the Dispatcher's main executable (MPI version)");
41  app_name = config.get<std::string>("application_name", "Dispatcher");
42  portMan->UpdateConfiguration(config);
43  std::string mf_app_name = artdaq::setMsgFacAppName(app_name, config.get<int>("id"));
44  artdaq::configureMessageFacility(mf_app_name.c_str());
45  TLOG_DEBUG(app_name + "Main") << "Setting application name to " << mf_app_name ;
46 
47  // 23-May-2018, KAB: added lookup of the partition number from the command line arguments.
48  if (config.has_key("partition_number"))
49  {
50  artdaq::Globals::partition_number_ = config.get<int>("partition_number");
51  }
52  TLOG_DEBUG(app_name + "Main") << "Setting partition number to " << artdaq::Globals::partition_number_;
53 
54  TLOG_INFO(app_name + "Main") << "artdaq version " <<
56  << ", built " <<
58 
59  // create the DispatcherApp
60  my_rank = mpiSentry->rank();
61  artdaq::DispatcherApp disp_app;
62 
63  auto commander = artdaq::MakeCommanderPlugin(config, disp_app);
64  TLOG_INFO(app_name + "Main") << "Running Commmander Server" ;
65  commander->run_server();
66  artdaq::Globals::CleanUpGlobals();
67  TLOG_INFO(app_name + "Main") << "Commandable Server ended, exiting..." ;
68 }
The MPISentry class initializes and finalizes the MPI context that the artdaq applciations run in...
Definition: MPISentry.hh:15
int rank() const
Get the MPI rank of the application.
Definition: MPISentry.cc:113
static artdaq::PackageBuildInfo getPackageBuildInfo()
std::string getBuildTimestamp() const
std::string getPackageVersion() const
void configureMessageFacility(char const *progname, bool useConsole=true, bool printDebug=false)
std::string setMsgFacAppName(const std::string &appType, unsigned short port)
static int partition_number_