17 for (
size_t iStation = 0; iStation < transform_stack.size(); ++iStation)
19 cout <<
" iStation[" << iStation <<
"]:\n";
21 for(
size_t iModule = 0; iModule < transform_stack[iStation].size(); ++iModule) {
22 cout <<
" iModule[" << iModule <<
"]:\n";
24 for(
size_t iTransform = 0; iTransform < transform_stack[iStation][iModule].size(); ++iTransform) {
25 cout <<
" iTransform[" << iTransform <<
"]:\n";
27 Transform3D transform = transform_stack[iStation][iModule][iTransform];
29 Rotation3D rotation = transform.Rotation();
30 Translation3D translation = transform.Translation();
32 Double_t xx, xy, xz, yx, yy, yz, zx, zy, zz;
35 rotation.GetComponents(xx, xy, xz, yx, yy, yz, zx, zy, zz);
36 translation.GetComponents(dx, dy, dz);
38 cout <<
" xx = " << xx <<
"\n";
39 cout <<
" xy = " << xy <<
"\n";
40 cout <<
" xz = " << xz <<
"\n";
42 cout <<
" yx = " << yx <<
"\n";
43 cout <<
" yy = " << yy <<
"\n";
44 cout <<
" yz = " << yz <<
"\n";
46 cout <<
" zx = " << zx <<
"\n";
47 cout <<
" zy = " << zy <<
"\n";
48 cout <<
" zz = " << zz <<
"\n";
50 cout <<
" dx = " << dx <<
"\n";
51 cout <<
" dy = " << dy <<
"\n";
52 cout <<
" dz = " << dz <<
"\n";
54 Double_t traceR = xx + yy + zz;
56 Double_t theta = TMath::ACos((traceR-1)*0.5)*TMath::RadToDeg();
58 cout <<
"theta = " << theta <<
"\n";
60 Double_t cosToX = xx/TMath::Sqrt(xx*xx + yx*yx + zx*zx);
61 Double_t angleXdeg = TMath::ACos(cosToX)*TMath::RadToDeg();
62 cout <<
"angleXdeg = " << angleXdeg <<
"\n";
64 Double_t cosToY = yy/TMath::Sqrt(xy*xy + yy*yy + zy*zy);
65 Double_t angleYdeg = TMath::ACos(cosToY)*TMath::RadToDeg();
66 cout <<
"angleYdeg = " << angleYdeg <<
"\n";
68 Double_t cosToZ = zz/TMath::Sqrt(xz*xz + yz*yz + zz*zz);
69 Double_t angleZdeg = TMath::ACos(cosToZ)*TMath::RadToDeg();
70 cout <<
"angleZdeg = " << angleZdeg <<
"\n";
73 Plane3D::Vector vec1(xx, yx, zx);
74 Plane3D::Vector vec2(xy, yy, zy);
75 Plane3D::Vector vec3(xz, yz, zz);
77 cout <<
"vec1.Theta() = " << vec1.Theta()*TMath::RadToDeg() <<
"\n";
78 cout <<
"vec2.Theta() = " << vec2.Theta()*TMath::RadToDeg() <<
"\n";
79 cout <<
"vec3.Theta() = " << vec3.Theta()*TMath::RadToDeg() <<
"\n";
81 cout <<
"vec1.Mag2() = " << vec1.Mag2() <<
"\n";
82 cout <<
"vec2.Mag2() = " << vec2.Mag2() <<
"\n";
83 cout <<
"vec3.Mag2() = " << vec3.Mag2() <<
"\n";
96 Bool_t testVerboseOut =
false;
101 TDOMParser *parser =
new TDOMParser();
102 parser->SetValidate(
false);
104 Int_t parse_status = parser->ParseFile(xml_config_file);
105 if(parse_status != 0) {
106 std::cerr <<
"Error: An error occured when parsing the file! (in BmnSiProfTransform)\n";
110 TXMLNode *stationSet_node = parser->GetXMLDocument()->GetRootNode();
112 if( strcmp(stationSet_node->GetNodeName(),
"StationSet") != 0 ) {
113 std::cerr <<
"Error: Incorrect name of the root element! (in BmnSiProfStationSet)\n";
117 TXMLNode *station_node = stationSet_node->GetChildren();
119 Int_t station_cnt = 0;
120 while(station_node) {
121 if( strcmp(station_node->GetNodeName(),
"Station") == 0 ) {
122 transform_stack.push_back(vector<vector<Transform3D>>());
123 TXMLNode *module_node = station_node->GetChildren();
125 Int_t module_cnt = 0;
127 if( strcmp(module_node->GetNodeName(),
"Module") == 0 ) {
128 transform_stack[station_cnt].push_back(vector<Transform3D>());
129 TXMLNode *transform_node = module_node->GetChildren();
131 Int_t transform_cnt = 0;
132 while(transform_node) {
133 if( strcmp(transform_node->GetNodeName(),
"Transform") == 0 ) {
134 TString rotationOrder =
"ZYX";
135 Double_t xRotationDeg = 0.0;
136 Double_t yRotationDeg = 0.0;
137 Double_t zRotationDeg = 0.0;
138 Double_t xTranslation = 0.0;
139 Double_t yTranslation = 0.0;
140 Double_t zTranslation = 0.0;
143 if( transform_node->HasAttributes() ) {
144 TList *attrList = transform_node->GetAttributes();
146 TIter next(attrList);
148 while ((attr = (TXMLAttr*)next()) !=
nullptr)
150 if( strcmp(attr->GetName(),
"rotOrder") == 0 ) {
151 rotationOrder = attr->GetValue();
153 if( strcmp(attr->GetName(),
"xRotationDeg") == 0 ) {
154 xRotationDeg = atof(attr->GetValue());
156 if( strcmp(attr->GetName(),
"yRotationDeg") == 0 ) {
157 yRotationDeg = atof(attr->GetValue());
159 if( strcmp(attr->GetName(),
"zRotationDeg") == 0 ) {
160 zRotationDeg = atof(attr->GetValue());
162 if( strcmp(attr->GetName(),
"xTranslation") == 0 ) {
163 xTranslation = atof(attr->GetValue());
165 if( strcmp(attr->GetName(),
"yTranslation") == 0 ) {
166 yTranslation = atof(attr->GetValue());
168 if( strcmp(attr->GetName(),
"zTranslation") == 0 ) {
169 zTranslation = atof(attr->GetValue());
175 cout <<
"current_station = " << station_cnt <<
"\n";
176 cout <<
" current_module = " << module_cnt <<
"\n";
177 cout <<
" current_transform = " << transform_cnt <<
"\n";
178 cout <<
" rotationOrder = " << rotationOrder <<
"\n";
179 cout <<
" xRotationDeg = " << xRotationDeg <<
"\n";
180 cout <<
" yRotationDeg = " << yRotationDeg <<
"\n";
181 cout <<
" zRotationDeg = " << zRotationDeg <<
"\n";
182 cout <<
" xTranslation = " << xTranslation <<
"\n";
183 cout <<
" yTranslation = " << yTranslation <<
"\n";
184 cout <<
" zTranslation = " << zTranslation <<
"\n";
188 RotationX rotX(xRotationDeg*TMath::DegToRad());
189 RotationY rotY(yRotationDeg*TMath::DegToRad());
190 RotationZ rotZ(zRotationDeg*TMath::DegToRad());
194 for(Int_t iaxis = 0; iaxis < rotationOrder.Sizeof(); ++iaxis) {
195 if(rotationOrder[iaxis] ==
'X' || rotationOrder[iaxis] ==
'x') rotation *= rotX;
196 if(rotationOrder[iaxis] ==
'Y' || rotationOrder[iaxis] ==
'y') rotation *= rotY;
197 if(rotationOrder[iaxis] ==
'Z' || rotationOrder[iaxis] ==
'z') rotation *= rotZ;
201 Translation3D translation(xTranslation, yTranslation, zTranslation);
202 Transform3D transform(rotation, translation);
205 transform_stack[station_cnt][module_cnt].push_back(transform);
209 transform_node = transform_node->GetNextNode();
213 module_node = module_node->GetNextNode();
217 station_node = station_node->GetNextNode();