132 std::set<MdtChamber> to_ret{};
133 std::cout<<
"Read the Mdt geometry tree dump from "<<inputFile<<std::endl;
134 std::unique_ptr<TFile> inFile{TFile::Open(inputFile.c_str())};
135 if (!inFile || !inFile->IsOpen()) {
136 std::cerr<<__FILE__<<
":"<<__LINE__<<
" Failed to open "<<inputFile<<std::endl;
139 TTreeReader treeReader(
"MdtGeoModelTree", inFile.get());
140 if (treeReader.IsInvalid()){
141 std::cerr<<__FILE__<<
":"<<__LINE__<<
" The file "<<inputFile<<
" does not contain the 'MdtGeoModelTree'"<<std::endl;
145 TTreeReaderValue<unsigned short> stationIndex{treeReader,
"stationIndex"};
146 TTreeReaderValue<short> stationEta{treeReader,
"stationEta"};
147 TTreeReaderValue<short> stationPhi{treeReader,
"stationPhi"};
148 TTreeReaderValue<short> stationML{treeReader,
"stationMultiLayer"};
149 TTreeReaderValue<std::string> chamberDesign{treeReader,
"chamberDesign"};
151 TTreeReaderValue<double> tubeRadius{treeReader,
"tubeRadius"};
152 TTreeReaderValue<double> tubePitch{treeReader,
"tubePitch"};
153 TTreeReaderValue<unsigned short> numTubes{treeReader,
"numTubes"};
154 TTreeReaderValue<unsigned short> numLayers{treeReader,
"numLayers"};
156 TTreeReaderValue<std::vector<float>> geoModelTransformX{treeReader,
"GeoModelTransformX"};
157 TTreeReaderValue<std::vector<float>> geoModelTransformY{treeReader,
"GeoModelTransformY"};
158 TTreeReaderValue<std::vector<float>> geoModelTransformZ{treeReader,
"GeoModelTransformZ"};
160 TTreeReaderValue<std::vector<float>> alignableNodeX{treeReader,
"AlignableNodeX"};
161 TTreeReaderValue<std::vector<float>> alignableNodeY{treeReader,
"AlignableNodeY"};
162 TTreeReaderValue<std::vector<float>> alignableNodeZ{treeReader,
"AlignableNodeZ"};
166 TTreeReaderValue<std::vector<unsigned short>> tubeLayer{treeReader,
"tubeLayer"};
167 TTreeReaderValue<std::vector<unsigned short>> tubeNumber{treeReader,
"tubeNumber"};
169 TTreeReaderValue<std::vector<double>>
tubeLength{treeReader,
"tubeLength"};
170 TTreeReaderValue<std::vector<double>> activeTubeLength{treeReader,
"activeTubeLength"};
171 TTreeReaderValue<std::vector<double>> wireLength{treeReader,
"wireLength"};
173 TTreeReaderValue<std::vector<float>> tubeTransformTransX{treeReader,
"tubeTransformTranslationX"};
174 TTreeReaderValue<std::vector<float>> tubeTransformTransY{treeReader,
"tubeTransformTranslationY"};
175 TTreeReaderValue<std::vector<float>> tubeTransformTransZ{treeReader,
"tubeTransformTranslationZ"};
177 TTreeReaderValue<std::vector<float>> tubeTransformCol0Theta{treeReader,
"tubeTransformLinearCol0Theta"};
178 TTreeReaderValue<std::vector<float>> tubeTransformCol0Phi{treeReader,
"tubeTransformLinearCol0Phi"};
180 TTreeReaderValue<std::vector<float>> tubeTransformCol1Theta{treeReader,
"tubeTransformLinearCol1Theta"};
181 TTreeReaderValue<std::vector<float>> tubeTransformCol1Phi{treeReader,
"tubeTransformLinearCol1Phi"};
183 TTreeReaderValue<std::vector<float>> tubeTransformCol2Theta{treeReader,
"tubeTransformLinearCol2Theta"};
184 TTreeReaderValue<std::vector<float>> tubeTransformCol2Phi{treeReader,
"tubeTransformLinearCol2Phi"};
186 TTreeReaderValue<std::vector<float>> readOutPosX{treeReader,
"readOutPosX"};
187 TTreeReaderValue<std::vector<float>> readOutPosY{treeReader,
"readOutPosY"};
188 TTreeReaderValue<std::vector<float>> readOutPosZ{treeReader,
"readOutPosZ"};
190 while (treeReader.Next()) {
194 newchamber.
id.
eta = (*stationEta);
195 newchamber.
id.
phi = (*stationPhi);
197 newchamber.
design = (*chamberDesign);
206 geoRot.col(0) =
Amg::Vector3D((*geoModelTransformX)[1], (*geoModelTransformY)[1], (*geoModelTransformZ)[1]);
207 geoRot.col(1) =
Amg::Vector3D((*geoModelTransformX)[2], (*geoModelTransformY)[2], (*geoModelTransformZ)[2]);
208 geoRot.col(2) =
Amg::Vector3D((*geoModelTransformX)[3], (*geoModelTransformY)[3], (*geoModelTransformZ)[3]);
209 Amg::Vector3D geoTrans{(*geoModelTransformX)[0], (*geoModelTransformY)[0], (*geoModelTransformZ)[0]};
212 geoRot.col(0) =
Amg::Vector3D((*alignableNodeX)[1], (*alignableNodeY)[1], (*alignableNodeZ)[1]);
213 geoRot.col(1) =
Amg::Vector3D((*alignableNodeX)[2], (*alignableNodeY)[2], (*alignableNodeZ)[2]);
214 geoRot.col(2) =
Amg::Vector3D((*alignableNodeX)[3], (*alignableNodeY)[3], (*alignableNodeZ)[3]);
215 geoTrans =
Amg::Vector3D{(*alignableNodeX)[0], (*alignableNodeY)[0], (*alignableNodeZ)[0]};
220 for (
size_t t = 0; t < tubeLayer->size(); ++t){
222 TubePositioning newTube{};
224 newTube.tubeNum = (*tubeNumber)[t];
225 newTube.tubeLength = (*tubeLength)[t];
226 newTube.wireLength = (*wireLength)[t];
228 tubeRot.col(0) =
makeDir((*tubeTransformCol0Theta)[t], (*tubeTransformCol0Phi)[t]);
229 tubeRot.col(1) =
makeDir((*tubeTransformCol1Theta)[t], (*tubeTransformCol1Phi)[t]);
230 tubeRot.col(2) =
makeDir((*tubeTransformCol2Theta)[t], (*tubeTransformCol2Phi)[t]);
231 Amg::Vector3D tubeTrans{(*tubeTransformTransX)[t],(*tubeTransformTransY)[t], (*tubeTransformTransZ)[t]};
233 newTube.readoutPos =
Amg::Vector3D{(*readOutPosX)[t],(*readOutPosY)[t],(*readOutPosZ)[t]};
237 auto insert_itr = to_ret.insert(std::move(newchamber));
238 if (!insert_itr.second) {
239 std::stringstream err{};
240 err<<__FILE__<<
":"<<__LINE__<<
" The chamber "<<(*insert_itr.first).
id
241 <<
" has already been inserted. "<<std::endl;
242 throw std::runtime_error(err.str());
245 std::cout<<
"File parsing is finished. Found in total "<<to_ret.size()<<
" readout element dumps "<<std::endl;
250 std::string refFile{}, testFile{};
252 for (
int arg = 1; arg < argc; ++arg) {
253 std::string the_arg{argv[arg]};
254 if (the_arg ==
"--refFile" && arg +1 < argc) {
255 refFile = std::string{argv[arg+1]};
257 }
else if (the_arg ==
"--testFile" && arg + 1 < argc) {
258 testFile = std::string{argv[arg+1]};
262 if (refFile.empty()) {
263 std::cerr<<
"Please parse the path of the reference file via --refFile "<<std::endl;
266 if (testFile.empty()) {
267 std::cerr<<
"Please parse the path of the test file via --testFile "<<std::endl;
274 std::set<MdtChamber> refChambers =
readTreeDump(refFile);
275 if (refChambers.empty()) {
276 std::cerr<<
"The file "<<refFile<<
" should contain at least one chamber "<<std::endl;
279 std::set<MdtChamber> testChambers =
readTreeDump(testFile);
280 if (testChambers.empty()) {
281 std::cerr<<
"The file "<<testFile<<
" should contain at least one chamber "<<std::endl;
284 int return_code = EXIT_SUCCESS;
285 unsigned int goodChamb{0};
288 std::set<MdtChamber>::const_iterator test_itr = testChambers.find(
reference);
290 if (test_itr == testChambers.end()) {
291 std::cerr<<
"The chamber "<<
reference<<
" is not part of the testing "<<std::endl;
292 return_code = EXIT_FAILURE;
295 bool chamberOkay =
true;
308 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": The chamber coordinate systems rotate differently for "
311 <<
" --- testTrf: "<<
Amg::toString(test.geoModelTransform)<<std::endl;
316 if (distortion.translation().mag() >
tolerance) {
317 std::cout<<
"The origins of the chamber coordinate systems are not exactly at the same point for "
321 bool stagFailure{
false}, alignFailure{
false}, readoutOrient{
false};
322 for (
unsigned int layer = 1; layer<= std::min(
reference.numLayers, test.numLayers) ; ++layer) {
323 for (
unsigned int tube = 1; tube <= std::min(
reference.numTubes, test.numTubes); ++tube) {
325 const TubePositioning& refTube =
reference.getTube(layer, tube);
326 const TubePositioning& testTube = test.getTube(layer, tube);
327 const Amg::Transform3D tubeDistortion = testTube.localToGlobal.inverse() * refTube.localToGlobal;
331 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": In chamber "<<
reference<<
" the tube reference systems for ("<<layer<<
", "
332 <<std::setfill(
'0')<<std::setw(3)<<tube<<
") are not exactly aligned. "<<GeoTrf::toString(tubeDistortion)<<std::endl;
337 if (!stagFailure && tubeDistortion.translation().perp() >
tolerance) {
338 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": Misplaced staggering found in "<<
reference<<
" the tube ("<<layer
339 <<
", "<<std::setfill(
'0')<<std::setw(3)<<tube<<
") "
340 <<
Amg::toString(tubeDistortion.translation(), 3)<<
", mag: "<<tubeDistortion.translation().mag()<<
341 ", perp: "<<tubeDistortion.translation().perp()<<std::endl;
342 if (tube > 1) stagFailure =
true;
350 if (alignFailure || readoutOrient)
continue;
355 if (refRO.z()* testRO.z() < 0.){
356 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": The readout is on different sites for chamber: "<<
reference<<
357 ", layer "<<layer<<
", tube: "<<std::setfill(
'0')<<std::setw(3)<<tube<<
". "
359 readoutOrient =
true;
362 if (stagFailure || alignFailure) {
367 return_code = EXIT_FAILURE;
372 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": The alignable nodes are at differnt places for "
373 <<test<<
". " <<GeoTrf::toString(alignableDistort,
true)<<
" chamber length: "<<
378 std::cout<<
"runMdtGeoComparision() "<<__LINE__<<
": Found perfect agreement between new & old geometry for "<<
reference<<std::endl;
383 if (!refChambers.count(test)) {
384 std::cerr<<
"runMdtGeoComparision() "<<__LINE__<<
": "<<test<<
" is only in the test set."<<std::endl;
385 return_code = EXIT_FAILURE;
388 std::cout<<
"runMdtGeoComparision() "<<__LINE__<<
": "<<goodChamb<<
"/"<<refChambers.size()<<
" chambers are in perfect agreement. "<<std::endl;