LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
WireReadoutStandardGeom.cxx
Go to the documentation of this file.
1 
14 
15 #include "cetlib_except/exception.h"
17 
18 namespace {
19  //----------------------------------------------------------------------------
20  readout::TPCsetID ConvertTPCtoTPCset(geo::TPCID const& tpcid)
21  {
22  if (!tpcid.isValid) return {}; // invalid ID, default-constructed
25  }
26 
27  //----------------------------------------------------------------------------
28  geo::TPCID ConvertTPCsetToTPC(readout::TPCsetID const& tpcsetid)
29  {
30  if (!tpcsetid.isValid) return {};
32  }
33 
34  //----------------------------------------------------------------------------
35  readout::ROPID ConvertWirePlaneToROP(geo::PlaneID const& planeid)
36  {
37  if (!planeid.isValid) return {}; // invalid ID, default-constructed
41  }
42 
43  //----------------------------------------------------------------------------
44  geo::PlaneID ConvertROPtoWirePlane(readout::ROPID const& ropid)
45  {
46  if (!ropid.isValid) return {};
50  }
51 
52 }
53 
54 namespace geo {
55 
56  //----------------------------------------------------------------------------
58  GeometryCore const* geom,
59  std::unique_ptr<WireReadoutSorter> sorter)
60  : WireReadoutGeom{geom,
61  std::make_unique<WireReadoutGeomBuilderStandard>(
62  pset.get<fhicl::ParameterSet>("Builder", {})),
63  std::move(sorter)}
64  {
65  fNcryostat = geom->Ncryostats();
66 
67  mf::LogInfo("WireReadoutStandardGeom") << "Initializing standard wire-readout geometry...";
68 
69  fNTPC.resize(fNcryostat);
70  fWireCounts.resize(fNcryostat);
71  fNPlanes.resize(fNcryostat);
72  fFirstWireProj.resize(fNcryostat);
73  fOrthVectorsY.resize(fNcryostat);
74  fOrthVectorsZ.resize(fNcryostat);
76  fWiresPerPlane.resize(fNcryostat);
79  fPlaneIDs.clear();
80  fTopChannel = 0;
81 
82  int RunningTotal = 0;
83 
84  for (auto const& cryo : geom->Iterate<CryostatGeo>()) {
85  auto const cs = cryo.ID().Cryostat;
86  fNTPC[cs] = cryo.NTPC();
87 
88  // Size up all the vectors
89  fWireCounts[cs].resize(fNTPC[cs]);
90  fFirstWireProj[cs].resize(fNTPC[cs]);
91  fOrthVectorsY[cs].resize(fNTPC[cs]);
92  fOrthVectorsZ[cs].resize(fNTPC[cs]);
93  fPlaneBaselines[cs].resize(fNTPC[cs]);
94  fWiresPerPlane[cs].resize(fNTPC[cs]);
95  fNPlanes[cs].resize(fNTPC[cs]);
96  fFirstChannelInThisPlane[cs].resize(fNTPC[cs]);
97  fFirstChannelInNextPlane[cs].resize(fNTPC[cs]);
98 
99  for (auto const& TPC : geom->Iterate<TPCGeo>(cryo.ID())) {
100  auto const TPCCount = TPC.ID().TPC;
101  unsigned int PlanesThisTPC = Nplanes(TPC.ID());
102  fWireCounts[cs][TPCCount].resize(PlanesThisTPC);
103  fFirstWireProj[cs][TPCCount].resize(PlanesThisTPC);
104  fOrthVectorsY[cs][TPCCount].resize(PlanesThisTPC);
105  fOrthVectorsZ[cs][TPCCount].resize(PlanesThisTPC);
106  fNPlanes[cs][TPCCount] = PlanesThisTPC;
107  for (auto const& plane : Iterate<PlaneGeo>(TPC.ID())) {
108  fPlaneIDs.insert(plane.ID());
109  auto const PlaneCount = plane.ID().Plane;
110 
111  double ThisWirePitch = plane.WirePitch();
112  fWireCounts[cs][TPCCount][PlaneCount] = plane.Nwires();
113 
114  WireGeo const& firstWire = plane.Wire(0);
115  double const sth = firstWire.SinThetaZ(), cth = firstWire.CosThetaZ();
116 
117  auto WireCenter1 = firstWire.GetCenter();
118  auto WireCenter2 = plane.Wire(1).GetCenter();
119 
120  // figure out if we need to flip the orthogonal vector
121  // (should point from wire n -> n+1)
122  double OrthY = cth, OrthZ = -sth;
123  if (((WireCenter2.Y() - WireCenter1.Y()) * OrthY +
124  (WireCenter2.Z() - WireCenter1.Z()) * OrthZ) < 0) {
125  OrthZ *= -1;
126  OrthY *= -1;
127  }
128 
129  // Overall we are trying to build an expression that looks like
130  // int NearestWireNumber = round((worldPos.OrthVector - FirstWire.OrthVector)/WirePitch);
131  // That runs as fast as humanly possible.
132  // We predivide everything by the wire pitch so we don't do this in the loop.
133  //
134  // Putting this together into the useful constants we will use later per plane and tpc:
135  fOrthVectorsY[cs][TPCCount][PlaneCount] = OrthY / ThisWirePitch;
136  fOrthVectorsZ[cs][TPCCount][PlaneCount] = OrthZ / ThisWirePitch;
137 
138  fFirstWireProj[cs][TPCCount][PlaneCount] =
139  WireCenter1.Y() * OrthY + WireCenter1.Z() * OrthZ;
140  fFirstWireProj[cs][TPCCount][PlaneCount] /= ThisWirePitch;
141 
142  // now to count up wires in each plane and get first channel in each plane
143  int WiresThisPlane = plane.Nwires();
144  fWiresPerPlane[cs].at(TPCCount).push_back(WiresThisPlane);
145  fPlaneBaselines[cs].at(TPCCount).push_back(RunningTotal);
146 
147  RunningTotal += WiresThisPlane;
148 
149  fFirstChannelInThisPlane[cs].at(TPCCount).push_back(fTopChannel);
150  fTopChannel += WiresThisPlane;
151  fFirstChannelInNextPlane[cs].at(TPCCount).push_back(fTopChannel);
152 
153  } // end loop over planes
154  } // end loop over TPCs
155  } // end loop over cryostats
156 
157  // calculate the total number of channels in the detector
159 
160  MF_LOG_DEBUG("ChannelMapStandard") << "# of channels is " << fNchannels;
161  }
162 
163  //----------------------------------------------------------------------------
164  std::vector<WireID> WireReadoutStandardGeom::ChannelToWire(raw::ChannelID_t channel) const
165  {
166  std::vector<WireID> AllSegments;
167  unsigned int cstat = 0;
168  unsigned int tpc = 0;
169  unsigned int plane = 0;
170  unsigned int wire = 0;
171 
172  // first check if this channel ID is legal
173  if (channel > fTopChannel)
174  throw cet::exception("Geometry") << "ILLEGAL CHANNEL ID for channel " << channel << "\n";
175 
176  // then go find which plane, tpc and cryostat it is in from the information we stored earlier
177  bool foundWid(false);
178  for (unsigned int csloop = 0; csloop != fNcryostat; ++csloop) {
179  for (unsigned int tpcloop = 0; tpcloop != fNTPC[csloop]; ++tpcloop) {
180  for (unsigned int planeloop = 0;
181  planeloop != fFirstChannelInNextPlane[csloop][tpcloop].size();
182  ++planeloop) {
183  if (channel < fFirstChannelInNextPlane[csloop][tpcloop][planeloop]) {
184  cstat = csloop;
185  tpc = tpcloop;
186  plane = planeloop;
187  wire = channel - fFirstChannelInThisPlane[cstat][tpcloop][planeloop];
188  foundWid = true;
189  break;
190  }
191  if (foundWid) break;
192  } // end plane loop
193  if (foundWid) break;
194  } // end tpc loop
195  if (foundWid) break;
196  } // end cryostat loop
197 
198  WireID CodeWire(cstat, tpc, plane, wire);
199 
200  AllSegments.push_back(CodeWire);
201 
202  return AllSegments;
203  }
204 
205  //----------------------------------------------------------------------------
207  {
208  return fNchannels;
209  }
210 
211  //----------------------------------------------------------------------------
212  unsigned int WireReadoutStandardGeom::Nchannels(readout::ROPID const& ropid) const
213  {
214  if (!HasROP(ropid)) return 0;
215  // The number of channels matches the number of wires. Life is easy.
216  return WireCount(FirstWirePlaneInROP(ropid));
217  }
218 
219  //----------------------------------------------------------------------------
221  double ZPos,
222  PlaneID const& planeID) const
223  {
224  return YPos * AccessElement(fOrthVectorsY, planeID) +
225  ZPos * AccessElement(fOrthVectorsZ, planeID) - AccessElement(fFirstWireProj, planeID);
226  }
227 
228  //----------------------------------------------------------------------------
230  PlaneID const& planeID) const
231  {
232 
233  // This part is the actual calculation of the nearest wire number, where we assume
234  // uniform wire pitch and angle within a wireplane
235 
236  // add 0.5 to have the correct rounding
237  int NearestWireNumber = int(0.5 + WireCoordinate(worldPos.Y(), worldPos.Z(), planeID));
238 
239  // If we are outside of the wireplane range, throw an exception
240  // (this response maintains consistency with the previous
241  // implementation based on geometry lookup)
242  if (NearestWireNumber < 0 || (unsigned int)NearestWireNumber >= WireCount(planeID)) {
243  int wireNumber = NearestWireNumber; // save for the output
244 
245  if (NearestWireNumber < 0)
246  NearestWireNumber = 0;
247  else
248  NearestWireNumber = WireCount(planeID) - 1;
249 
250  throw InvalidWireError("Geometry", planeID, wireNumber, NearestWireNumber)
251  << "Can't Find Nearest Wire for position (" << worldPos.X() << "," << worldPos.Y() << ","
252  << worldPos.Z() << ")"
253  << " in plane " << std::string(planeID) << " approx wire number # " << wireNumber
254  << " (capped from " << NearestWireNumber << ")\n";
255  }
256 
257  return WireID(planeID, (WireID::WireID_t)NearestWireNumber);
258  }
259 
260  //----------------------------------------------------------------------------
261  // This method returns the channel number, assuming the numbering scheme
262  // is heirachical - that is, channel numbers run in order, for example:
263  // (Ben J Oct 2011)
264  // Wire1 | 0
265  // Plane1 { Wire2 | 1
266  // TPC1 { Wire3 | 2
267  // Plane2 { Wire1 | 3 increasing channel number
268  // Wire2 | 4 (with no gaps)
269  // TPC2 { Plane1 { Wire1 | 5
270  // Plane2 { Wire1 | 6
271  // Wire2 v 7
272  //
274  {
275  unsigned int const* pBaseLine = GetElementPtr(fPlaneBaselines, wireID);
276  // This is the actual lookup part - first make sure coordinates are legal
277  if (pBaseLine) {
278  // if the channel has legal coordinates, its ID is given by the wire
279  // number above the number of wires in lower planes, tpcs and cryostats
280  return *pBaseLine + wireID.Wire;
281  }
282  else {
283  // if the coordinates were bad, throw an exception
284  throw cet::exception("WireReadoutStandardGeom")
285  << "NO CHANNEL FOUND for " << std::string(wireID);
286  }
287 
288  // made it here, that shouldn't happen, return raw::InvalidChannelID
289  mf::LogWarning("WireReadoutStandardGeom")
290  << "should not be at the point in the function, returning "
291  << "invalid channel";
292  return raw::InvalidChannelID;
293  }
294 
295  //----------------------------------------------------------------------------
297  {
298 
299  // still assume one cryostat for now -- faster
300  unsigned int nChanPerTPC = fNchannels / fNTPC[0];
301  // casting wil trunc towards 0 -- faster than floor
302  unsigned int tpc = channel / nChanPerTPC;
303  //need number of planes to know Collection
304  unsigned int PlanesThisTPC = fNPlanes[0][tpc];
305 
306  SigType_t sigt = kMysteryType;
307  if ((channel >= fFirstChannelInThisPlane[0][tpc][0]) &&
308  (channel < fFirstChannelInNextPlane[0][tpc][PlanesThisTPC - 2])) {
309  sigt = kInduction;
310  }
311  else if ((channel >= fFirstChannelInThisPlane[0][tpc][PlanesThisTPC - 1]) &&
312  (channel < fFirstChannelInNextPlane[0][tpc][PlanesThisTPC - 1])) {
313  sigt = kCollection;
314  }
315  else
316  mf::LogWarning("BadChannelSignalType")
317  << "Channel " << channel << " not given signal type." << std::endl;
318 
319  return sigt;
320  }
321 
322  //----------------------------------------------------------------------------
323  std::set<PlaneID> const& WireReadoutStandardGeom::PlaneIDs() const
324  {
325  return fPlaneIDs;
326  }
327 
328  //----------------------------------------------------------------------------
329  unsigned int WireReadoutStandardGeom::NTPCsets(readout::CryostatID const& cryoid) const
330  {
331  // return the same number as the number of TPCs
332  return (cryoid.isValid && cryoid.Cryostat < fNTPC.size()) ? fNTPC[cryoid.Cryostat] : 0;
333  }
334 
335  //----------------------------------------------------------------------------
337  {
338  return MaxTPCs();
339  }
340 
341  //----------------------------------------------------------------------------
343  {
344  return tpcsetid.TPCset < NTPCsets(tpcsetid);
345  }
346 
347  //----------------------------------------------------------------------------
349  {
350  return ConvertTPCtoTPCset(tpcid);
351  }
352 
353  //----------------------------------------------------------------------------
354  std::vector<TPCID> WireReadoutStandardGeom::TPCsetToTPCs(readout::TPCsetID const& tpcsetid) const
355  {
356  std::vector<TPCID> IDs;
357  if (tpcsetid.isValid) IDs.emplace_back(ConvertTPCsetToTPC(tpcsetid));
358  return IDs;
359  }
360 
361  //----------------------------------------------------------------------------
363  {
364  return ConvertTPCsetToTPC(tpcsetid);
365  }
366 
367  //----------------------------------------------------------------------------
368  unsigned int WireReadoutStandardGeom::MaxTPCs() const
369  {
370  unsigned int max = 0;
371  for (unsigned int nTPCs : fNTPC)
372  if (nTPCs > max) max = nTPCs;
373  return max;
374  }
375 
376  //----------------------------------------------------------------------------
377  unsigned int WireReadoutStandardGeom::NROPs(readout::TPCsetID const& tpcsetid) const
378  {
379  if (!HasTPCset(tpcsetid)) return 0;
380  return AccessElement(fNPlanes, FirstTPCinTPCset(tpcsetid));
381  }
382 
383  //----------------------------------------------------------------------------
384  unsigned int WireReadoutStandardGeom::MaxROPs() const
385  {
386  unsigned int max = 0;
387  for (auto const& cryo_tpc : fNPlanes)
388  for (unsigned int nPlanes : cryo_tpc)
389  if (nPlanes > max) max = nPlanes;
390  return max;
391  }
392 
393  //----------------------------------------------------------------------------
395  {
396  return ropid.ROP < NROPs(ropid);
397  }
398 
399  //----------------------------------------------------------------------------
401  {
402  return ConvertWirePlaneToROP(planeid);
403  }
404 
405  //----------------------------------------------------------------------------
406  std::vector<PlaneID> WireReadoutStandardGeom::ROPtoWirePlanes(readout::ROPID const& ropid) const
407  {
408  std::vector<PlaneID> IDs;
409  if (ropid.isValid) IDs.emplace_back(FirstWirePlaneInROP(ropid));
410  return IDs;
411  }
412 
413  //----------------------------------------------------------------------------
414  std::vector<TPCID> WireReadoutStandardGeom::ROPtoTPCs(readout::ROPID const& ropid) const
415  {
416  std::vector<TPCID> IDs;
417  // we take the TPC set of the ROP and convert it straight into a TPC ID
418  if (ropid.isValid) IDs.emplace_back(ConvertTPCsetToTPC(ropid.asTPCsetID()));
419  return IDs;
420  }
421 
422  //----------------------------------------------------------------------------
424  {
425  if (!raw::isValidChannelID(channel)) return {}; // invalid ROP returned
426 
427  // which wires does the channel cover?
428  std::vector<WireID> wires = ChannelToWire(channel);
429 
430  // - none:
431  if (wires.empty()) return {}; // invalid ROP returned
432 
433  // - one: maps its plane ID into a ROP ID
434  return WirePlaneToROP(wires[0]);
435  }
436 
437  //----------------------------------------------------------------------------
439  {
440  if (!ropid.isValid) return raw::InvalidChannelID;
441  return (raw::ChannelID_t)AccessElement(fPlaneBaselines, ConvertROPtoWirePlane(ropid));
442  }
443 
444  //----------------------------------------------------------------------------
446  {
447  return ConvertROPtoWirePlane(ropid);
448  }
449 
450 } // namespace
Geometry description of a TPC wireThe wire is a single straight segment on a wire plane...
Definition: WireGeo.h:112
PlaneInfoMap_t< float > fOrthVectorsZ
Point_t const & GetCenter() const
Returns the world coordinate of the center of the wire [cm].
Definition: WireGeo.h:219
Who knows?
Definition: geo_types.h:149
WireReadoutStandardGeom(fhicl::ParameterSet const &pset, GeometryCore const *geom, std::unique_ptr< WireReadoutSorter > sorter)
Encapsulate the construction of a single cyostat .
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
unsigned int ROPID_t
Type for the ID number.
unsigned int MaxROPs() const override
Returns the largest number of ROPs a TPC set in the detector has.
unsigned short TPCsetID_t
Type for the ID number.
Definition: readout_types.h:55
unsigned int PlaneID_t
Type for the ID number.
Definition: geo_types.h:365
double SinThetaZ() const
Returns trigonometric operations on ThetaZ()
Definition: WireGeo.h:261
The data type to uniquely identify a Plane.
Definition: geo_types.h:364
bool isValid
Whether this ID points to a valid element.
Definition: geo_types.h:194
Geometry information for a single TPC.
Definition: TPCGeo.h:33
SigType_t SignalTypeForChannelImpl(raw::ChannelID_t const channel) const override
Return the signal type of the specified channel.
Class identifying a set of TPC sharing readout channels.
Definition: readout_types.h:54
TPCID FirstTPCinTPCset(readout::TPCsetID const &tpcsetid) const override
Returns the ID of the first TPC belonging to the specified TPC set.
WireID NearestWireID(Point_t const &worldPos, PlaneID const &planeID) const override
Returns the ID of the wire nearest to the specified position.
unsigned int WireCount(PlaneID const &id) const
Retrieved the wire cound for the specified plane ID.
CryostatID_t Cryostat
Index of cryostat.
Definition: geo_types.h:195
unsigned int MaxTPCsets() const override
Returns the largest number of TPC sets any cryostat in the detector has.
unsigned int fNcryostat
number of cryostats in the detector
WireID_t Wire
Index of the wire within its plane.
Definition: geo_types.h:430
PlaneInfoMap_t< unsigned int > fWiresPerPlane
Geometry information for a single cryostat.
Definition: CryostatGeo.h:42
bool HasTPCset(readout::TPCsetID const &tpcsetid) const override
std::vector< TPCID > ROPtoTPCs(readout::ROPID const &ropid) const override
Returns a list of ID of TPCs the specified ROP spans.
PlaneGeo const * GetElementPtr(PlaneID const &planeid) const
Returns the specified plane.
readout::ROPID ChannelToROP(raw::ChannelID_t channel) const override
Returns the ID of the ROP the channel belongs to (invalid if none)
std::vector< TPCID > TPCsetToTPCs(readout::TPCsetID const &tpcsetid) const override
Returns a list of ID of TPCs belonging to the specified TPC set.
Access the description of the physical detector geometry.
double WireCoordinate(double YPos, double ZPos, PlaneID const &planeID) const override
Returns the index of the wire nearest to the specified position.
std::set< PlaneID > fPlaneIDs
vector of the PlaneIDs present in the detector
PlaneInfoMap_t< float > fWireCounts
std::set< PlaneID > const & PlaneIDs() const override
Returns a list of the plane IDs in the whole detector.
Collection of exceptions for Geometry system.
constexpr ChannelID_t InvalidChannelID
ID of an invalid channel.
Definition: RawTypes.h:31
ROPID_t ROP
Index of the readout plane within its TPC set.
IDparameter< geo::WireID > WireID
Member type of validated geo::WireID parameter.
Signal from induction planes.
Definition: geo_types.h:147
constexpr TPCsetID const & asTPCsetID() const
Conversion to ROPID (for convenience of notation).
enum geo::_plane_sigtype SigType_t
Enumerate the possible plane projections.
Interface for a class providing readout channel mapping to geometry.
unsigned int NROPs(readout::TPCsetID const &tpcsetid) const override
Returns the total number of ROPs in the specified TPC set.
T get(std::string const &key) const
Definition: ParameterSet.h:314
unsigned int fNchannels
number of channels in the detector
constexpr bool isValidChannelID(raw::ChannelID_t channel)
Definition: RawTypes.h:35
raw::ChannelID_t FirstChannelInROP(readout::ROPID const &ropid) const override
Returns the ID of the first channel in the specified readout plane.
PlaneInfoMap_t< unsigned int > fPlaneBaselines
The data type to uniquely identify a TPC.
Definition: geo_types.h:306
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:373
Description of the physical geometry of one entire detector.
Definition: GeometryCore.h:91
TPCInfoMap_t< unsigned int > fNPlanes
Class identifying a set of planes sharing readout channels.
TPCsetID_t TPCset
Index of the TPC set within its cryostat.
Definition: readout_types.h:63
unsigned int Nplanes(TPCID const &tpcid=details::tpc_zero) const
Returns the total number of planes in the specified TPC.
PlaneInfoMap_t< float > fOrthVectorsY
Unit vectors orthogonal to wires in.
unsigned int NTPCsets(readout::CryostatID const &cryoid) const override
Returns the total number of TPC sets in the specified cryostat.
Encapsulate the geometry of a wire .
PlaneInfoMap_t< float > fFirstWireProj
raw::ChannelID_t fTopChannel
book keeping highest channel #
unsigned int Nchannels() const override
Returns the total number of channels present (not necessarily contiguous)
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
Definition: geo_vectors.h:180
unsigned int CryostatID_t
Type for the ID number.
Definition: geo_types.h:188
readout::ROPID WirePlaneToROP(PlaneID const &planeid) const override
Returns the ID of the ROP planeid belongs to, or invalid if none.
unsigned int TPCID_t
Type for the ID number.
Definition: geo_types.h:307
Encapsulate the construction of a single detector plane .
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
#define MF_LOG_DEBUG(id)
PlaneInfoMap_t< raw::ChannelID_t > fFirstChannelInThisPlane
Exception thrown on invalid wire number.
Definition: Exceptions.h:37
Interface to algorithm class for a specific detector channel mapping.
unsigned int WireID_t
Type for the ID number.
Definition: geo_types.h:422
PlaneID FirstWirePlaneInROP(readout::ROPID const &ropid) const override
Returns the ID of the first plane belonging to the specified ROP.
T const & AccessElement(TPCInfoMap_t< T > const &map, TPCID const &id) const
Returns the specified element of the TPC map.
double CosThetaZ() const
Returns trigonometric operations on ThetaZ()
Definition: WireGeo.h:260
PlaneInfoMap_t< raw::ChannelID_t > fFirstChannelInNextPlane
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:315
raw::ChannelID_t PlaneWireToChannel(WireID const &wireID) const override
Returns the channel ID a wire is connected to.
bool HasROP(readout::ROPID const &ropid) const override
ROOT libraries.
std::vector< PlaneID > ROPtoWirePlanes(readout::ROPID const &ropid) const override
Returns a list of ID of wire planes belonging to the specified ROP.
unsigned int MaxTPCs() const
Returns the largest number of TPCs in a single cryostat.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
std::vector< WireID > ChannelToWire(raw::ChannelID_t channel) const override
Encapsulate the construction of a single detector plane .
readout::TPCsetID TPCtoTPCset(TPCID const &tpcid) const override
Returns the ID of the TPC set the specified TPC belongs to.
The data type to uniquely identify a cryostat.
Definition: geo_types.h:187
Signal from collection planes.
Definition: geo_types.h:148
std::vector< unsigned int > fNTPC
number of TPCs in each cryostat