ATLAS Offline Software
Classes | Macros | Functions | Variables
runMdtGeoComparison.cxx File Reference
#include <GeoPrimitives/GeoPrimitivesHelpers.h>
#include <GeoPrimitives/GeoPrimitivesToStringConverter.h>
#include "GeoModelHelpers/TransformToStringConverter.h"
#include <MuonCablingData/MdtCablingData.h>
#include <MuonReadoutGeometryR4/MuonDetectorDefs.h>
#include "CxxUtils/starts_with.h"
#include <GaudiKernel/SystemOfUnits.h>
#include <iostream>
#include <PathResolver/PathResolver.h>
#include <TFile.h>
#include <TTreeReader.h>

Go to the source code of this file.

Classes

struct  MdtChamber
 Helper struct to represent a full Mdt chamber. More...
 
struct  MdtChamber::TubePositioning
 

Macros

#define TEST_BASICPROP(attribute, propName)
 
#define TEST_TUBEPROP(attribute, propName)
 

Functions

std::ostream & operator<< (std::ostream &ostr, const MdtChamber &chamb)
 Translation of the station Index -> station Name. More...
 
std::set< MdtChamberreadTreeDump (const std::string &inputFile)
 
int main (int argc, char **argv)
 

Variables

constexpr double tolerance = 10 * Gaudi::Units::micrometer
 

Macro Definition Documentation

◆ TEST_BASICPROP

#define TEST_BASICPROP (   attribute,
  propName 
)
Value:
if (std::abs(1.*test.attribute - 1.*reference.attribute) > tolerance) { \
std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": "<<test \
<<" differs w.r.t "<<propName<<" "<< reference.attribute \
<<" (ref) vs. " <<test.attribute << " (test)" << std::endl; \
chamberOkay = false; \
}

Definition at line 108 of file runMdtGeoComparison.cxx.

◆ TEST_TUBEPROP

#define TEST_TUBEPROP (   attribute,
  propName 
)
Value:
if (std::abs(1.*refTube.attribute - 1.*testTube.attribute) > tolerance) { \
std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": In "<<test<<" the tubes (" \
<<layer<<","<<std::setfill('0')<<std::setw(3)<<tube<<")" \
<<" differ w.r.t "<<propName<<". " \
<< refTube.attribute <<" (ref) vs. " <<testTube.attribute \
<< " (test)" << std::endl; \
chamberOkay = false; \
}

Definition at line 116 of file runMdtGeoComparison.cxx.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

check whether the files are xroot d -> otherwise call path resovler

Parse the tree dump

Start to loop over the chambers

We do not care whether the orientation of the coordinate system along the wire flips for negative chambers or not

The ultimate goal is to have the tube positioned at the same place. We maybe need the origin position later when we are adding the alignable transforms...

Check the tube transformations

Remember the tube staggering is in the (x-y) plane. Allow for deviations in the z-axis due to different cutouts

In cases where the tube coordinate systems are not aligned, there's no point in checking the position of the reaodout

Definition at line 246 of file runMdtGeoComparison.cxx.

