Line data Source code
1 : #include "TPCChannelMapSP.h"
2 : #include "detchannelmaps/TPCChannelMap.hpp"
3 : #include "fmt/core.h"
4 :
5 : #include "logging/Logging.hpp" // NOLINT
6 :
7 : namespace dunedaq {
8 : namespace detchannelmaps {
9 :
10 : class PD2VDTPCChannelMap : public TPCChannelMap
11 : {
12 : public:
13 0 : explicit PD2VDTPCChannelMap()
14 0 : {
15 :
16 0 : const char* detchannelmaps_share_cstr = getenv("DETCHANNELMAPS_SHARE");
17 0 : if (!detchannelmaps_share_cstr) {
18 0 : throw std::runtime_error("Environment variable DETCHANNELMAPS_SHARE is not set");
19 : }
20 0 : std::string detchannelmaps_share(detchannelmaps_share_cstr);
21 0 : std::string channel_map_file = detchannelmaps_share + "/config/pd2vd/PD2VDTPCChannelMap_v2.txt";
22 0 : m_channel_map.reset(new dune::TPCChannelMapSP());
23 0 : m_channel_map->ReadMapFromFile(channel_map_file);
24 0 : TLOG_DEBUG(10) << "PD2VDTPCChannelMap Created";
25 0 : }
26 :
27 : PD2VDTPCChannelMap(const PD2VDTPCChannelMap&) = delete; ///< PD2VDTPCChannelMap is not copy-constructible
28 : PD2VDTPCChannelMap& operator=(const PD2VDTPCChannelMap&) = delete; ///< PD2VDTPCChannelMap is not copy-assignable
29 : PD2VDTPCChannelMap(PD2VDTPCChannelMap&&) = delete; ///< PD2VDTPCChannelMap is not move-constructible
30 : PD2VDTPCChannelMap& operator=(PD2VDTPCChannelMap&&) = delete; ///< PD2VDTPCChannelMap is not move-assignable
31 :
32 : /**
33 : * @brief Get the offline channel from detector crate slot stream chan object
34 : *
35 : * @param det
36 : * @param crate
37 : * @param slot
38 : * @param stream
39 : * @param channel
40 : *
41 : * @return offline channel identifier
42 : */
43 0 : uint get_offline_channel_from_det_crate_slot_stream_chan(uint det,
44 : uint crate,
45 : uint slot,
46 : uint stream,
47 : uint channel) final
48 : {
49 :
50 0 : auto ch_info = m_channel_map->GetChanInfoFromElectronicsIDs(det, crate, slot, stream, channel);
51 0 : return (ch_info.valid ? ch_info.offlchan : -1);
52 : }
53 :
54 : /**
55 : * @brief Get the plane from offline channel object
56 : *
57 : * @param offchannel
58 : * @return plane id (0, 1 or 2)
59 : */
60 0 : uint get_plane_from_offline_channel(uint offchannel) final
61 : {
62 0 : auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
63 :
64 0 : if (!chan_info.valid) {
65 : return -1;
66 : }
67 :
68 0 : return chan_info.plane;
69 : };
70 :
71 : /**
72 : * @brief Get the element id from offline channel object
73 : *
74 : * @param offchannel
75 : * @return uint
76 : */
77 0 : uint get_element_id_from_offline_channel(uint offchannel)
78 : {
79 0 : auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
80 :
81 0 : if (!chan_info.valid) {
82 : return -1;
83 : }
84 :
85 0 : return chan_info.detelement;
86 : }
87 :
88 : /**
89 : * @brief Get the tpc element name from offline channel object
90 : *
91 : * @param offchannel
92 : * @return std::string
93 : */
94 0 : std::string get_element_name_from_offline_channel(uint offchannel)
95 : {
96 0 : auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
97 :
98 0 : if (!chan_info.valid) {
99 0 : return "xxx";
100 : }
101 :
102 0 : return fmt::format("CRP{:d}", chan_info.detelement);
103 : }
104 :
105 0 : std::optional<TPCChannelInfo> get_channel_info_from_offline_channel(uint offchannel)
106 : {
107 0 : auto ci = m_channel_map->GetChanInfoFromOfflChan(offchannel);
108 :
109 0 : if (!ci.valid) {
110 0 : return std::nullopt;
111 : }
112 0 : return TPCChannelInfo{ ci.detid, ci.crate, ci.slot, ci.stream, ci.streamchan, ci.detelement };
113 : }
114 :
115 : private:
116 : std::unique_ptr<dune::TPCChannelMapSP> m_channel_map;
117 : };
118 :
119 0 : DEFINE_DUNE_DET_TPCCHANNEL_MAP(dunedaq::detchannelmaps::PD2VDTPCChannelMap)
120 :
121 : } // namespace detchannelmaps
122 : } // namespace dunedaq
|