LCOV - code coverage report
Current view: top level - appmodel/src - TPReplayApplication.cpp (source / functions) Coverage Total Hit
Test: code.result Lines: 0.0 % 96 0
Test Date: 2026-03-29 15:29:34 Functions: 0.0 % 1 0

            Line data    Source code
       1              : /**
       2              :  * @file generate_modules.cpp
       3              :  *
       4              :  * Implementation of TPReplayApplication's generate_modules dal method
       5              :  *
       6              :  * This is part of the DUNE DAQ Software Suite, copyright 2023.
       7              :  * Licensing/copyright details are in the COPYING file that you should have
       8              :  * received with this code.
       9              :  */
      10              : 
      11              : #include "ConfigObjectFactory.hpp"
      12              : 
      13              : #include "conffwk/Configuration.hpp"
      14              : 
      15              : #include "confmodel/Connection.hpp"
      16              : #include "confmodel/NetworkConnection.hpp"
      17              : #include "confmodel/Service.hpp"
      18              : 
      19              : #include "appmodel/DataHandlerConf.hpp"
      20              : #include "appmodel/DataHandlerModule.hpp"
      21              : #include "appmodel/DataReaderConf.hpp"
      22              : #include "appmodel/DataSubscriberModule.hpp"
      23              : #include "appmodel/NetworkConnectionDescriptor.hpp"
      24              : #include "appmodel/NetworkConnectionRule.hpp"
      25              : #include "appmodel/QueueConnectionRule.hpp"
      26              : #include "appmodel/QueueDescriptor.hpp"
      27              : #include "appmodel/SourceIDConf.hpp"
      28              : #include "appmodel/TCDataProcessor.hpp"
      29              : #include "appmodel/TPReplayApplication.hpp"
      30              : #include "appmodel/TPReplayModule.hpp"
      31              : #include "appmodel/TPReplayModuleConf.hpp"
      32              : #include "appmodel/TPStreamConf.hpp"
      33              : #include "appmodel/appmodelIssues.hpp"
      34              : 
      35              : #include "logging/Logging.hpp"
      36              : 
      37              : #include <iomanip>
      38              : #include <set>
      39              : #include <string>
      40              : #include <vector>
      41              : 
      42              : namespace dunedaq {
      43              : namespace appmodel {
      44              : 
      45              : void
      46            0 : TPReplayApplication::generate_modules(std::shared_ptr<appmodel::ConfigurationHelper> /*helper*/) const
      47              : {
      48              : 
      49            0 :   std::vector<const confmodel::DaqModule*> modules;
      50              : 
      51            0 :   ConfigObjectFactory obj_fac(this);
      52              : 
      53              :   /**************************************************************
      54              :    * Instantiate the Trigger Primitive Maker Module module
      55              :    **************************************************************/
      56              : 
      57            0 :   auto tprm_conf = get_tprm_conf();
      58              : 
      59            0 :   if (!tprm_conf) {
      60              :     throw(BadConf(ERS_HERE, "No TPPM configuration in TPReplayApplication given"));
      61              :   }
      62              : 
      63            0 :   const std::string tprm_uid(tprm_conf->UID());
      64            0 :   const std::string tprm_class = tprm_conf->get_template_for();
      65            0 :   auto tpm_obj = obj_fac.create(tprm_class, tprm_uid);
      66            0 :   tpm_obj.set_obj("configuration", &(tprm_conf->config_object()));
      67              : 
      68              :   /**************************************************************
      69              :    * Get total planes from config
      70              :    **************************************************************/
      71            0 :   const int total_planes = tprm_conf->get_total_planes();
      72              : 
      73              :   /**************************************************************
      74              :    * Extract # of filtered planes
      75              :    **************************************************************/
      76            0 :   const auto plane_filtering = tprm_conf->get_filter_out_plane();
      77            0 :   if (plane_filtering.size() >= 3) {
      78            0 :     throw(BadConf(ERS_HERE,
      79            0 :                   "TPReplayApplication: too many planes configured for filtering! At most 2 planes can be filtered!"));
      80              :   }
      81              : 
      82              :   /**************************************************************
      83              :    * Instantiate the TP Handler (TA Maker) module(s)
      84              :    **************************************************************/
      85            0 :   auto tph_conf = get_tp_handler();
      86            0 :   if (!tph_conf) {
      87              :     throw(BadConf(ERS_HERE, "TP handler configuration object is missing"));
      88              :   }
      89            0 :   std::string tph_class = "";
      90            0 :   if (tph_conf != nullptr) {
      91            0 :     tph_class = tph_conf->get_template_for();
      92              :   }
      93              : 
      94              :   // For now, have X (X=total_planes) identical config TP Handlers
      95            0 :   std::vector<conffwk::ConfigObject> TPHs;
      96            0 :   std::vector<std::string> TPHs_uids;
      97              : 
      98              :   // Source IDs
      99            0 :   auto tpsrc_ids = get_tp_source_ids();
     100            0 :   if (tpsrc_ids.size() < static_cast<size_t>(total_planes)) {
     101            0 :     throw(BadConf(ERS_HERE, "Not enough TP source IDs provided"));
     102              :   }
     103              : 
     104            0 :   const auto tph_conf_obj = tph_conf->config_object();
     105            0 :   for (int i = 0; i < total_planes; i++) {
     106            0 :     std::string tp_uid = "tphandler-tpreplay-" + std::to_string(i + 1);
     107            0 :     TPHs_uids.push_back(tp_uid);
     108            0 :     auto tph_obj = obj_fac.create(tph_class, tp_uid);
     109            0 :     tph_obj.set_by_val<uint32_t>("source_id", tpsrc_ids[i]->get_sid());
     110            0 :     tph_obj.set_by_val<uint32_t>("detector_id", 1); // 1 == kDAQ
     111            0 :     tph_obj.set_by_val<bool>("post_processing_enabled", true);
     112            0 :     tph_obj.set_obj("module_configuration", &tph_conf_obj);
     113            0 :     TPHs.push_back(tph_obj);
     114            0 :   }
     115              : 
     116              :   /**************************************************************
     117              :    * Deal with queues
     118              :    **************************************************************/
     119              :   // Load queue configurations
     120            0 :   const QueueDescriptor* tp_inputq_desc = nullptr;
     121              : 
     122            0 :   for (const auto& rule : get_queue_rules()) {
     123            0 :     auto destination_class = rule->get_destination_class();
     124            0 :     auto data_type = rule->get_descriptor()->get_data_type();
     125            0 :     if (destination_class == "TriggerDataHandlerModule" && data_type == "TriggerPrimitiveVector") {
     126            0 :       tp_inputq_desc = rule->get_descriptor();
     127              :     }
     128            0 :   }
     129            0 :   if (!tp_inputq_desc) {
     130            0 :     throw(BadConf(ERS_HERE, "No matching queue descriptor found for TP input"));
     131              :   }
     132              : 
     133              :   // Same as above (ROUs * planes queues), later dynamically
     134            0 :   std::vector<conffwk::ConfigObject> TP_queues;
     135            0 :   for (int i = 0; i < total_planes; i++) {
     136            0 :     std::string tp_q_uid = "tpinput-" + std::to_string(i + 1);
     137            0 :     auto tp_q_obj = obj_fac.create_queue_obj(tp_inputq_desc, tp_q_uid);
     138            0 :     TP_queues.push_back(tp_q_obj);
     139            0 :   }
     140              : 
     141              :   /**************************************************************
     142              :    * Deal with network connections
     143              :    **************************************************************/
     144            0 :   const NetworkConnectionDescriptor* ta_net_desc = nullptr;
     145            0 :   const NetworkConnectionDescriptor* dr_net_desc = nullptr;
     146              : 
     147            0 :   for (const auto& rule : get_network_rules()) {
     148            0 :     auto endpoint_class = rule->get_endpoint_class();
     149            0 :     auto data_type = rule->get_descriptor()->get_data_type();
     150            0 :     if (data_type == "TriggerActivity") {
     151            0 :       ta_net_desc = rule->get_descriptor();
     152            0 :     } else if (data_type == "DataRequest") {
     153            0 :       dr_net_desc = rule->get_descriptor();
     154              :     }
     155            0 :   }
     156            0 :   if (!ta_net_desc || !dr_net_desc) {
     157            0 :     throw(BadConf(ERS_HERE, "Missing network descriptors for TA or DR"));
     158              :   }
     159              : 
     160              :   // Create vectors for network connections
     161            0 :   std::vector<conffwk::ConfigObject> ta_net_objects;
     162            0 :   std::vector<conffwk::ConfigObject> dr_net_objects;
     163              : 
     164              :   // Outputs for each handler
     165            0 :   for (int i = 0; i < total_planes; i++) {
     166            0 :     const auto ta_service_obj = ta_net_desc->get_associated_service()->config_object();
     167            0 :     const std::string ta_stream_uid = ta_net_desc->get_uid_base() + UID() + "-" + std::to_string(i + 1);
     168            0 :     auto ta_net_obj = obj_fac.create_net_obj(ta_net_desc, ta_stream_uid);
     169            0 :     ta_net_obj.set_obj("associated_service", &ta_service_obj);
     170            0 :     ta_net_objects.push_back(ta_net_obj);
     171            0 :   }
     172              : 
     173              :   // Data requests
     174            0 :   for (int i = 0; i < total_planes; i++) {
     175            0 :     const auto dr_service_obj = dr_net_desc->get_associated_service()->config_object();
     176              :     // Format the integer with leading zeros to maintain consistent length
     177            0 :     std::ostringstream oss;
     178            0 :     oss << UID() << "-1000" << std::setfill('0') << std::setw(2) // Ensures at least 2 digits (e.g., 01, 10)
     179            0 :         << (i + 1);
     180            0 :     const std::string dr_stream_uid = oss.str();
     181            0 :     auto dr_net_obj = obj_fac.create_net_obj(dr_net_desc, dr_stream_uid);
     182            0 :     dr_net_obj.set_obj("associated_service", &dr_service_obj);
     183            0 :     dr_net_objects.push_back(dr_net_obj);
     184            0 :   }
     185              : 
     186              :   /**************************************************************
     187              :    * Finally set inputs & outputs
     188              :    **************************************************************/
     189              :   // Convert TP_queues to a vector of raw pointers
     190            0 :   std::vector<const conffwk::ConfigObject*> raw_tp_queues;
     191            0 :   for (const auto& tp_queue : TP_queues) {
     192            0 :     raw_tp_queues.push_back(&tp_queue);
     193              :   }
     194            0 :   tpm_obj.set_objs("outputs", raw_tp_queues);
     195              : 
     196            0 :   for (int i = 0; i < total_planes; i++) {
     197              :     // Convert network objects to raw pointers
     198            0 :     const std::vector<const conffwk::ConfigObject*> temp_inputs = { &TP_queues[i], &dr_net_objects[i] };
     199            0 :     const std::vector<const conffwk::ConfigObject*> temp_outputs = { &ta_net_objects[i] };
     200            0 :     TPHs[i].set_objs("inputs", temp_inputs);
     201            0 :     TPHs[i].set_objs("outputs", temp_outputs);
     202            0 :   }
     203              : 
     204              :   // Store modules
     205            0 :   modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(tprm_conf->UID()));
     206            0 :   for (int i = 0; i < total_planes; i++) {
     207            0 :     modules.push_back(obj_fac.get_dal<confmodel::DaqModule>(TPHs_uids[i]));
     208              :   }
     209              : 
     210            0 :   obj_fac.update_modules(modules);
     211            0 : }
     212              : 
     213              : } // namespace appmodel
     214              : } // namespace dunedaq
        

Generated by: LCOV version 2.0-1