246  {
247  std::string refFile{}, testFile{};
248 
249  for (int arg = 1; arg < argc; ++arg) {
250  std::string the_arg{argv[arg]};
251  if (the_arg == "--refFile" && arg +1 < argc) {
252  refFile = std::string{argv[arg+1]};
253  ++arg;
254  } else if (the_arg == "--testFile" && arg + 1 < argc) {
255  testFile = std::string{argv[arg+1]};
256  ++arg;
257  }
258  }
259  if (refFile.empty()) {
260  std::cerr<<"Please parse the path of the reference file via --refFile "<<std::endl;
261  return EXIT_FAILURE;
262  }
263  if (testFile.empty()) {
264  std::cerr<<"Please parse the path of the test file via --testFile "<<std::endl;
265  return EXIT_FAILURE;
266  }
268  if (!CxxUtils::starts_with (refFile, "root://")) refFile = PathResolver::FindCalibFile(refFile);
271  std::set<MdtChamber> refChambers = readTreeDump(refFile);
272  if (refChambers.empty()) {
273  std::cerr<<"The file "<<refFile<<" should contain at least one chamber "<<std::endl;
274  return EXIT_FAILURE;
275  }
276  std::set<MdtChamber> testChambers = readTreeDump(testFile);
277  if (testChambers.empty()) {
278  std::cerr<<"The file "<<testFile<<" should contain at least one chamber "<<std::endl;
279  return EXIT_FAILURE;
280  }
281  int return_code = EXIT_SUCCESS;
283  for (const MdtChamber& reference : refChambers) {
284  std::set<MdtChamber>::const_iterator test_itr = testChambers.find(reference);
285 
286  if (test_itr == testChambers.end()) {
287  std::cerr<<"The chamber "<<reference<<" is not part of the testing "<<std::endl;
288  return_code = EXIT_FAILURE;
289  continue;
290  }
291  bool chamberOkay = true;
292  const MdtChamber& test = {*test_itr};
294  TEST_BASICPROP(numLayers, "number of layers");
295  TEST_BASICPROP(numTubes, "number of tubes");
296  TEST_BASICPROP(tubePitch, "tube pitch");
297  TEST_BASICPROP(tubeRadius, "tube radius");
298 
299  const Amg::Transform3D alignableDistort = test.alignableTransform.inverse()*(reference.alignableTransform );
300  if (!Amg::doesNotDeform(alignableDistort) || alignableDistort.translation().mag() > tolerance) {
301  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": The alignable nodes are at differnt places for "
302  <<test<<". " <<GeoTrf::toString(alignableDistort, true)<<" chamber length: "<<
303  (reference.tubePitch * (1.*reference.numTubes + 0.5))<<std::endl;
304  chamberOkay = false;
305  }
306  const Amg::Transform3D distortion = test.geoModelTransform.inverse() * reference.geoModelTransform;
309  bool flippedChamb = {reference.id.eta < 0 && Amg::doesNotDeform(distortion * Amg::getRotateX3D(M_PI))};
310  if (!Amg::doesNotDeform(distortion) && !flippedChamb) {
311  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": The chamber coordinate systems rotate differently for "
312  <<reference<<". Difference in the coordinate transformation: "
313  <<Amg::toString(distortion)<<std::endl;
314  chamberOkay = false;
315  }
318  if (false && distortion.translation().mag() > tolerance) {
319  std::cout<<"The origins of the chamber coordinate systems are not exactly at the same point for "
320  <<reference<<". Translation shift: "<<Amg::toString(distortion.translation(), 2)<<std::endl;
321  }
323  bool stagFailure{false}, alignFailure{false}, readoutOrient{false};
324  for (unsigned int layer = 1; layer<= std::min(reference.numLayers, test.numLayers) ; ++layer) {
325  for (unsigned int tube = 1; tube <= std::min(reference.numTubes, test.numTubes); ++tube) {
326  using TubePositioning = MdtChamber::TubePositioning;
327  const TubePositioning& refTube = reference.getTube(layer, tube);
328  const TubePositioning& testTube = test.getTube(layer, tube);
329  const Amg::Transform3D tubeDistortion = testTube.localToGlobal.inverse() * refTube.localToGlobal;
330  bool flippedTube{reference.id.eta < 0 && Amg::doesNotDeform(tubeDistortion * Amg::getRotateX3D(M_PI))};
331 
332  if (!alignFailure && !(Amg::doesNotDeform(tubeDistortion) || flippedTube)) {
333  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": In chamber "<<reference<<" the tube reference systems for ("<<layer<<", "
334  <<std::setfill('0')<<std::setw(3)<<tube<<") are not exactly aligned. "<<Amg::toString(tubeDistortion)<<std::endl;
335  alignFailure = true;
336  }
339  if (!stagFailure && tubeDistortion.translation().perp() > tolerance) {
340  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": Misplaced staggering found in "<<reference<<" the tube ("<<layer
341  <<", "<<std::setfill('0')<<std::setw(3)<<tube<<") "
342  << Amg::toString(refTube.localToGlobal.translation() -
343  testTube.localToGlobal.translation(), 3)<<std::endl;
344  stagFailure = true;
345  }
346 
347  // TEST_TUBEPROP(tubeLength, "tube length");
348  // TEST_TUBEPROP(wireLength, "wire length");
349  TEST_TUBEPROP(activeLength, "active length");
352  if (alignFailure || readoutOrient) continue;
353  const Amg::Transform3D refSystem = refTube.localToGlobal.inverse();
354 
355  const Amg::Vector3D refRO = refSystem * refTube.readoutPos;
356  const Amg::Vector3D testRO = refSystem* testTube.readoutPos;
357  if (refRO.z()* testRO.z() < 0.){
358  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": The readout is on different sites for chamber: "<<reference<<
359  ", layer "<<layer<<", tube: "<<std::setfill('0')<<std::setw(3)<<tube<<". "
360  <<Amg::toString(refRO, 2)<<" vs. "<<Amg::toString(testRO)<<std::endl;
361  readoutOrient = true;
362  }
363 
364  }
365  if (stagFailure || alignFailure) {
366  chamberOkay = false;
367  }
368  }
369  if (!chamberOkay) return_code = EXIT_FAILURE;
370  else std::cout<<"runMdtGeoComparision() "<<__LINE__<<": Found perfect agreement between new & old geometry for "<<reference<<std::endl;
371  }
372  for (const MdtChamber& test : testChambers) {
373  if (!refChambers.count(test)) {
374  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": "<<test<<" is only in the test set."<<std::endl;
375  return_code = EXIT_FAILURE;
376  }
377  }
378  return return_code;
379 
380 }

