14 #include "GeoModelHelpers/TransformToStringConverter.h"
17 #include <GaudiKernel/SystemOfUnits.h>
23 #include <TTreeReader.h>
49 unsigned int numTubes{0};
53 double tubeRadius{0.};
58 unsigned int layerNum{0};
60 unsigned int tubeNum{0};
68 double wireLength{0.};
70 double activeLength{0.};
72 std::vector<TubePositioning> tubeInfo{};
78 return idx < tubeInfo.size() ? tubeInfo[
idx] :
dummy;
81 unsigned int idx = (newTube.layerNum - 1)*numTubes + (newTube.tubeNum -1);
82 if (tubeInfo.size() <=
idx) tubeInfo.resize(
idx+1);
83 tubeInfo[
idx] = std::move(newTube);
91 static const std::map<int, std::string> stationDict{
92 {0,
"BIL"}, {1,
"BIS"}, {7,
"BIR"},
93 {2,
"BML"}, {3,
"BMS"}, {8,
"BMF"}, {53,
"BME"}, {54,
"BMG"}, {52,
"BIM"},
94 {4,
"BOL"}, {5,
"BOS"}, {9,
"BOF"}, {10,
"BOG"},
95 {6,
"BEE"}, {14,
"EEL"}, {15,
"EES"},
96 {13,
"EIL"}, {49,
"EIS"},
97 {17,
"EML"}, {18,
"EMS"},
98 {20,
"EOL"}, {21,
"EOS"}
106 #define TEST_BASICPROP(attribute, propName) \
107 if (std::abs(1.*test.attribute - 1.*reference.attribute) > tolerance) { \
108 std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": "<<test \
109 <<" differs w.r.t "<<propName<<" "<< reference.attribute \
110 <<" (ref) vs. " <<test.attribute << " (test)" << std::endl; \
111 chamberOkay = false; \
114 #define TEST_TUBEPROP(attribute, propName) \
115 if (std::abs(1.*refTube.attribute - 1.*testTube.attribute) > tolerance) { \
116 std::cerr<<"runMdtGeoComparision() "<<__LINE__<<": In "<<test<<" the tubes (" \
117 <<layer<<","<<std::setfill('0')<<std::setw(3)<<tube<<")" \
118 <<" differ w.r.t "<<propName<<". " \
119 << refTube.attribute <<" (ref) vs. " <<testTube.attribute \
120 << " (test)" << std::endl; \
121 chamberOkay = false; \
125 std::set<MdtChamber> to_ret{};
126 std::cout<<
"Read the Mdt geometry tree dump from "<<
inputFile<<std::endl;
129 std::cerr<<__FILE__<<
":"<<__LINE__<<
" Failed to open "<<
inputFile<<std::endl;
134 std::cerr<<__FILE__<<
":"<<__LINE__<<
" The file "<<
inputFile<<
" does not contain the 'MdtGeoModelTree'"<<std::endl;
138 TTreeReaderValue<unsigned short> stationIndex{
treeReader,
"stationIndex"};
139 TTreeReaderValue<short> stationEta{
treeReader,
"stationEta"};
140 TTreeReaderValue<short> stationPhi{
treeReader,
"stationPhi"};
141 TTreeReaderValue<short> stationML{
treeReader,
"stationMultiLayer"};
142 TTreeReaderValue<std::string> chamberDesign{
treeReader,
"chamberDesign"};
144 TTreeReaderValue<double> tubeRadius{
treeReader,
"tubeRadius"};
145 TTreeReaderValue<double> tubePitch{
treeReader,
"tubePitch"};
146 TTreeReaderValue<unsigned short> numTubes{
treeReader,
"numTubes"};
149 TTreeReaderValue<std::vector<float>> geoModelTransformX{
treeReader,
"GeoModelTransformX"};
150 TTreeReaderValue<std::vector<float>> geoModelTransformY{
treeReader,
"GeoModelTransformY"};
151 TTreeReaderValue<std::vector<float>> geoModelTransformZ{
treeReader,
"GeoModelTransformZ"};
153 TTreeReaderValue<std::vector<float>> alignableNodeX{
treeReader,
"AlignableNodeX"};
154 TTreeReaderValue<std::vector<float>> alignableNodeY{
treeReader,
"AlignableNodeY"};
155 TTreeReaderValue<std::vector<float>> alignableNodeZ{
treeReader,
"AlignableNodeZ"};
159 TTreeReaderValue<std::vector<unsigned short>> tubeLayer{
treeReader,
"tubeLayer"};
160 TTreeReaderValue<std::vector<unsigned short>> tubeNumber{
treeReader,
"tubeNumber"};
163 TTreeReaderValue<std::vector<double>> activeTubeLength{
treeReader,
"activeTubeLength"};
164 TTreeReaderValue<std::vector<double>> wireLength{
treeReader,
"wireLength"};
166 TTreeReaderValue<std::vector<float>> tubeTransformTransX{
treeReader,
"tubeTransformTranslationX"};
167 TTreeReaderValue<std::vector<float>> tubeTransformTransY{
treeReader,
"tubeTransformTranslationY"};
168 TTreeReaderValue<std::vector<float>> tubeTransformTransZ{
treeReader,
"tubeTransformTranslationZ"};
170 TTreeReaderValue<std::vector<float>> tubeTransformCol0X{
treeReader,
"tubeTransformLinearCol1X"};
171 TTreeReaderValue<std::vector<float>> tubeTransformCol0Y{
treeReader,
"tubeTransformLinearCol1Y"};
172 TTreeReaderValue<std::vector<float>> tubeTransformCol0Z{
treeReader,
"tubeTransformLinearCol1Z"};
174 TTreeReaderValue<std::vector<float>> tubeTransformCol1X{
treeReader,
"tubeTransformLinearCol2X"};
175 TTreeReaderValue<std::vector<float>> tubeTransformCol1Y{
treeReader,
"tubeTransformLinearCol2Y"};
176 TTreeReaderValue<std::vector<float>> tubeTransformCol1Z{
treeReader,
"tubeTransformLinearCol2Z"};
178 TTreeReaderValue<std::vector<float>> tubeTransformCol2X{
treeReader,
"tubeTransformLinearCol3X"};
179 TTreeReaderValue<std::vector<float>> tubeTransformCol2Y{
treeReader,
"tubeTransformLinearCol3Y"};
180 TTreeReaderValue<std::vector<float>> tubeTransformCol2Z{
treeReader,
"tubeTransformLinearCol3Z"};
182 TTreeReaderValue<std::vector<float>> readOutPosX{
treeReader,
"readOutPosX"};
183 TTreeReaderValue<std::vector<float>> readOutPosY{
treeReader,
"readOutPosY"};
184 TTreeReaderValue<std::vector<float>> readOutPosZ{
treeReader,
"readOutPosZ"};
190 newchamber.id.eta = (*stationEta);
191 newchamber.id.phi = (*stationPhi);
192 newchamber.id.multilayer = (*stationML);
193 newchamber.design = (*chamberDesign);
195 newchamber.tubeRadius = (*tubeRadius);
196 newchamber.tubePitch = (*tubePitch);
198 newchamber.numTubes = (*numTubes);
199 newchamber.numLayers = (*numLayers);
202 geoRot.col(0) =
Amg::Vector3D((*geoModelTransformX)[1], (*geoModelTransformY)[1], (*geoModelTransformZ)[1]);
203 geoRot.col(1) =
Amg::Vector3D((*geoModelTransformX)[2], (*geoModelTransformY)[2], (*geoModelTransformZ)[2]);
204 geoRot.col(2) =
Amg::Vector3D((*geoModelTransformX)[3], (*geoModelTransformY)[3], (*geoModelTransformZ)[3]);
205 Amg::Vector3D geoTrans{(*geoModelTransformX)[0], (*geoModelTransformY)[0], (*geoModelTransformZ)[0]};
208 geoRot.col(0) =
Amg::Vector3D((*alignableNodeX)[1], (*alignableNodeY)[1], (*alignableNodeZ)[1]);
209 geoRot.col(1) =
Amg::Vector3D((*alignableNodeX)[2], (*alignableNodeY)[2], (*alignableNodeZ)[2]);
210 geoRot.col(2) =
Amg::Vector3D((*alignableNodeX)[3], (*alignableNodeY)[3], (*alignableNodeZ)[3]);
211 geoTrans =
Amg::Vector3D{(*alignableNodeX)[0], (*alignableNodeY)[0], (*alignableNodeZ)[0]};
216 for (
size_t t = 0;
t < tubeLayer->size(); ++
t){
218 TubePositioning newTube{};
220 newTube.tubeNum = (*tubeNumber)[
t];
221 newTube.tubeLength = (*tubeLength)[
t];
222 newTube.wireLength = (*wireLength)[
t];
224 tubeRot.col(0) =
Amg::Vector3D((*tubeTransformCol0X)[
t],(*tubeTransformCol0Y)[
t], (*tubeTransformCol0Z)[
t]);
225 tubeRot.col(1) =
Amg::Vector3D((*tubeTransformCol1X)[
t],(*tubeTransformCol1Y)[
t], (*tubeTransformCol1Z)[
t]);
226 tubeRot.col(2) =
Amg::Vector3D((*tubeTransformCol2X)[
t],(*tubeTransformCol2Y)[
t], (*tubeTransformCol2Z)[
t]);
227 Amg::Vector3D tubeTrans{(*tubeTransformTransX)[
t],(*tubeTransformTransY)[
t], (*tubeTransformTransZ)[
t]};
229 newTube.readoutPos =
Amg::Vector3D{(*readOutPosX)[
t],(*readOutPosY)[
t],(*readOutPosZ)[
t]};
230 newchamber.insertTube(std::move(newTube));
233 auto insert_itr = to_ret.insert(std::move(newchamber));
234 if (!insert_itr.second) {
235 std::stringstream
err{};
236 err<<__FILE__<<
":"<<__LINE__<<
" The chamber "<<(*insert_itr.first).
id
237 <<
" has already been inserted. "<<std::endl;
238 throw std::runtime_error(
err.str());
241 std::cout<<
"File parsing is finished. Found in total "<<to_ret.size()<<
" readout element dumps "<<std::endl;
249 std::string the_arg{
argv[
arg]};
250 if (the_arg ==
"--refFile" &&
arg +1 <
argc) {
251 refFile = std::string{
argv[
arg+1]};
253 }
else if (the_arg ==
"--testFile" &&
arg + 1 <
argc) {
258 if (refFile.empty()) {
259 std::cerr<<
"Please parse the path of the reference file via --refFile "<<std::endl;
263 std::cerr<<
"Please parse the path of the test file via --testFile "<<std::endl;
270 std::set<MdtChamber> refChambers =
readTreeDump(refFile);
271 if (refChambers.empty()) {
272 std::cerr<<
"The file "<<refFile<<
" should contain at least one chamber "<<std::endl;
276 if (testChambers.empty()) {
277 std::cerr<<
"The file "<<
testFile<<
" should contain at least one chamber "<<std::endl;
280 int return_code = EXIT_SUCCESS;
281 unsigned int goodChamb{0};
284 std::set<MdtChamber>::const_iterator test_itr = testChambers.find(
reference);
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;
291 bool chamberOkay =
true;
304 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": The chamber coordinate systems rotate differently for "
312 if (
false && distortion.translation().mag() >
tolerance) {
313 std::cout<<
"The origins of the chamber coordinate systems are not exactly at the same point for "
317 bool stagFailure{
false}, alignFailure{
false}, readoutOrient{
false};
323 const Amg::Transform3D tubeDistortion = testTube.localToGlobal.inverse() * refTube.localToGlobal;
327 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": In chamber "<<
reference<<
" the tube reference systems for ("<<
layer<<
", "
328 <<std::setfill(
'0')<<std::setw(3)<<
tube<<
") are not exactly aligned. "<<
GeoTrf::toString(tubeDistortion)<<std::endl;
333 if (!stagFailure && tubeDistortion.translation().perp() >
tolerance) {
334 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": Misplaced staggering found in "<<
reference<<
" the tube ("<<
layer
335 <<
", "<<std::setfill(
'0')<<std::setw(3)<<
tube<<
") "
336 <<
Amg::toString(tubeDistortion.translation(), 3)<<
", mag: "<<tubeDistortion.translation().mag()<<
337 ", perp: "<<tubeDistortion.translation().perp()<<std::endl;
338 if (
tube > 1) stagFailure =
true;
346 if (alignFailure || readoutOrient)
continue;
351 if (refRO.z()* testRO.z() < 0.){
352 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": The readout is on different sites for chamber: "<<
reference<<
353 ", layer "<<
layer<<
", tube: "<<std::setfill(
'0')<<std::setw(3)<<
tube<<
". "
355 readoutOrient =
true;
358 if (stagFailure || alignFailure) {
363 return_code = EXIT_FAILURE;
368 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": The alignable nodes are at differnt places for "
379 if (!refChambers.count(
test)) {
380 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": "<<
test<<
" is only in the test set."<<std::endl;
381 return_code = EXIT_FAILURE;
384 std::cout<<
"runMdtGeoComparision() "<<__LINE__<<
": "<<goodChamb<<
"/"<<refChambers.size()<<
" chambers are in perfect agreement. "<<std::endl;