Line data Source code
1 : ///////////////////////////////////////////////////////////////////////////////////////////////////
2 : // Class: PD2HDChannelMapSP
3 : // Module type: standalone algorithm
4 : // File: PD2HDChannelMapSP.cxx
5 : // Author: Tom Junk, May 2022
6 : //
7 : // Implementation of hardware-offline channel mapping reading from a file.
8 : ///////////////////////////////////////////////////////////////////////////////////////////////////
9 :
10 : #include "PD2HDChannelMapSP.h"
11 :
12 : #include <fstream>
13 : #include <iostream>
14 : #include <sstream>
15 :
16 : // so far, nothing needs to be done in the constructor
17 :
18 1 : dune::PD2HDChannelMapSP::PD2HDChannelMapSP() {}
19 :
20 : void
21 1 : dune::PD2HDChannelMapSP::ReadMapFromFile(std::string& fullname)
22 : {
23 1 : std::ifstream inFile(fullname, std::ios::in);
24 1 : std::string line;
25 :
26 2562 : while (std::getline(inFile, line)) {
27 2560 : std::stringstream linestream(line);
28 :
29 2560 : HDChanInfo_t chanInfo;
30 2560 : linestream >> chanInfo.offlchan >> chanInfo.crate >> chanInfo.APAName >> chanInfo.wib >> chanInfo.link >>
31 2560 : chanInfo.femb_on_link >> chanInfo.cebchan >> chanInfo.plane >> chanInfo.chan_in_plane >> chanInfo.femb >>
32 2560 : chanInfo.asic >> chanInfo.asicchan >> chanInfo.wibframechan;
33 :
34 2560 : chanInfo.valid = true;
35 :
36 : // fill maps.
37 :
38 2560 : check_offline_channel(chanInfo.offlchan);
39 :
40 2560 : DetToChanInfo[chanInfo.crate][chanInfo.wib][chanInfo.link][chanInfo.wibframechan] = chanInfo;
41 2560 : OfflToChanInfo[chanInfo.offlchan] = chanInfo;
42 2560 : }
43 1 : inFile.close();
44 1 : }
45 :
46 : dune::PD2HDChannelMapSP::HDChanInfo_t
47 0 : dune::PD2HDChannelMapSP::GetChanInfoFromWIBElements(unsigned int crate,
48 : unsigned int slot,
49 : unsigned int link,
50 : unsigned int wibframechan) const
51 : {
52 :
53 0 : unsigned int wib = slot + 1;
54 :
55 0 : HDChanInfo_t badInfo = {};
56 0 : badInfo.valid = false;
57 :
58 : // a hack -- ununderstood crates are mapped to crate 2
59 : // for use in the Coldbox
60 : // crate 2 has the lowest-numbered offline channels
61 : // data with two ununderstood crates, or an ununderstood crate and crate 2,
62 : // will have duplicate channels.
63 :
64 0 : auto fm1 = DetToChanInfo.find(crate);
65 0 : if (fm1 == DetToChanInfo.end()) {
66 0 : unsigned int substituteCrate = 2;
67 0 : fm1 = DetToChanInfo.find(substituteCrate);
68 0 : if (fm1 == DetToChanInfo.end())
69 0 : return badInfo;
70 : }
71 0 : auto& m1 = fm1->second;
72 :
73 0 : auto fm2 = m1.find(wib);
74 0 : if (fm2 == m1.end())
75 0 : return badInfo;
76 0 : auto& m2 = fm2->second;
77 :
78 0 : auto fm3 = m2.find(link);
79 0 : if (fm3 == m2.end())
80 0 : return badInfo;
81 0 : auto& m3 = fm3->second;
82 :
83 0 : auto fm4 = m3.find(wibframechan);
84 0 : if (fm4 == m3.end())
85 0 : return badInfo;
86 0 : return fm4->second;
87 0 : }
88 :
89 : dune::PD2HDChannelMapSP::HDChanInfo_t
90 0 : dune::PD2HDChannelMapSP::GetChanInfoFromOfflChan(unsigned int offlineChannel) const
91 : {
92 0 : auto ci = OfflToChanInfo.find(offlineChannel);
93 0 : if (ci == OfflToChanInfo.end()) {
94 0 : HDChanInfo_t badInfo = {};
95 0 : badInfo.valid = false;
96 0 : return badInfo;
97 : }
98 0 : return ci->second;
99 : }
|