◆ operator<<()

std::ostream& operator<< ( std::ostream &  ostr,
const MdtChamber chamb 
)

Translation of the station Index -> station Name.

Dictionary taken from https://gitlab.cern.ch/atlas/athena/-/blob/main/DetectorDescription/IdDictParser/data/IdDictMuonSpectrometer_R.09.03.xml

Definition at line 91 of file runMdtGeoComparison.cxx.

91  {
92  static const std::map<int, std::string> stationDict{
93  {0, "BIL"}, {1, "BIS"}, {7, "BIR"},
94  {2, "BML"}, {3, "BMS"}, {8, "BMF"}, {53, "BME"}, {54, "BMG"}, {52, "BIM"},
95  {4, "BOL"}, {5, "BOS"}, {9, "BOF"}, {10, "BOG"},
96  {6, "BEE"}, {14, "EEL"}, {15, "EES"},
97  {13, "EIL"}, {49, "EIS"},
98  {17, "EML"}, {18, "EMS"},
99  {20, "EOL"}, {21, "EOS"}
100  };
101  ostr<<stationDict.at(chamb.id.stationIndex)<<" "<<chamb.design<<" "<<chamb.id;
102  return ostr;
103 }

◆ readTreeDump()

std::set<MdtChamber> readTreeDump ( const std::string &  inputFile)

Information to access each tube individually

Readout the information of each tube specifically

Definition at line 125 of file runMdtGeoComparison.cxx.

