Line data Source code
1 : #include "detchannelmaps/TPCChannelMap.hpp"
2 : #include "TPCChannelMapSP.h"
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 :
14 0 : explicit PD2VDTPCChannelMap() {
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 : /**
34 : * @brief Get the offline channel from detector crate slot stream chan object
35 : *
36 : * @param det
37 : * @param crate
38 : * @param slot
39 : * @param stream
40 : * @param channel
41 : *
42 : * @return offline channel identifier
43 : */
44 : uint
45 0 : get_offline_channel_from_det_crate_slot_stream_chan(uint det, uint crate, uint slot, uint stream, uint channel) final {
46 :
47 0 : auto ch_info = m_channel_map->GetChanInfoFromElectronicsIDs(det, crate, slot, stream, channel );
48 0 : return ( ch_info.valid ? ch_info.offlchan : -1 );
49 : }
50 :
51 :
52 : /**
53 : * @brief Get the plane from offline channel object
54 : *
55 : * @param offchannel
56 : * @return plane id (0, 1 or 2)
57 : */
58 : uint
59 0 : get_plane_from_offline_channel(uint offchannel) final {
60 0 : auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
61 :
62 0 : if (!chan_info.valid) {
63 : return -1;
64 : }
65 :
66 0 : return chan_info.plane;
67 : };
68 :
69 :
70 : /**
71 : * @brief Get the element id from offline channel object
72 : *
73 : * @param offchannel
74 : * @return uint
75 : */
76 : uint
77 0 : get_element_id_from_offline_channel( uint offchannel) {
78 0 : auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
79 :
80 0 : if (!chan_info.valid) {
81 : return -1;
82 : }
83 :
84 0 : return chan_info.detelement;
85 : }
86 :
87 : /**
88 : * @brief Get the tpc element name from offline channel object
89 : *
90 : * @param offchannel
91 : * @return std::string
92 : */
93 : std::string
94 0 : get_element_name_from_offline_channel( uint offchannel) {
95 0 : auto chan_info = m_channel_map->GetChanInfoFromOfflChan(offchannel);
96 :
97 0 : if (!chan_info.valid) {
98 0 : return "xxx";
99 : }
100 :
101 0 : return fmt::format("CRP{:d}", chan_info.detelement);
102 : }
103 :
104 : std::optional<TPCChannelInfo>
105 0 : get_channel_info_from_offline_channel(uint offchannel) {
106 0 : auto ci = m_channel_map->GetChanInfoFromOfflChan(offchannel);
107 :
108 0 : if ( !ci.valid) {
109 0 : return std::nullopt;
110 : }
111 0 : return TPCChannelInfo{ci.detid, ci.crate, ci.slot, ci.stream, ci.streamchan, ci.detelement};
112 : }
113 :
114 :
115 :
116 : private:
117 :
118 : std::unique_ptr<dune::TPCChannelMapSP> m_channel_map;
119 :
120 :
121 : };
122 :
123 0 : DEFINE_DUNE_DET_TPCCHANNEL_MAP(dunedaq::detchannelmaps::PD2VDTPCChannelMap)
124 :
125 :
126 : } // namespace detchannelmaps
127 : } // namespace dunedaq
|