ATLAS Offline Software
runMdtGeoComparison.cxx
Go to the documentation of this file.
1 
2 /*
3  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4 */
14 #include "GeoModelHelpers/TransformToStringConverter.h"
17 #include "CxxUtils/starts_with.h"
18 #include <GaudiKernel/SystemOfUnits.h>
19 #include <iostream>
20 
21 
23 #include <TFile.h>
24 #include <TTreeReader.h>
25 
26 using namespace MuonGMR4;
27 using namespace ActsTrk;
29 struct MdtChamber{
31  MdtChamber() = default;
32 
36  std::string design{};
37 
39  bool operator<(const MdtChamber& other) const {
40  return id < other.id;
41  }
42 
44  Amg::Transform3D geoModelTransform{Amg::Transform3D::Identity()};
46  Amg::Transform3D alignableTransform{Amg::Transform3D::Identity()};
48  unsigned int numLayers{0};
50  unsigned int numTubes{0};
52  double tubePitch{0.};
54  double tubeRadius{0.};
55 
56 
59  unsigned int layerNum{0};
61  unsigned int tubeNum{0};
63  Amg::Transform3D localToGlobal{Amg::Transform3D::Identity()};
67  double tubeLength{0.};
69  double wireLength{0.};
71  double activeLength{0.};
72  };
73  std::vector<TubePositioning> tubeInfo{};
76  const TubePositioning& getTube (unsigned int layer, unsigned int tube) const{
77  static const TubePositioning dummy{};
78  unsigned int idx = (layer -1)*numTubes + (tube -1);
79  return idx < tubeInfo.size() ? tubeInfo[idx] : dummy;
80  }
81  void insertTube(TubePositioning&& newTube) {
82  unsigned int idx = (newTube.layerNum - 1)*numTubes + (newTube.tubeNum -1);
83  if (tubeInfo.size() <= idx) tubeInfo.resize(idx+1);
84  tubeInfo[idx] = std::move(newTube);
85  }
86 };
87 
88 
91 std::ostream& operator<<(std::ostream& ostr, const MdtChamber& chamb) {
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 }
104 
105 constexpr double tolerance = 10 * Gaudi::Units::micrometer;
106 
107 #define TEST_BASICPROP(attribute, propName) \
108  if (std::abs(1.*test.attribute - 1.*reference.attribute) > tolerance) { \
109  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": "<<test \
110  <<" differs w.r.t "<<propName<<" "<< reference.attribute \
111  <<" (ref) vs. " <<test.attribute << " (test)" << std::endl; \
112  chamberOkay = false; \
113  }
114 
115 #define TEST_TUBEPROP(attribute, propName) \
116  if (std::abs(1.*refTube.attribute - 1.*testTube.attribute) > tolerance) { \
117  std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": In "<<test<<" the tubes (" \
118  <<layer<<","<<std::setfill('0')<<std::setw(3)<<tube<<")" \
119  <<" differ w.r.t "<<propName<<". " \
120  << refTube.attribute <<" (ref) vs. " <<testTube.attribute \
121  << " (test)" << std::endl; \
122  chamberOkay = false; \
123  }
124 
125 std::set<MdtChamber> readTreeDump(const std::string& inputFile) {
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 }
245 
246 int main( int argc, char** argv ) {
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 }
381 
382 
TEST_TUBEPROP
#define TEST_TUBEPROP(attribute, propName)
Definition: runMdtGeoComparison.cxx:115
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
main
int main(int argc, char **argv)
Definition: runMdtGeoComparison.cxx:246
MdtCablingOffData::stationIndex
int8_t & stationIndex
Definition: MdtCablingData.h:26
makeTOC.inFile
string inFile
Definition: makeTOC.py:5
MdtCablingData.h
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
MuonGMR4
A muon chamber is a collection of readout elements belonging to the same station.
Definition: ChamberAssembleTool.h:16
MdtCablingOffData
Split the offline part of the cabling apart to use it later for sorting.
Definition: MdtCablingData.h:16
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
MdtChamber::getTube
const TubePositioning & getTube(unsigned int layer, unsigned int tube) const
Returns the access to the full tube information Layer : (1 -nLayers), Tube : (1-nTubes)
Definition: runMdtGeoComparison.cxx:76
python.xAODType.dummy
dummy
Definition: xAODType.py:4
python.SystemOfUnits.micrometer
int micrometer
Definition: SystemOfUnits.py:71
DQHistogramMergeRegExp.argc
argc
Definition: DQHistogramMergeRegExp.py:20
MdtChamber::MdtChamber
MdtChamber()=default
Default constructor.
starts_with.h
C++20-like starts_with/ends_with for strings.
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
PathResolver.h
HI::TowerBins::numLayers
constexpr unsigned int numLayers()
Definition: HIEventDefs.h:23
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MdtChamber::insertTube
void insertTube(TubePositioning &&newTube)
Definition: runMdtGeoComparison.cxx:81
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
Amg::RotationMatrix3D
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
Definition: GeoPrimitives.h:49
GeoPrimitivesHelpers.h
GeoPrimitivesToStringConverter.h
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
MuonDetectorDefs.h
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:34
tubeLength
double tubeLength
Definition: MDT_ResponseTest.cxx:32
CscCalibQuery.testFile
testFile
Definition: CscCalibQuery.py:274
MdtChamber::operator<
bool operator<(const MdtChamber &other) const
Sorting operator to insert the object into std::set.
Definition: runMdtGeoComparison.cxx:39
MuonGMR4::operator<<
std::ostream & operator<<(std::ostream &ostr, const CutOutArea &cut)
Definition: CutOutArea.h:23
calibdata.tube
tube
Definition: calibdata.py:31
MdtChamber::design
std::string design
Definition: runMdtGeoComparison.cxx:36
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
MdtChamber
Helper struct to represent a full Mdt chamber.
Definition: runMdtGeoComparison.cxx:29