125  {
126  std::set<MdtChamber> to_ret{};
127  std::cout<<"Read the Mdt geometry tree dump from "<<inputFile<<std::endl;
128  std::unique_ptr<TFile> inFile{TFile::Open(inputFile.c_str())};
129  if (!inFile || !inFile->IsOpen()) {
130  std::cerr<<__FILE__<<":"<<__LINE__<<" Failed to open "<<inputFile<<std::endl;
131  return to_ret;
132  }
133  TTreeReader treeReader("MdtGeoModelTree", inFile.get());
134  if (treeReader.IsInvalid()){
135  std::cerr<<__FILE__<<":"<<__LINE__<<" The file "<<inputFile<<" does not contain the 'MdtGeoModelTree'"<<std::endl;
136  return to_ret;
137  }
138 
139  TTreeReaderValue<unsigned short> stationIndex{treeReader, "stationIndex"};
140  TTreeReaderValue<short> stationEta{treeReader, "stationEta"};
141  TTreeReaderValue<short> stationPhi{treeReader, "stationPhi"};
142  TTreeReaderValue<short> stationML{treeReader, "stationMultiLayer"};
143  TTreeReaderValue<std::string> chamberDesign{treeReader,"chamberDesign"};
144 
145  TTreeReaderValue<double> tubeRadius{treeReader, "tubeRadius"};
146  TTreeReaderValue<double> tubePitch{treeReader, "tubePitch"};
147  TTreeReaderValue<unsigned short> numTubes{treeReader, "numTubes"};
148  TTreeReaderValue<unsigned short> numLayers{treeReader, "numLayers"};
149 
150  TTreeReaderValue<std::vector<float>> geoModelTransformX{treeReader, "GeoModelTransformX"};
151  TTreeReaderValue<std::vector<float>> geoModelTransformY{treeReader, "GeoModelTransformY"};
152  TTreeReaderValue<std::vector<float>> geoModelTransformZ{treeReader, "GeoModelTransformZ"};
153 
154  TTreeReaderValue<std::vector<float>> alignableNodeX{treeReader, "AlignableNodeX"};
155  TTreeReaderValue<std::vector<float>> alignableNodeY{treeReader, "AlignableNodeY"};
156  TTreeReaderValue<std::vector<float>> alignableNodeZ{treeReader, "AlignableNodeZ"};
157 
158 
160  TTreeReaderValue<std::vector<unsigned short>> tubeLayer{treeReader, "tubeLayer"};
161  TTreeReaderValue<std::vector<unsigned short>> tubeNumber{treeReader, "tubeNumber"};
162 
163  TTreeReaderValue<std::vector<double>> tubeLength{treeReader, "tubeLength"};
164  TTreeReaderValue<std::vector<double>> activeTubeLength{treeReader, "activeTubeLength"};
165  TTreeReaderValue<std::vector<double>> wireLength{treeReader, "wireLength"};
166 
167  TTreeReaderValue<std::vector<float>> tubeTransformTransX{treeReader, "tubeTransformTranslationX"};
168  TTreeReaderValue<std::vector<float>> tubeTransformTransY{treeReader, "tubeTransformTranslationY"};
169  TTreeReaderValue<std::vector<float>> tubeTransformTransZ{treeReader, "tubeTransformTranslationZ"};
170 
171  TTreeReaderValue<std::vector<float>> tubeTransformCol0X{treeReader, "tubeTransformLinearCol1X"};
172  TTreeReaderValue<std::vector<float>> tubeTransformCol0Y{treeReader, "tubeTransformLinearCol1Y"};
173  TTreeReaderValue<std::vector<float>> tubeTransformCol0Z{treeReader, "tubeTransformLinearCol1Z"};
174 
175  TTreeReaderValue<std::vector<float>> tubeTransformCol1X{treeReader, "tubeTransformLinearCol2X"};
176  TTreeReaderValue<std::vector<float>> tubeTransformCol1Y{treeReader, "tubeTransformLinearCol2Y"};
177  TTreeReaderValue<std::vector<float>> tubeTransformCol1Z{treeReader, "tubeTransformLinearCol2Z"};
178 
179  TTreeReaderValue<std::vector<float>> tubeTransformCol2X{treeReader, "tubeTransformLinearCol3X"};
180  TTreeReaderValue<std::vector<float>> tubeTransformCol2Y{treeReader, "tubeTransformLinearCol3Y"};
181  TTreeReaderValue<std::vector<float>> tubeTransformCol2Z{treeReader, "tubeTransformLinearCol3Z"};
182 
183  TTreeReaderValue<std::vector<float>> readOutPosX{treeReader, "readOutPosX"};
184  TTreeReaderValue<std::vector<float>> readOutPosY{treeReader, "readOutPosY"};
185  TTreeReaderValue<std::vector<float>> readOutPosZ{treeReader, "readOutPosZ"};
186 
187  while (treeReader.Next()) {
188  MdtChamber newchamber{};
189 
190  newchamber.id.stationIndex = (*stationIndex);
191  newchamber.id.eta = (*stationEta);
192  newchamber.id.phi = (*stationPhi);
193  newchamber.id.multilayer = (*stationML);
194  newchamber.design = (*chamberDesign);
195 
196  newchamber.tubeRadius = (*tubeRadius);
197  newchamber.tubePitch = (*tubePitch);
198 
199  newchamber.numTubes = (*numTubes);
200  newchamber.numLayers = (*numLayers);
201 
202  Amg::RotationMatrix3D geoRot{Amg::RotationMatrix3D::Identity()};
203  geoRot.col(0) = Amg::Vector3D((*geoModelTransformX)[1], (*geoModelTransformY)[1], (*geoModelTransformZ)[1]);
204  geoRot.col(1) = Amg::Vector3D((*geoModelTransformX)[2], (*geoModelTransformY)[2], (*geoModelTransformZ)[2]);
205  geoRot.col(2) = Amg::Vector3D((*geoModelTransformX)[3], (*geoModelTransformY)[3], (*geoModelTransformZ)[3]);
206  Amg::Vector3D geoTrans{(*geoModelTransformX)[0], (*geoModelTransformY)[0], (*geoModelTransformZ)[0]};
207  newchamber.geoModelTransform = Amg::getTransformFromRotTransl(std::move(geoRot), std::move(geoTrans));
208 
209  geoRot.col(0) = Amg::Vector3D((*alignableNodeX)[1], (*alignableNodeY)[1], (*alignableNodeZ)[1]);
210  geoRot.col(1) = Amg::Vector3D((*alignableNodeX)[2], (*alignableNodeY)[2], (*alignableNodeZ)[2]);
211  geoRot.col(2) = Amg::Vector3D((*alignableNodeX)[3], (*alignableNodeY)[3], (*alignableNodeZ)[3]);
212  geoTrans = Amg::Vector3D{(*alignableNodeX)[0], (*alignableNodeY)[0], (*alignableNodeZ)[0]};
213  newchamber.alignableTransform = Amg::getTransformFromRotTransl(std::move(geoRot), std::move(geoTrans));
214 
215 
217  for (size_t t = 0; t < tubeLayer->size(); ++t){
218  using TubePositioning = MdtChamber::TubePositioning;
219  TubePositioning newTube{};
220  newTube.layerNum = (*tubeLayer)[t];
221  newTube.tubeNum = (*tubeNumber)[t];
222  newTube.tubeLength = (*tubeLength)[t];
223  newTube.wireLength = (*wireLength)[t];
224  Amg::RotationMatrix3D tubeRot{Amg::RotationMatrix3D::Identity()};
225  tubeRot.col(0) = Amg::Vector3D((*tubeTransformCol0X)[t],(*tubeTransformCol0Y)[t], (*tubeTransformCol0Z)[t]);
226  tubeRot.col(1) = Amg::Vector3D((*tubeTransformCol1X)[t],(*tubeTransformCol1Y)[t], (*tubeTransformCol1Z)[t]);
227  tubeRot.col(2) = Amg::Vector3D((*tubeTransformCol2X)[t],(*tubeTransformCol2Y)[t], (*tubeTransformCol2Z)[t]);
228  Amg::Vector3D tubeTrans{(*tubeTransformTransX)[t],(*tubeTransformTransY)[t], (*tubeTransformTransZ)[t]};
229  newTube.localToGlobal = Amg::getTransformFromRotTransl(std::move(tubeRot), std::move(tubeTrans));
230  newTube.readoutPos = Amg::Vector3D{(*readOutPosX)[t],(*readOutPosY)[t],(*readOutPosZ)[t]};
231  newchamber.insertTube(std::move(newTube));
232  }
233 
234  auto insert_itr = to_ret.insert(std::move(newchamber));
235  if (!insert_itr.second) {
236  std::stringstream err{};
237  err<<__FILE__<<":"<<__LINE__<<" The chamber "<<(*insert_itr.first).id
238  <<" has already been inserted. "<<std::endl;
239  throw std::runtime_error(err.str());
240  }
241  }
242  std::cout<<"File parsing is finished. Found in total "<<to_ret.size()<<" readout element dumps "<<std::endl;
243  return to_ret;
244 }

