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
|