ProtoDUNEChannelMapAlgv8.cxx
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 /// \file ProtoDUNEChannelMapAlgv8.cxx
3 /// \brief Interface to algorithm class for a specific detector channel mapping
4 ///
5 /// \version $Id: $
6 /// \author Laura Paulucci
7 ////////////////////////////////////////////////////////////////////////
8 
13 
22 
23 #include <iomanip>
24 
25 using std::map;
27 using std::cout;
28 using std::endl;
29 using std::setw;
30 
31 typedef unsigned int Index;
32 
33 namespace geo {
34 
35 //----------------------------------------------------------------------------
36 
40  {
41  fSorter = new GeoObjectSorterAPA(p);
42  }
43 
44 
45 //----------------------------------------------------------------------------
46 
48  Uninitialize();
49 
50  // Call the base-class version to perform TPC-related actions
52 
53  // Manually entered based on maps from Chris Macias
54  // http://indico.fnal.gov/event/14582/session/30/contribution/30/material/slides/0.pdf
55  //
56  // That gives SSP and channel ranges from OpDet. These offline channels correspond
57  // to the APAs listed. This is for the geometry that includes the arapuca bar with its
58  // 16 optical windows (protodune geometry v8) and updated paddle geo //
59  // USDaS(APA5) MSDaS(APA6) DSDaS(APA4)
60  // 19-28 10-18+29-44 0-9
61  //
62  // USRaS(APA3) MSRaS(APA2) DSRaS(APA1)
63  // 45-60+81-89 71-80 61-70
64  // The difference between v8 and v7 is that the z position within an APA from top to bottom alternates (not the same for IU and MIT bars)
65 
66  // DSDaS -- "normal" pattern
67  fSSP[ 0] = 41; fSSPChOne[ 0] = 0;
68  fSSP[ 5] = 41; fSSPChOne[ 5] = 4;
69  fSSP[ 1] = 41; fSSPChOne[ 1] = 8;
70  fSSP[ 6] = 42; fSSPChOne[ 6] = 0;
71  fSSP[ 2] = 42; fSSPChOne[ 2] = 4;
72  fSSP[ 7] = 42; fSSPChOne[ 7] = 8;
73  fSSP[ 3] = 43; fSSPChOne[ 3] = 0;
74  fSSP[ 8] = 43; fSSPChOne[ 8] = 4;
75  fSSP[ 4] = 43; fSSPChOne[ 4] = 8;
76  fSSP[ 9] = 44; fSSPChOne[ 9] = 0;
77 
78  // MSDaS -- unusual patternfor ARAPUCA
79  fSSP[10] = 61; fSSPChOne[10] = 0;
80  fSSP[15] = 61; fSSPChOne[15] = 4;
81  fSSP[11] = 61; fSSPChOne[11] = 8;
82  fSSP[17] = 62; fSSPChOne[17] = 0;
83  fSSP[12] = 62; fSSPChOne[12] = 4;
84  fSSP[29] = 63; fSSPChOne[29] = 0; // ARAPUCA
85  fSSP[30] = 63; fSSPChOne[30] = 0; // ARAPUCA
86  fSSP[31] = 63; fSSPChOne[31] = 1; // ARAPUCA
87  fSSP[32] = 63; fSSPChOne[32] = 1; // ARAPUCA
88  fSSP[33] = 63; fSSPChOne[33] = 2; // ARAPUCA
89  fSSP[34] = 63; fSSPChOne[34] = 2; // ARAPUCA
90  fSSP[35] = 63; fSSPChOne[35] = 3; // ARAPUCA
91  fSSP[36] = 63; fSSPChOne[36] = 3; // ARAPUCA
92  fSSP[37] = 63; fSSPChOne[37] = 4; // ARAPUCA
93  fSSP[38] = 63; fSSPChOne[38] = 5; // ARAPUCA
94  fSSP[39] = 63; fSSPChOne[39] = 6; // ARAPUCA
95  fSSP[40] = 63; fSSPChOne[40] = 7; // ARAPUCA
96  fSSP[41] = 63; fSSPChOne[41] = 8; // ARAPUCA
97  fSSP[42] = 63; fSSPChOne[42] = 9; // ARAPUCA
98  fSSP[43] = 63; fSSPChOne[43] = 10; // ARAPUCA
99  fSSP[44] = 63; fSSPChOne[44] = 11; // ARAPUCA
100  fSSP[13] = 62; fSSPChOne[13] = 8;
101  fSSP[17] = 64; fSSPChOne[17] = 0;
102  fSSP[14] = 64; fSSPChOne[14] = 4;
103  fSSP[18] = 64; fSSPChOne[18] = 8;
104 
105  // USDaS -- unusual pattern
106  fSSP[19] = 53; fSSPChOne[19] = 0;
107  fSSP[24] = 53; fSSPChOne[24] = 4;
108  fSSP[20] = 53; fSSPChOne[20] = 8;
109  fSSP[25] = 54; fSSPChOne[25] = 0;
110  fSSP[22] = 51; fSSPChOne[22] = 0;
111  fSSP[26] = 54; fSSPChOne[26] = 4;
112  fSSP[24] = 51; fSSPChOne[24] = 4;
113  fSSP[27] = 51; fSSPChOne[27] = 8;
114  fSSP[26] = 54; fSSPChOne[26] = 8;
115  fSSP[28] = 52; fSSPChOne[28] = 0;
116 
117  // DSRaS -- "normal" pattern
118  fSSP[61] = 11; fSSPChOne[61] = 0;
119  fSSP[66] = 11; fSSPChOne[66] = 4;
120  fSSP[62] = 11; fSSPChOne[62] = 8;
121  fSSP[67] = 12; fSSPChOne[67] = 0;
122  fSSP[64] = 12; fSSPChOne[64] = 4;
123  fSSP[68] = 12; fSSPChOne[68] = 8;
124  fSSP[66] = 13; fSSPChOne[66] = 0;
125  fSSP[69] = 13; fSSPChOne[69] = 4;
126  fSSP[68] = 13; fSSPChOne[68] = 8;
127  fSSP[70] = 14; fSSPChOne[70] = 0;
128 
129  // MSRaS -- "normal" pattern
130  fSSP[71] = 21; fSSPChOne[71] = 0;
131  fSSP[76] = 21; fSSPChOne[76] = 4;
132  fSSP[72] = 21; fSSPChOne[72] = 8;
133  fSSP[77] = 22; fSSPChOne[77] = 0;
134  fSSP[73] = 22; fSSPChOne[73] = 4;
135  fSSP[78] = 22; fSSPChOne[78] = 8;
136  fSSP[74] = 23; fSSPChOne[74] = 0;
137  fSSP[79] = 23; fSSPChOne[79] = 4;
138  fSSP[75] = 23; fSSPChOne[75] = 8;
139  fSSP[80] = 24; fSSPChOne[80] = 0;
140 
141  // USRaS -- unusual patternfor ARAPUCA
142  fSSP[81] = 31; fSSPChOne[81] = 0;
143  fSSP[86] = 31; fSSPChOne[86] = 4;
144  fSSP[82] = 31; fSSPChOne[82] = 8;
145  fSSP[45] = 34; fSSPChOne[45] = 0; // ARAPUCA
146  fSSP[46] = 34; fSSPChOne[46] = 0; // ARAPUCA
147  fSSP[47] = 34; fSSPChOne[47] = 1; // ARAPUCA
148  fSSP[48] = 34; fSSPChOne[48] = 1; // ARAPUCA
149  fSSP[49] = 34; fSSPChOne[49] = 2; // ARAPUCA
150  fSSP[50] = 34; fSSPChOne[50] = 2; // ARAPUCA
151  fSSP[51] = 34; fSSPChOne[51] = 3; // ARAPUCA
152  fSSP[52] = 34; fSSPChOne[52] = 3; // ARAPUCA
153  fSSP[53] = 34; fSSPChOne[53] = 4; // ARAPUCA
154  fSSP[54] = 34; fSSPChOne[54] = 5; // ARAPUCA
155  fSSP[55] = 34; fSSPChOne[55] = 6; // ARAPUCA
156  fSSP[56] = 34; fSSPChOne[56] = 7; // ARAPUCA
157  fSSP[57] = 34; fSSPChOne[57] = 8; // ARAPUCA
158  fSSP[58] = 34; fSSPChOne[58] = 9; // ARAPUCA
159  fSSP[59] = 34; fSSPChOne[59] = 10; // ARAPUCA
160  fSSP[60] = 34; fSSPChOne[60] = 11; // ARAPUCA
161  fSSP[83] = 32; fSSPChOne[83] = 0;
162  fSSP[87] = 32; fSSPChOne[87] = 4;
163  fSSP[84] = 32; fSSPChOne[84] = 8;
164  fSSP[88] = 33; fSSPChOne[88] = 0;
165  fSSP[85] = 33; fSSPChOne[85] = 4;
166  fSSP[89] = 33; fSSPChOne[89] = 8;
167 
168  // The above enables OpDet + HW channel -> OpChannel
169  //
170  // Fill the maps below to do the reverse by looping through
171  // all possible OpDet and HW Channel combinations
172 
173  fMaxOpChannel = 0;
174  fNOpChannels = 0;
175 
176  for (Index opDet = 0; opDet < 90; opDet++) {
177  for (Index hwCh = 0; hwCh < NOpHardwareChannels(opDet); hwCh++) {
178 
179  // Find the channel number for this opDet and hw channel
180  Index opChannel = OpChannel(opDet, hwCh);
181 
182  // Count channels and record the maximum possible channel
183  if (opChannel > fMaxOpChannel) fMaxOpChannel = opChannel;
184  fNOpChannels++;
185 
186  // Fill maps for opChannel -> opDet and hwChannel
187  fOpDet[opChannel] = opDet;
188  fHWChannel[opChannel] = hwCh;
189  }
190  }
191 
192 // PrintChannelMaps();
193  }
194 
195 
196 //----------------------------------------------------------------------------
197 
199  // Call the base-class version to perform TPC-related actions
201  }
202 
203 //----------------------------------------------------------------------------
204 
206  return fNOpChannels;
207  }
208 
209 //----------------------------------------------------------------------------
210 
212  return fMaxOpChannel;
213  }
214 
215 //----------------------------------------------------------------------------
216 
218 
219  // ARAPUCAs
220  if ((opDet > 28 && opDet < 61))
221  return 1;
222  else
223  return 4;
224  }
225 
226 //----------------------------------------------------------------------------
227 
229 
230  Index sspch = fSSPChOne.at(detNum) + channel;
231  Index ssp = fSSP.at(detNum);
232 
233  // Special handling of ARAPUCA in MSDaS which cross between SSP 62 and 63
234  if (sspch > 12) {
235  mf::LogError("ProtoDUNEChannelMapAlgv8") << "Invalid address: SSP #" << ssp << ", SSP channel" << sspch;
236  }
237 
238  return OpChannelFromSSP(ssp, sspch);
239  }
240 
241 //----------------------------------------------------------------------------
242 
244  if (!IsValidOpChannel(opChannel, 90)) {
245  mf::LogWarning("ProtoDUNEChannelMapAlgv8") << "Requesting an OpDet number for an uninstrumented channel, " << opChannel;
246  return 99999;
247  }
248  return fOpDet.at(opChannel);
249  }
250 
251 //----------------------------------------------------------------------------
252 
254  if (!IsValidOpChannel(opChannel, 90)) {
255  mf::LogWarning("ProtoDUNEChannelMapAlgv8") << "Requesting an OpDet number for an uninstrumented channel, " << opChannel;
256  return 99999;
257  }
258  return fHWChannel.at(opChannel);
259  }
260 
261 
262 //----------------------------------------------------------------------------
263 
265  // Expects SSP #'s of the from NM where N is APA number and M is SSP within the APA
266  // So, IP 504 -> AP # 54
267 
268  // ( ( APA # - 1 ) )*4 + SSP per APA)*12 + SSP channel
269  Index ch = ( (trunc(ssp/10) - 1)*4 + ssp%10 - 1 )*12 + sspch;
270  return ch;
271 
272  }
273 
274 
275 //----------------------------------------------------------------------------
276 
277 
279 
280 
281  cout << "---------------------------------------------------------------" << endl;
282  cout << "---------------------------------------------------------------" << endl;
283  cout << "---------------------------------------------------------------" << endl;
284  cout << "---------------------------------------------------------------" << endl;
285  cout << "---------------------------------------------------------------" << endl;
286  cout << "---------------------------------------------------------------" << endl;
287  cout << "---------------------------------------------------------------" << endl;
288  cout << endl << endl;
289 
290  std::vector<Index> ssps = { 11, 12, 13, 14,
291  21, 22, 23, 24,
292  31, 32, 33, 34,
293  41, 42, 43, 44,
294  51, 52, 53, 54,
295  61, 62, 63, 64 };
296 
297  cout << endl << "By SSP" << endl;
298  for (Index ssp : ssps) {
299  for (Index sspch = 0; sspch < 12; sspch++) {
300  cout << setw(2) << ssp << " " << setw(2) << sspch << ": " << setw(3) << OpChannelFromSSP(ssp, sspch) << endl;
301  }
302  }
303 
304  cout << endl << "Non-Beam side" << endl;
305  for (Index opDet = 0; opDet < 45; opDet ++) {
306  cout << setw(2) << opDet << ":";
307  for (Index hwCh = 0; hwCh < NOpHardwareChannels(opDet); hwCh++) {
308  cout << " " << setw(2) << OpChannel(opDet, hwCh);
309  }
310  cout << endl;
311  }
312 
313 
314  cout << endl << "Beam side" << endl;
315  for (Index opDet = 45; opDet < 90; opDet ++) {
316  cout << setw(2) << opDet << ":";
317  for (Index hwCh = 0; hwCh < NOpHardwareChannels(opDet); hwCh++) {
318  cout << " " << setw(2) << OpChannel(opDet, hwCh);
319  }
320  cout << endl;
321  }
322 
323 
324  cout << endl << "Online -> offline" << endl;
325  for (Index opCh = 0; opCh < MaxOpChannel(90); opCh++) {
326  cout << setw(3) << opCh << ": ";
327  if ( IsValidOpChannel(opCh, 90) ) {
328  cout << setw(2) << OpDetFromOpChannel(opCh) << ", "
329  << setw(2) << HardwareChannelFromOpChannel(opCh) << endl;
330  }
331  else {
332  cout << "empty channel" << endl;
333  }
334  }
335 
336  cout << endl << endl;
337  cout << "---------------------------------------------------------------" << endl;
338  cout << "---------------------------------------------------------------" << endl;
339  cout << "---------------------------------------------------------------" << endl;
340  cout << "---------------------------------------------------------------" << endl;
341  cout << "---------------------------------------------------------------" << endl;
342  cout << "---------------------------------------------------------------" << endl;
343  cout << "---------------------------------------------------------------" << endl;
344 
345  }
346 }
Index MaxOpChannel(Index NOpDets) const override
Returns the number of optical channels contained in some detectors.
std::map< Index, Index > fSSPChOne
std::map< Index, Index > fHWChannel
Encapsulate the construction of a single cyostat.
Index NOpChannels(Index NOpDets) const override
Returns the number of optical channels contained in some detectors.
Interface to algorithm class for a specific detector channel mapping in protoDUNE.
Index NOpHardwareChannels(Index opDet) const override
Returns the number of channels in the specified optical detectors.
Interface to algorithm class for standard sorting of geo::XXXGeo objects.
Index OpDetFromOpChannel(Index opChannel) const override
Returns the optical detector the specified optical channel belongs.
bool IsValidOpChannel(Index opChannel, Index) const override
Returns whether the ID identifies a valid optical detector channel.
const geo::GeoObjectSorter * fSorter
sorts geo::XXXGeo objects
Interface to algorithm class for a specific detector channel mapping.
uint8_t channel
Definition: CRTFragment.hh:201
MaybeLogger_< ELseverityLevel::ELsev_error, false > LogError
Index OpChannel(Index detNum, Index channel) const override
Returns the channel ID of the specified hardware channel.
ProtoDUNEChannelMapAlgv8(const fhicl::ParameterSet &pset)
Interface to algorithm class for sorting geo::XXXGeo objects.
void Initialize(GeometryData_t const &geodata) override
Geometry initialisation.
p
Definition: test.py:223
Encapsulate the geometry of an auxiliary detector.
Q_EXPORT QTSManip setw(int w)
Definition: qtextstream.h:331
void Uninitialize() override
Deconfiguration: prepare for a following call of Initialize()
Encapsulate the geometry of a wire.
Index HardwareChannelFromOpChannel(Index opChannel) const override
Returns the hardware channel number of specified optical channel.
void Uninitialize() override
Deconfiguration: prepare for a following call of Initialize()
void Initialize(GeometryData_t const &geodata) override
Geometry initialisation.
Encapsulate the construction of a single detector plane.
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
Access the description of detector geometry.
int fNOpChannels
Data in the geometry description.
Definition: GeometryData.h:31
int fMaxOpChannel
unsigned int Index
Index OpChannelFromSSP(Index ssp, Index sspch) const
LArSoft geometry interface.
Definition: ChannelGeo.h:16
QTextStream & endl(QTextStream &s)
Encapsulate the construction of a single detector plane.