LCOV - code coverage report
Current view: top level - detchannelmaps/src - PD2HDChannelMapSPPluginBase.hpp (source / functions) Coverage Total Hit
Test: code.result Lines: 18.8 % 48 9
Test Date: 2025-12-21 13:07:08 Functions: 16.7 % 6 1

            Line data    Source code
       1              : #pragma once
       2              : 
       3              : #include "PD2HDChannelMapSP.h"
       4              : #include "logging/Logging.hpp" // NOLINT
       5              : #include "detchannelmaps/TPCChannelMap.hpp"
       6              : 
       7              : namespace dunedaq {
       8              : namespace detchannelmaps {
       9              : 
      10              : class PD2HDChannelMapSPPluginBase : public TPCChannelMap {
      11              : private:
      12              :   const uint m_det_id;
      13              :   std::unique_ptr<dune::PD2HDChannelMapSP> m_channel_map;
      14              : protected:
      15              :   std::function<uint(std::string)> m_elem_name_id_converter;
      16              : public:
      17              : 
      18              :   /**
      19              :    * @brief Construct a new PD2HDChannelMapSPPluginBase object
      20              :    * 
      21              :    * @param det_id 
      22              :    * @param channel_map_path 
      23              :    */
      24            1 :   explicit PD2HDChannelMapSPPluginBase(uint det_id, const std::string& channel_map_path ) :
      25            1 :     m_det_id(det_id) {
      26              : 
      27            1 :     const char* detchannelmaps_share_cstr = getenv("DETCHANNELMAPS_SHARE");
      28            1 :     if (!detchannelmaps_share_cstr) {
      29            0 :       throw std::runtime_error("Environment variable DETCHANNELMAPS_SHARE is not set");
      30              :     }
      31            1 :     std::string detchannelmaps_share(detchannelmaps_share_cstr);
      32            1 :     std::string channel_map_file = detchannelmaps_share + "/config/" + channel_map_path;
      33            1 :     m_channel_map.reset(new dune::PD2HDChannelMapSP());
      34            1 :     m_channel_map->ReadMapFromFile(channel_map_file);
      35              : 
      36            1 :   }
      37              : 
      38              :   PD2HDChannelMapSPPluginBase(const PD2HDChannelMapSPPluginBase&) = delete;            ///< PD2HDChannelMapSPPluginBase is not copy-constructible
      39              :   PD2HDChannelMapSPPluginBase& operator=(const PD2HDChannelMapSPPluginBase&) = delete; ///< PD2HDChannelMapSPPluginBase is not copy-assignable
      40              :   PD2HDChannelMapSPPluginBase(PD2HDChannelMapSPPluginBase&&) = delete;                 ///< PD2HDChannelMapSPPluginBase is not move-constructible
      41              :   PD2HDChannelMapSPPluginBase& operator=(PD2HDChannelMapSPPluginBase&&) = delete;      ///< PD2HDChannelMapSPPluginBase is not move-assignable
      42              : 
      43              : 
      44              :   /**
      45              :    * @brief Get the offline channel from detector crate slot stream chan object
      46              :    * 
      47              :    * @param det 
      48              :    * @param crate 
      49              :    * @param slot 
      50              :    * @param stream 
      51              :    * @param channel 
      52              :    * 
      53              :    * @return offline channel identifier
      54              :    */
      55              :   uint 
      56            0 :   get_offline_channel_from_det_crate_slot_stream_chan(uint det, uint crate, uint slot, uint stream, uint channel) final {
      57              : 
      58              :     // Must be a BDE channel 
      59            0 :     if( det != m_det_id) 
      60              :       return -1;
      61              : 
      62              :     // if stream number looks wrong (not 0,1,2,3 or 64,65,66,67)
      63            0 :     if( (stream & 0xbc) ) 
      64              :       return -1;
      65              :     
      66            0 :     constexpr uint n_chan_per_stream = 64;
      67              : 
      68            0 :     uint link = (stream >> 6) & 1;
      69            0 :     uint stream_in_link = (stream & 0x3);
      70            0 :     uint wibframechan = n_chan_per_stream*stream_in_link+channel;
      71              : 
      72            0 :     auto chan_info = m_channel_map->GetChanInfoFromWIBElements(
      73              :         crate, slot, link, wibframechan
      74            0 :     );
      75              : 
      76            0 :     if (!chan_info.valid) {
      77              :       return -1;
      78              :     }
      79              : 
      80            0 :     return chan_info.offlchan;    
      81            0 :   }
      82              : 
      83              : 
      84              :   /**
      85              :    * @brief Get the plane from offline channel object
      86              :    * 
      87              :    * @param offchannel 
      88              :    * @return plane id (0, 1 or 2) 
      89              :    */
      90              :   uint 
      91            0 :   get_plane_from_offline_channel(uint offchannel) final {
      92            0 :     auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
      93              : 
      94            0 :     if (!chan_info.valid) {
      95              :       return -1;
      96              :     }
      97              : 
      98            0 :     return chan_info.plane;
      99            0 :   };
     100              : 
     101              : 
     102              :   /**
     103              :    * @brief Get the element id from offline channel object
     104              :    * 
     105              :    * @param offchannel 
     106              :    * @return uint 
     107              :    */
     108              :   uint
     109            0 :   get_element_id_from_offline_channel( uint offchannel) final {
     110            0 :     auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
     111              : 
     112            0 :     if (!chan_info.valid) {
     113              :       return -1;
     114              :     }
     115              : 
     116            0 :     return m_elem_name_id_converter(chan_info.APAName);
     117              : 
     118              :     // There is only one element
     119              :     return 0;
     120            0 :   }
     121              : 
     122              :   /**
     123              :    * @brief Get the tpc element name from offline channel object
     124              :    * 
     125              :    * @param offchannel 
     126              :    * @return std::string 
     127              :    */
     128              :   std::string 
     129            0 :   get_element_name_from_offline_channel( uint offchannel) final {
     130            0 :     auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
     131              : 
     132            0 :     if (!chan_info.valid) {
     133            0 :       return "";
     134              :     }
     135              : 
     136            0 :     return chan_info.APAName;
     137            0 :   }
     138              : 
     139              : 
     140              :   std::optional<TPCChannelMap::TPCChannelInfo> 
     141            0 :   get_channel_info_from_offline_channel(uint offchannel) final {
     142            0 :     auto ci = m_channel_map->GetChanInfoFromOfflChan(offchannel);
     143              : 
     144            0 :     if ( !ci.valid) {
     145            0 :       return std::nullopt;
     146              :     }
     147            0 :     constexpr uint n_chan_per_stream = 64;
     148            0 :     uint16_t slot_id = ci.wib-1;
     149            0 :     uint16_t stream_id = ci.link*n_chan_per_stream+ci.wibframechan/n_chan_per_stream;
     150            0 :     uint16_t chan_id = ci.wibframechan%n_chan_per_stream;
     151              : 
     152            0 :     return TPCChannelMap::TPCChannelInfo{m_det_id, ci.crate, slot_id, stream_id, chan_id, m_elem_name_id_converter(ci.APAName)};
     153            0 :   }
     154              : 
     155              : };
     156              :     
     157              : } // namespace detchannelmaps
     158              : } // namespace dunedaq
        

Generated by: LCOV version 2.0-1