Variable Documentation

◆ tolerance

constexpr double tolerance = 10 * Gaudi::Units::micrometer
constexpr

Definition at line 105 of file runMdtGeoComparison.cxx.

TEST_TUBEPROP
#define TEST_TUBEPROP(attribute, propName)
Definition: runMdtGeoComparison.cxx:115
Muon::nsw::STGTPSegments::moduleIDBits::stationPhi
constexpr uint8_t stationPhi
station Phi 1 to 8
Definition: NSWSTGTPDecodeBitmaps.h:129
tolerance
constexpr double tolerance
Definition: runMdtGeoComparison.cxx:105
CxxUtils::starts_with
bool starts_with(const char *s, const char *prefix)
Test whether one null-terminated byte string starts with another.
PathResolver::FindCalibFile
static std::string FindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.h:108
MdtCablingOffData::stationIndex
int8_t & stationIndex
Definition: MdtCablingData.h:26
makeTOC.inFile
string inFile
Definition: makeTOC.py:5
M_PI
#define M_PI
Definition: ActiveFraction.h:11
plotIsoValidation.treeReader
treeReader
Definition: plotIsoValidation.py:127
reference
Definition: hcg.cxx:437
TrigInDetValidation_Base.test
test
Definition: TrigInDetValidation_Base.py:144
LArCellConditions.argv
argv
Definition: LArCellConditions.py:112
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
TEST_BASICPROP
#define TEST_BASICPROP(attribute, propName)
Definition: runMdtGeoComparison.cxx:107
Amg::getTransformFromRotTransl
Amg::Transform3D getTransformFromRotTransl(Amg::RotationMatrix3D rot, Amg::Vector3D transl_vec)
Definition: GeoPrimitivesHelpers.h:172
Amg::getRotateX3D
Amg::Transform3D getRotateX3D(double angle)
get a rotation transformation around X-axis
Definition: GeoPrimitivesHelpers.h:252
MdtChamber::TubePositioning::layerNum
unsigned int layerNum
Layer to which the tube belongs.
Definition: runMdtGeoComparison.cxx:59
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
dqt_zlumi_pandas.err
err
Definition: dqt_zlumi_pandas.py:193
CaloCondBlobAlgs_fillNoiseFromASCII.inputFile
string inputFile
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:17
MdtChamber::id
chamberIdentifier id
Definition: runMdtGeoComparison.cxx:35
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
Amg::doesNotDeform
bool doesNotDeform(const Amg::Transform3D &trans)
Checks whether the linear part of the transformation rotates or stetches any of the basis vectors.
Definition: GeoPrimitivesHelpers.h:338
DQHistogramMergeRegExp.argc
argc
Definition: DQHistogramMergeRegExp.py:20
readTreeDump
std::set< MdtChamber > readTreeDump(const std::string &inputFile)
Definition: runMdtGeoComparison.cxx:125
MdtChamber::TubePositioning
Definition: runMdtGeoComparison.cxx:57
min
#define min(a, b)
Definition: cfImp.cxx:40
create_dcsc_inputs_sqlite.arg
list arg
Definition: create_dcsc_inputs_sqlite.py:48
tolerance
Definition: suep_shower.h:17
L1CaloPhase1Monitoring.propName
propName
Definition: L1CaloPhase1Monitoring.py:349
HI::TowerBins::numLayers
constexpr unsigned int numLayers()
Definition: HIEventDefs.h:23
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
Amg::RotationMatrix3D
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
Definition: GeoPrimitives.h:49
tubeLength
double tubeLength
Definition: MDT_ResponseTest.cxx:32
CscCalibQuery.testFile
testFile
Definition: CscCalibQuery.py:274
Muon::nsw::STGTPSegments::moduleIDBits::stationEta
constexpr uint8_t stationEta
1 to 3
Definition: NSWSTGTPDecodeBitmaps.h:127
calibdata.tube
tube
Definition: calibdata.py:31
MdtChamber::design
std::string design
Definition: runMdtGeoComparison.cxx:36
MdtChamber
Helper struct to represent a full Mdt chamber.
Definition: runMdtGeoComparison.cxx:29