All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ChannelMapStandardTestAlg.cxx
Go to the documentation of this file.
1 /**
2  * @file ChannelMapStandardTestAlg.cxx
3  * @brief Tests the standard channel mapping algorithm.
4  * @author Gianluca Petrillo (petrillo@fnal.gov)
5  * @date June 26th, 2015
6  *
7  * The methods require a Boost test enviroment.
8  */
9 
10 // LArSoft libraries
15 
16 // framework
17 #include "cetlib_except/exception.h"
18 
19 // Boost libraries
20 #include <boost/test/unit_test.hpp>
21 
22 // C/C++ standard libraries
23 #include <string>
24 #include <vector>
25 
26 
27 namespace {
28 
29  /// Checks that there is a 1-to-1 match between ID data members
30  void CheckMatchingTPClevelIDs
31  (readout::TPCsetID const& tpcsetID, geo::TPCID const& tpcID)
32  {
33  BOOST_TEST(tpcID.isValid == tpcsetID.isValid);
34  BOOST_TEST(tpcID.Cryostat == tpcsetID.Cryostat);
35  BOOST_TEST(tpcID.TPC == tpcsetID.TPCset);
36  } // CheckMatchingTPClevelIDs()
37 
38  /// Checks that there is a 1-to-1 match between ID data members
39  void CheckMatchingPlaneLevelIDs
40  (readout::ROPID const& ropID, geo::PlaneID const& planeID)
41  {
42  CheckMatchingTPClevelIDs(ropID, planeID);
43  BOOST_TEST(planeID.Plane == ropID.ROP);
44  } // CheckMatchingPlaneLevelIDs()
45 
46 } // local namespace
47 
48 
49 
50 //-----------------------------------------------------------------------------
52  // All the tests
53 
57 
58  return 0;
59 } // ChannelMapStandardTestAlg::Run()
60 
61 
62 
63 //-----------------------------------------------------------------------------
65 
66  /*
67  * ChannelMapStandardAlg interface to be tested (via GeometryCore):
68  *
69  * unsigned int NTPCsets(readout::CryostatID const& cryoid) const
70  *
71  * unsigned int MaxTPCsets() const
72  *
73  * bool HasTPCset(readout::TPCsetID const& tpcsetid) const
74  *
75  * readout::TPCsetID TPCtoTPCset(geo::TPCID const& tpcid) const
76  *
77  * std::vector<geo::TPCID> TPCsetToTPCs
78  * (readout::TPCsetID const& tpcsetid) const
79  *
80  * geo::TPCID FirstTPCinTPCset(readout::TPCsetID const& tpcsetid) const
81  * can't do (not exposed!)
82  *
83  * unsigned int NROPs(readout::TPCsetID const& tpcsetid) const
84  *
85  * unsigned int MaxROPs() const
86  *
87  * bool HasROP(readout::ROPID const& ropid) const
88  * (invalid input is checked in ROPMappingTest())
89  *
90  * std::vector<geo::TPCID> ROPtoTPCs(readout::ROPID const& ropid) const
91  *
92  */
93 
94  // check for invalid input
95  BOOST_TEST(geom->NTPCsets({}) == 0U);
96  BOOST_TEST(!geom->HasTPCset({}));
97  BOOST_TEST(!geom->TPCtoTPCset({}).isValid);
98  BOOST_TEST(geom->TPCsetToTPCs({}).empty());
99  BOOST_TEST(geom->NROPs({}) == 0U);
100  BOOST_TEST(!geom->HasROP({}));
101  BOOST_TEST(geom->ROPtoTPCs({}).empty());
102 
103  //
104  // detector-wide checks
105  //
106  // check that the maximum size of TPC and TPC sets in the detector match
107  BOOST_TEST(geom->MaxTPCsets() == geom->MaxTPCs());
108 
109  // check that the maximum size of planes and ROPs in the detector match
110  BOOST_TEST(geom->MaxROPs() == geom->MaxPlanes());
111 
112  // check that we have no TPC set in cryostats after the last one
113  readout::CryostatID const NonexistingCryostatID(geom->Ncryostats());
114  BOOST_TEST(geom->NTPCsets(NonexistingCryostatID) == 0U);
115 
116  //
117  // cryostat-wide checks
118  //
119  for (geo::CryostatID const& cryostatID: geom->IterateCryostatIDs()) {
120  BOOST_TEST_CHECKPOINT("cryostat: " << std::string(cryostatID));
121 
122  readout::CryostatID const ROcryostatID
123  = static_cast<readout::CryostatID const&>(cryostatID);
124 
125  // check that the number of TPC and TPC sets in each cryostat match
126  unsigned int const NTPCsets = geom->NTPCsets(ROcryostatID);
127  BOOST_TEST(NTPCsets == geom->NTPC(cryostatID));
128 
129  // check that we have no TPC set after the last one
130  readout::TPCsetID const NonexistingTPCsetID
131  (ROcryostatID, (readout::TPCsetID::TPCsetID_t) NTPCsets);
132  BOOST_TEST(!geom->HasTPCset(NonexistingTPCsetID));
133  BOOST_TEST(geom->NROPs(NonexistingTPCsetID) == 0U);
134  // the behaviour of the other methods is undefined for non-existent ROPs
135  // BOOST_TEST(geom->TPCsetToTPCs(NonexistingTPCsetID).empty());
136 
137  } // for cryostats
138 
139  //
140  // TPC-wide checks
141  //
142  for (geo::TPCID const& tpcID: geom->IterateTPCIDs()) {
143  BOOST_TEST_CHECKPOINT("TPC: " << std::string(tpcID));
144 
145  // check that the IDs of this TPC and of the TPC set including it match
146  readout::TPCsetID const tpcsetID = geom->TPCtoTPCset(tpcID);
147  CheckMatchingTPClevelIDs(tpcsetID, tpcID);
148 
149  // check that this TPC set maps to only one (and the right one) TPC
150  std::vector<geo::TPCID> TPCs = geom->TPCsetToTPCs(tpcsetID);
151  BOOST_TEST(TPCs.size() == 1U);
152  BOOST_TEST(TPCs.front() == tpcID);
153 
154  // check that the number of ROP in the TPC set matches the planes in the TPC
155  unsigned int const NROPs = geom->NROPs(tpcsetID);
156  BOOST_TEST(NROPs == geom->Nplanes(tpcID));
157 
158  // check all the ROPs:
159  for (unsigned int iROPinTPCset = 0; iROPinTPCset < NROPs; ++iROPinTPCset) {
160  readout::ROPID const ropID
161  (tpcsetID, (readout::ROPID::ROPID_t) iROPinTPCset);
162 
163  BOOST_TEST_CHECKPOINT("ROP: " << std::string(ropID));
164 
165  // do we have it?
166  BOOST_TEST(geom->HasROP(ropID));
167 
168  // is it in the right TPC? and only one?
169  std::vector<geo::TPCID> TPCs = geom->ROPtoTPCs(ropID);
170  BOOST_TEST(TPCs.size() == 1U);
171  BOOST_TEST(TPCs.front() == tpcID);
172 
173  } // for channels
174 
175  } // for TPCs
176 
177 
178 } // ChannelMapStandardTestAlg::TPCsetMappingTest()
179 
180 
181 //-----------------------------------------------------------------------------
183 
184  /*
185  * ChannelMapStandardAlg interface to be tested (via GeometryCore):
186  *
187  * unsigned int Nchannels(readout::ROPID const& ropid) const
188  *
189  * readout::ROPID WirePlaneToROP(geo::PlaneID const& planeid) const
190  *
191  * std::vector<geo::PlaneID> ROPtoWirePlanes
192  * (readout::ROPID const& ropid) const
193  *
194  * std::vector<geo::TPCID> ROPtoTPCs(readout::ROPID const& ropid) const
195  *
196  * readout::ROPID ChannelToROP(raw::ChannelID_t channel) const
197  *
198  * raw::ChannelID_t FirstChannelInROP(readout::ROPID const& ropid) const
199  *
200  * geo::PlaneID FirstWirePlaneInROP(readout::ROPID const& ropid) const
201  * can't do (not exposed!)
202  *
203  */
204 
205  // check for invalid input
206  BOOST_TEST(geom->Nchannels({}) == 0U);
207  BOOST_TEST(!geom->WirePlaneToROP({}).isValid);
208  BOOST_TEST(geom->ROPtoWirePlanes({}).empty());
209  BOOST_TEST(geom->ROPtoTPCs({}).empty());
210  BOOST_TEST(!geom->ChannelToROP(raw::InvalidChannelID).isValid);
211  BOOST_TEST(!raw::isValidChannelID(geom->FirstChannelInROP({})));
212 
213  //
214  // TPC-wide checks
215  //
216  for (geo::TPCID const& tpcID: geom->IterateTPCIDs()) {
217  BOOST_TEST_CHECKPOINT("TPC: " << std::string(tpcID));
218 
219  // build a non-existent ROP ID (but we pretend it valid)
220  readout::TPCsetID const tpcsetID = geom->TPCtoTPCset(tpcID);
221  unsigned int const NROPs = geom->NROPs(tpcsetID);
222  readout::ROPID NonexistingROPID(tpcsetID, (readout::ROPID::ROPID_t) NROPs);
223 
224  // check that we don't have ROPs beyond the last one
225  BOOST_TEST(!geom->HasROP(NonexistingROPID));
226  // the behaviour of the other methods is undefined for non-existent ROPs
227  // BOOST_TEST(geom->ROPtoTPCs(NonexistingROPID).empty());
228  // BOOST_TEST(geom->ROPtoWirePlanes(NonexistingROPID).empty());
229  // BOOST_TEST(geom->Nchannels(NonexistingROPID) == 0U);
230  // BOOST_TEST
231  // (!raw::isValidChannelID(geom->FirstChannelInROP(NonexistingROPID)));
232 
233  } // for TPCs
234 
235 
236  //
237  // plane-wide checks
238  //
239  for (geo::PlaneID const& planeID: geom->IteratePlaneIDs()) {
240  BOOST_TEST_MESSAGE("plane: " << std::string(planeID));
241 
242  // check that the ROP of this plane matches the plane itself
243  readout::ROPID const ropID = geom->WirePlaneToROP(planeID);
244  CheckMatchingPlaneLevelIDs(ropID, planeID);
245 
246  /*
247  // ChannelMapStandardAlg::FirstWirePlaneInROP() is not accessible from
248  // GeometryCore: this test is disabled
249  // check that the first (and only) plane is the expected one
250  BOOST_TEST(geom->FirstWirePlaneInROP(ropID) == planeID);
251  */
252 
253  // check that there is only one plane in this ROP
254  std::vector<geo::PlaneID> const PlanesInROP = geom->ROPtoWirePlanes(ropID);
255  BOOST_TEST(PlanesInROP.size() == 1U);
256  BOOST_TEST(PlanesInROP.front() == planeID);
257 
258  // check that the number of channels in the ROP matches the number of wires
259  unsigned int const NChannels = geom->Nchannels(ropID);
260  BOOST_TEST(NChannels == geom->Nwires(planeID));
261 
262  // check that the TPC is one, and the right one
263  std::vector<geo::TPCID> const TPCs = geom->ROPtoTPCs(ropID);
264  BOOST_TEST(TPCs.size() == 1U);
265  BOOST_TEST(TPCs.front() == planeID.asTPCID());
266 
267  // check that the first channel is valid
268  raw::ChannelID_t const FirstChannelID = geom->FirstChannelInROP(ropID);
269  BOOST_TEST(raw::isValidChannelID(FirstChannelID) == ropID.isValid);
270 
271  // check all the channels:
272  for (
273  unsigned int iChannelInROP = 0; iChannelInROP < NChannels; ++iChannelInROP
274  ) {
275  raw::ChannelID_t const channelID = FirstChannelID + iChannelInROP;
276 
277  BOOST_TEST_CHECKPOINT("channel: " << channelID);
278 
279  // is it in the right plane? and only one?
280  std::vector<geo::WireID> const ChannelWires
281  = geom->ChannelToWire(channelID);
282  BOOST_TEST(ChannelWires.size() == 1U);
283  BOOST_TEST(ChannelWires.front() == planeID);
284 
285  // does the channel map back to the right ROP?
286  readout::ROPID const ChannelROPID = geom->ChannelToROP(channelID);
287  BOOST_TEST(ChannelROPID == ropID);
288 
289  } // for channels
290 
291  } // for planes
292 
293 
294 } // ChannelMapStandardTestAlg::ROPMappingTest()
295 
296 
297 //-----------------------------------------------------------------------------
299 
300  /*
301  * ChannelMapStandardAlg interface being tested (via GeometryCore):
302  *
303  * unsigned int Nchannels() const
304  * (only called, not checked)
305  *
306  * unsigned int HasChannel(raw::ChannelID_t) const
307  *
308  * The rest is not tested here.
309  */
310 
311  // check for invalid input
312  BOOST_TEST(!geom->HasChannel(raw::InvalidChannelID));
313 
314  //
315  // channel-wide checks
316  //
317  unsigned int const NChannels = geom->Nchannels();
318  for (unsigned int iChannel = 0; iChannel < NChannels; ++iChannel) {
319  raw::ChannelID_t channel = (raw::ChannelID_t) iChannel;
320 
321  BOOST_TEST_MESSAGE("channel: " << channel);
322 
323  BOOST_TEST(geom->HasChannel(iChannel));
324 
325  } // for channels
326  BOOST_TEST(!geom->HasChannel((raw::ChannelID_t) NChannels));
327 
328 } // ChannelMapStandardTestAlg::ChannelMappingTest()
329 
330 //-----------------------------------------------------------------------------
void ChannelMappingTest() const
Tests channel mappings (very, very partial)
Classes identifying readout-related concepts.
void ROPMappingTest() const
Tests ROP mappings.
unsigned int ROPID_t
Type for the ID number.
BEGIN_PROLOG opflashtpc1 TPCs
unsigned short TPCsetID_t
Type for the ID number.
Definition: readout_types.h:71
The data type to uniquely identify a Plane.
Definition: geo_types.h:472
bool isValid
Whether this ID points to a valid element.
Definition: geo_types.h:211
Class identifying a set of TPC sharing readout channels.
Definition: readout_types.h:70
CryostatID_t Cryostat
Index of cryostat.
Definition: geo_types.h:212
Access the description of detector geometry.
constexpr ChannelID_t InvalidChannelID
ID of an invalid channel.
Definition: RawTypes.h:32
ROPID_t ROP
Index of the readout plane within its TPC set.
constexpr bool isValidChannelID(raw::ChannelID_t channel)
Definition: RawTypes.h:37
The data type to uniquely identify a TPC.
Definition: geo_types.h:386
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:493
Definition of data types for geometry description.
Class identifying a set of planes sharing readout channels.
TPCsetID_t TPCset
Index of the TPC set within its cryostat.
Definition: readout_types.h:90
Tests the standard channel mapping algorithm.
virtual unsigned int Run()
Executes the test.
void TPCsetMappingTest() const
Tests TPCset mappings.
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:28
TPCID_t TPC
Index of the TPC within its cryostat.
Definition: geo_types.h:406
bool empty(FixedBins< T, C > const &) noexcept
Definition: FixedBins.h:555
The data type to uniquely identify a cryostat.
Definition: geo_types.h:190