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