125 std::set<MdtChamber> to_ret{};
126 std::cout<<
"Read the Mdt geometry tree dump from "<<inputFile<<std::endl;
127 std::unique_ptr<TFile> inFile{TFile::Open(inputFile.c_str())};
128 if (!inFile || !inFile->IsOpen()) {
129 std::cerr<<__FILE__<<
":"<<__LINE__<<
" Failed to open "<<inputFile<<std::endl;
132 TTreeReader treeReader(
"MdtGeoModelTree", inFile.get());
133 if (treeReader.IsInvalid()){
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"};
147 TTreeReaderValue<unsigned short> numLayers{treeReader,
"numLayers"};
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"};
162 TTreeReaderValue<std::vector<double>>
tubeLength{treeReader,
"tubeLength"};
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"};
186 while (treeReader.Next()) {
190 newchamber.
id.
eta = (*stationEta);
191 newchamber.
id.
phi = (*stationPhi);
193 newchamber.
design = (*chamberDesign);
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]};
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;
245int main(
int argc,
char** argv ) {
246 std::string refFile{}, testFile{};
248 for (
int arg = 1; arg < argc; ++arg) {
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) {
254 testFile = std::string{argv[arg+1]};
258 if (refFile.empty()) {
259 std::cerr<<
"Please parse the path of the reference file via --refFile "<<std::endl;
262 if (testFile.empty()) {
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;
275 std::set<MdtChamber> testChambers =
readTreeDump(testFile);
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 "
307 <<
" --- testTrf: "<<
Amg::toString(test.geoModelTransform)<<std::endl;
312 if (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};
318 for (
unsigned int layer = 1; layer<= std::min(
reference.numLayers, test.numLayers) ; ++layer) {
319 for (
unsigned int tube = 1; tube <= std::min(
reference.numTubes, test.numTubes); ++tube) {
321 const TubePositioning& refTube =
reference.getTube(layer, tube);
322 const TubePositioning& testTube = test.getTube(layer, tube);
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 "
369 <<test<<
". " <<GeoTrf::toString(alignableDistort,
true)<<
" chamber length: "<<
374 std::cout<<
"runMdtGeoComparision() "<<__LINE__<<
": Found perfect agreement between new & old geometry for "<<
reference<<std::endl;
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;