15 for (
size_t iStation = 0; iStation < transform_stack.size(); ++iStation) {
16 cout <<
" iStation[" << iStation <<
"]:\n";
18 for (
size_t iModule = 0; iModule < transform_stack[iStation].size(); ++iModule) {
19 cout <<
" iModule[" << iModule <<
"]:\n";
21 for (
size_t iTransform = 0; iTransform < transform_stack[iStation][iModule].size(); ++iTransform) {
22 cout <<
" iTransform[" << iTransform <<
"]:\n";
24 Transform3D transform = transform_stack[iStation][iModule][iTransform];
26 Rotation3D rotation = transform.Rotation();
27 Translation3D translation = transform.Translation();
29 Double_t xx, xy, xz, yx, yy, yz, zx, zy, zz;
32 rotation.GetComponents(xx, xy, xz, yx, yy, yz, zx, zy, zz);
33 translation.GetComponents(dx, dy, dz);
35 cout <<
" xx = " << xx <<
"\n";
36 cout <<
" xy = " << xy <<
"\n";
37 cout <<
" xz = " << xz <<
"\n";
39 cout <<
" yx = " << yx <<
"\n";
40 cout <<
" yy = " << yy <<
"\n";
41 cout <<
" yz = " << yz <<
"\n";
43 cout <<
" zx = " << zx <<
"\n";
44 cout <<
" zy = " << zy <<
"\n";
45 cout <<
" zz = " << zz <<
"\n";
47 cout <<
" dx = " << dx <<
"\n";
48 cout <<
" dy = " << dy <<
"\n";
49 cout <<
" dz = " << dz <<
"\n";
51 Double_t traceR = xx + yy + zz;
53 Double_t theta = TMath::ACos((traceR - 1) * 0.5) * TMath::RadToDeg();
55 cout <<
"theta = " << theta <<
"\n";
57 Double_t cosToX = xx / TMath::Sqrt(xx * xx + yx * yx + zx * zx);
58 Double_t angleXdeg = TMath::ACos(cosToX) * TMath::RadToDeg();
59 cout <<
"angleXdeg = " << angleXdeg <<
"\n";
61 Double_t cosToY = yy / TMath::Sqrt(xy * xy + yy * yy + zy * zy);
62 Double_t angleYdeg = TMath::ACos(cosToY) * TMath::RadToDeg();
63 cout <<
"angleYdeg = " << angleYdeg <<
"\n";
65 Double_t cosToZ = zz / TMath::Sqrt(xz * xz + yz * yz + zz * zz);
66 Double_t angleZdeg = TMath::ACos(cosToZ) * TMath::RadToDeg();
67 cout <<
"angleZdeg = " << angleZdeg <<
"\n";
69 Plane3D::Vector vec1(xx, yx, zx);
70 Plane3D::Vector vec2(xy, yy, zy);
71 Plane3D::Vector vec3(xz, yz, zz);
73 cout <<
"vec1.Theta() = " << vec1.Theta() * TMath::RadToDeg() <<
"\n";
74 cout <<
"vec2.Theta() = " << vec2.Theta() * TMath::RadToDeg() <<
"\n";
75 cout <<
"vec3.Theta() = " << vec3.Theta() * TMath::RadToDeg() <<
"\n";
77 cout <<
"vec1.Mag2() = " << vec1.Mag2() <<
"\n";
78 cout <<
"vec2.Mag2() = " << vec2.Mag2() <<
"\n";
79 cout <<
"vec3.Mag2() = " << vec3.Mag2() <<
"\n";
94 Bool_t testVerboseOut =
false;
99 TDOMParser* parser =
new TDOMParser();
100 parser->SetValidate(
false);
102 Int_t parse_status = parser->ParseFile(xml_config_file);
103 if (parse_status != 0) {
104 std::cerr <<
"Error: An error occured when parsing the file! (in BmnGemStripTransform)\n";
108 TXMLNode* stationSet_node = parser->GetXMLDocument()->GetRootNode();
110 if (strcmp(stationSet_node->GetNodeName(),
"StationSet") != 0) {
111 std::cerr <<
"Error: Incorrect name of the root element! (in BmnGemStripStationSet)\n";
115 TXMLNode* station_node = stationSet_node->GetChildren();
117 Int_t station_cnt = 0;
118 while (station_node) {
119 if (strcmp(station_node->GetNodeName(),
"Station") == 0) {
120 transform_stack.push_back(vector<vector<Transform3D>>());
121 TXMLNode* module_node = station_node->GetChildren();
123 Int_t module_cnt = 0;
124 while (module_node) {
125 if (strcmp(module_node->GetNodeName(),
"Module") == 0) {
126 transform_stack[station_cnt].push_back(vector<Transform3D>());
127 TXMLNode* transform_node = module_node->GetChildren();
129 Int_t transform_cnt = 0;
130 while (transform_node) {
131 if (strcmp(transform_node->GetNodeName(),
"Transform") == 0) {
132 TString rotationOrder =
"ZYX";
133 Double_t xRotationDeg = 0.0;
134 Double_t yRotationDeg = 0.0;
135 Double_t zRotationDeg = 0.0;
136 Double_t xTranslation = 0.0;
137 Double_t yTranslation = 0.0;
138 Double_t zTranslation = 0.0;
141 if (transform_node->HasAttributes()) {
142 TList* attrList = transform_node->GetAttributes();
144 TIter next(attrList);
146 while ((attr = (TXMLAttr*)next()) !=
nullptr) {
147 if (strcmp(attr->GetName(),
"rotOrder") == 0) {
148 rotationOrder = attr->GetValue();
150 if (strcmp(attr->GetName(),
"xRotationDeg") == 0) {
151 xRotationDeg = atof(attr->GetValue());
153 if (strcmp(attr->GetName(),
"yRotationDeg") == 0) {
154 yRotationDeg = atof(attr->GetValue());
156 if (strcmp(attr->GetName(),
"zRotationDeg") == 0) {
157 zRotationDeg = atof(attr->GetValue());
159 if (strcmp(attr->GetName(),
"xTranslation") == 0) {
160 xTranslation = atof(attr->GetValue());
162 if (strcmp(attr->GetName(),
"yTranslation") == 0) {
163 yTranslation = atof(attr->GetValue());
165 if (strcmp(attr->GetName(),
"zTranslation") == 0) {
166 zTranslation = atof(attr->GetValue());
171 if (testVerboseOut) {
172 cout <<
"current_station = " << station_cnt <<
"\n";
173 cout <<
" current_module = " << module_cnt <<
"\n";
174 cout <<
" current_transform = " << transform_cnt <<
"\n";
175 cout <<
" rotationOrder = " << rotationOrder <<
"\n";
176 cout <<
" xRotationDeg = " << xRotationDeg <<
"\n";
177 cout <<
" yRotationDeg = " << yRotationDeg <<
"\n";
178 cout <<
" zRotationDeg = " << zRotationDeg <<
"\n";
179 cout <<
" xTranslation = " << xTranslation <<
"\n";
180 cout <<
" yTranslation = " << yTranslation <<
"\n";
181 cout <<
" zTranslation = " << zTranslation <<
"\n";
185 RotationX rotX(xRotationDeg * TMath::DegToRad());
186 RotationY rotY(yRotationDeg * TMath::DegToRad());
187 RotationZ rotZ(zRotationDeg * TMath::DegToRad());
191 for (Int_t iaxis = 0; iaxis < rotationOrder.Sizeof(); ++iaxis) {
192 if (rotationOrder[iaxis] ==
'X' || rotationOrder[iaxis] ==
'x')
194 if (rotationOrder[iaxis] ==
'Y' || rotationOrder[iaxis] ==
'y')
196 if (rotationOrder[iaxis] ==
'Z' || rotationOrder[iaxis] ==
'z')
200 Translation3D translation(xTranslation, yTranslation, zTranslation);
201 Transform3D transform(rotation, translation);
204 transform_stack[station_cnt][module_cnt].push_back(transform);
208 transform_node = transform_node->GetNextNode();
212 module_node = module_node->GetNextNode();
216 station_node = station_node->GetNextNode();