19 #include "xercesc/parsers/XercesDOMParser.hpp" 20 #include "xercesc/dom/DOM.hpp" 21 #include "xercesc/sax/HandlerBase.hpp" 22 #include "xercesc/util/XMLString.hpp" 23 #include "xercesc/util/PlatformUtils.hpp" 24 #include "xercesc/util/XercesDefs.hpp" 57 dtGeometry_(dtGeometry),
58 cscGeometry_(cscGeometry),
60 dtGeometryIdeal_(dtGeometryIdeal),
61 cscGeometryIdeal_(cscGeometryIdeal),
62 gemGeometryIdeal_(gemGeometryIdeal) {
66 str_name = XMLString::transcode(
"name");
93 str_rawId = XMLString::transcode(
"rawId");
94 str_wheel = XMLString::transcode(
"wheel");
98 str_layer = XMLString::transcode(
"layer");
100 str_ring = XMLString::transcode(
"ring");
104 str_axisx = XMLString::transcode(
"axisx");
105 str_axisy = XMLString::transcode(
"axisy");
106 str_axisz = XMLString::transcode(
"axisz");
107 str_angle = XMLString::transcode(
"angle");
108 str_x = XMLString::transcode(
"x");
109 str_y = XMLString::transcode(
"y");
110 str_z = XMLString::transcode(
"z");
111 str_phix = XMLString::transcode(
"phix");
112 str_phiy = XMLString::transcode(
"phiy");
113 str_phiz = XMLString::transcode(
"phiz");
114 str_alpha = XMLString::transcode(
"alpha");
115 str_beta = XMLString::transcode(
"beta");
116 str_gamma = XMLString::transcode(
"gamma");
117 str_rphi = XMLString::transcode(
"rphi");
118 str_phi = XMLString::transcode(
"phi");
119 str_xx = XMLString::transcode(
"xx");
120 str_xy = XMLString::transcode(
"xy");
121 str_xz = XMLString::transcode(
"xz");
122 str_xa = XMLString::transcode(
"xa");
123 str_xb = XMLString::transcode(
"xb");
124 str_xc = XMLString::transcode(
"xc");
125 str_yy = XMLString::transcode(
"yy");
126 str_yz = XMLString::transcode(
"yz");
127 str_ya = XMLString::transcode(
"ya");
128 str_yb = XMLString::transcode(
"yb");
129 str_yc = XMLString::transcode(
"yc");
130 str_zz = XMLString::transcode(
"zz");
131 str_za = XMLString::transcode(
"za");
132 str_zb = XMLString::transcode(
"zb");
133 str_zc = XMLString::transcode(
"zc");
134 str_aa = XMLString::transcode(
"aa");
135 str_ab = XMLString::transcode(
"ab");
136 str_ac = XMLString::transcode(
"ac");
137 str_bb = XMLString::transcode(
"bb");
138 str_bc = XMLString::transcode(
"bc");
139 str_cc = XMLString::transcode(
"cc");
140 str_none = XMLString::transcode(
"none");
141 str_ideal = XMLString::transcode(
"ideal");
251 for (align::Alignables::const_iterator ali = alignables.begin(); ali != alignables.end(); ++ali) {
261 alignableNavigator[(*ali)->geomDetId().rawId()] = *ali;
270 align::Alignables::const_iterator alignable = alignables.begin();
271 align::Alignables::const_iterator ideal = ideals.begin();
273 while (alignable != alignables.end() && ideal != ideals.end()) {
274 alitoideal[*alignable] = *ideal;
276 fillAliToIdeal(alitoideal, (*alignable)->components(), (*ideal)->components());
282 if (alignable != alignables.end() || ideal != ideals.end()) {
284 <<
"alignable and ideal-alignable trees are out of sync (this should never happen)";
290 std::map<unsigned int, Alignable *> alignableNavigator;
296 std::map<unsigned int, Alignable *> ideal_alignableNavigator;
297 recursiveGetId(ideal_alignableNavigator, ideal_alignableMuon->DTBarrel());
298 recursiveGetId(ideal_alignableNavigator, ideal_alignableMuon->CSCEndcaps());
299 recursiveGetId(ideal_alignableNavigator, ideal_alignableMuon->GEMEndcaps());
303 }
catch (
const XMLException &toCatch) {
304 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw an exception on initialization." << std::endl;
307 XercesDOMParser *
parser =
new XercesDOMParser();
308 parser->setValidationScheme(XercesDOMParser::Val_Always);
310 XERCES_CPP_NAMESPACE::ErrorHandler *errHandler = (XERCES_CPP_NAMESPACE::ErrorHandler *)(
new HandlerBase());
311 parser->setErrorHandler(errHandler);
315 }
catch (
const XMLException &toCatch) {
316 char *message = XMLString::transcode(toCatch.getMessage());
317 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw this exception: " << message << std::endl;
318 }
catch (
const DOMException &toCatch) {
319 char *message = XMLString::transcode(toCatch.msg);
320 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw this exception: " << message << std::endl;
321 }
catch (
const SAXException &toCatch) {
322 char *message = XMLString::transcode(toCatch.getMessage());
323 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw this exception: " << message << std::endl;
326 DOMDocument *
doc =
parser->getDocument();
327 DOMElement *node_MuonAlignment =
doc->getDocumentElement();
331 std::map<Alignable *, Alignable *> alitoideal;
337 std::map<std::string, std::map<Alignable *, bool> > alicollections;
340 if (
collection->getParentNode() == node_MuonAlignment) {
344 if (node_name ==
nullptr) {
345 throw cms::Exception(
"XMLException") <<
"<collection> requires a name attribute" << std::endl;
347 char *ascii_name = XMLString::transcode(node_name->getValue());
351 std::map<Alignable *, bool> aliset;
352 for (
unsigned int j = 0;
j <
children->getLength();
j++) {
355 if (node->getNodeType() == DOMNode::ELEMENT_NODE) {
356 Alignable *ali =
getNode(alignableNavigator, (DOMElement *)(node), alignableObjectId);
357 if (ali ==
nullptr) {
358 throw cms::Exception(
"XMLException") <<
"<collection> must contain only alignables" << std::endl;
365 alicollections[
name] = aliset;
369 for (
unsigned int i = 0;
i < operations->getLength();
i++) {
370 DOMElement *operation = (DOMElement *)(operations->item(
i));
371 if (operation->getParentNode() != node_MuonAlignment) {
372 throw cms::Exception(
"XMLException") <<
"All operations must be top-level elements" << std::endl;
375 DOMNodeList *
children = operation->getChildNodes();
377 std::map<Alignable *, bool> aliset;
378 std::vector<DOMNode *> nodesToRemove;
379 for (
unsigned int j = 0;
j <
children->getLength();
j++) {
382 if (node->getNodeType() == DOMNode::ELEMENT_NODE) {
383 Alignable *ali =
getNode(alignableNavigator, (DOMElement *)(node), alignableObjectId);
384 if (ali !=
nullptr) {
386 nodesToRemove.push_back(node);
390 DOMAttr *node_name = ((DOMElement *)(node))->getAttributeNode(
str_name);
391 if (node_name ==
nullptr) {
392 throw cms::Exception(
"XMLException") <<
"<collection> requires a name attribute" << std::endl;
394 char *ascii_name = XMLString::transcode(node_name->getValue());
398 std::map<std::string, std::map<Alignable *, bool> >::const_iterator alicollections_iter =
399 alicollections.find(
name);
400 if (alicollections_iter == alicollections.end()) {
402 <<
"<collection name=\"" <<
name <<
"\"> hasn't been defined" << std::endl;
405 for (std::map<Alignable *, bool>::const_iterator aliiter = alicollections_iter->second.begin();
406 aliiter != alicollections_iter->second.end();
408 aliset[aliiter->first] =
true;
411 nodesToRemove.push_back(node);
421 for (std::vector<DOMNode *>::const_iterator node = nodesToRemove.begin(); node != nodesToRemove.end(); ++node) {
422 operation->removeChild(*node);
424 children = operation->getChildNodes();
426 for (
unsigned int j = 0;
j <
children->getLength();
j++) {
428 if (node->getNodeType() == DOMNode::ELEMENT_NODE) {
434 do_setape((DOMElement *)(node), aliset, alitoideal);
462 char *message = XMLString::transcode(node->getNodeName());
463 throw cms::Exception(
"XMLException") <<
"Unrecognized operation: \"" << message <<
"\"" << std::endl;
475 delete ideal_alignableMuon;
476 return alignableMuon;
480 const XERCES_CPP_NAMESPACE::DOMElement *node,
521 std::map<unsigned int, Alignable *> &alignableNavigator,
522 const XERCES_CPP_NAMESPACE::DOMElement *node,
524 unsigned int rawId = 0;
526 DOMAttr *node_rawId = node->getAttributeNode(
str_rawId);
527 if (node_rawId !=
nullptr) {
529 rawId = XMLString::parseInt(node_rawId->getValue());
530 }
catch (
const XMLException &toCatch) {
531 throw cms::Exception(
"XMLException") <<
"Value of \"rawId\" must be an integer" << std::endl;
538 DOMAttr *node_wheel = node->getAttributeNode(
str_wheel);
539 if (node_wheel ==
nullptr)
540 throw cms::Exception(
"XMLException") <<
"DT node is missing required \"wheel\" attribute" << std::endl;
542 wheel = XMLString::parseInt(node_wheel->getValue());
543 }
catch (
const XMLException &toCatch) {
544 throw cms::Exception(
"XMLException") <<
"Value of \"wheel\" must be an integer" << std::endl;
548 DOMAttr *node_station = node->getAttributeNode(
str_station);
549 if (node_station ==
nullptr)
550 throw cms::Exception(
"XMLException") <<
"DT node is missing required \"station\" attribute" << std::endl;
552 station = XMLString::parseInt(node_station->getValue());
553 }
catch (
const XMLException &toCatch) {
554 throw cms::Exception(
"XMLException") <<
"Value of \"station\" must be an integer" << std::endl;
558 DOMAttr *node_sector = node->getAttributeNode(
str_sector);
559 if (node_sector ==
nullptr)
560 throw cms::Exception(
"XMLException") <<
"DT node is missing required \"sector\" attribute" << std::endl;
562 sector = XMLString::parseInt(node_sector->getValue());
563 }
catch (
const XMLException &toCatch) {
564 throw cms::Exception(
"XMLException") <<
"Value of \"sector\" must be an integer" << std::endl;
568 DOMAttr *node_superlayer = node->getAttributeNode(
str_superlayer);
569 if (node_superlayer ==
nullptr)
571 <<
"DT node is missing required \"superlayer\" attribute" << std::endl;
573 superlayer = XMLString::parseInt(node_superlayer->getValue());
574 }
catch (
const XMLException &toCatch) {
575 throw cms::Exception(
"XMLException") <<
"Value of \"superlayer\" must be an integer" << std::endl;
579 DOMAttr *node_layer = node->getAttributeNode(
str_layer);
580 if (node_layer ==
nullptr)
581 throw cms::Exception(
"XMLException") <<
"DT node is missing required \"layer\" attribute" << std::endl;
583 layer = XMLString::parseInt(node_layer->getValue());
584 }
catch (
const XMLException &toCatch) {
585 throw cms::Exception(
"XMLException") <<
"Value of \"layer\" must be an integer" << std::endl;
595 rawId = layerId.
rawId();
598 Alignable *ali = alignableNavigator[rawId];
600 throw cms::Exception(
"XMLException") <<
"rawId \"" << rawId <<
"\" is not recognized" << std::endl;
605 if (ali ==
nullptr) {
607 <<
"rawId \"" << rawId <<
"\" is not a " << alignableObjectId.
idToString(structureType) << std::endl;
614 std::map<unsigned int, Alignable *> &alignableNavigator,
615 const XERCES_CPP_NAMESPACE::DOMElement *node,
619 DOMAttr *node_rawId = node->getAttributeNode(
str_rawId);
620 if (node_rawId !=
nullptr) {
622 rawId = XMLString::parseInt(node_rawId->getValue());
623 }
catch (
const XMLException &toCatch) {
624 throw cms::Exception(
"XMLException") <<
"Value of \"rawId\" must be an integer" << std::endl;
630 DOMAttr *node_endcap = node->getAttributeNode(
str_endcap);
631 if (node_endcap ==
nullptr)
632 throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"endcap\" attribute" << std::endl;
634 endcap = XMLString::parseInt(node_endcap->getValue());
635 }
catch (
const XMLException &toCatch) {
636 throw cms::Exception(
"XMLException") <<
"Value of \"endcap\" must be an integer" << std::endl;
642 DOMAttr *node_station = node->getAttributeNode(
str_station);
643 if (node_station ==
nullptr)
644 throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"station\" attribute" << std::endl;
646 station = XMLString::parseInt(node_station->getValue());
647 }
catch (
const XMLException &toCatch) {
648 throw cms::Exception(
"XMLException") <<
"Value of \"station\" must be an integer" << std::endl;
652 DOMAttr *node_ring = node->getAttributeNode(
str_ring);
653 if (node_ring ==
nullptr)
654 throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"ring\" attribute" << std::endl;
656 ring = XMLString::parseInt(node_ring->getValue());
657 }
catch (
const XMLException &toCatch) {
658 throw cms::Exception(
"XMLException") <<
"Value of \"ring\" must be an integer" << std::endl;
662 DOMAttr *node_chamber = node->getAttributeNode(
str_chamber);
663 if (node_chamber ==
nullptr)
664 throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"chamber\" attribute" << std::endl;
666 chamber = XMLString::parseInt(node_chamber->getValue());
667 }
catch (
const XMLException &toCatch) {
668 throw cms::Exception(
"XMLException") <<
"Value of \"chamber\" must be an integer" << std::endl;
672 DOMAttr *node_layer = node->getAttributeNode(
str_layer);
673 if (node_layer ==
nullptr)
674 throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"layer\" attribute" << std::endl;
676 layer = XMLString::parseInt(node_layer->getValue());
677 }
catch (
const XMLException &toCatch) {
678 throw cms::Exception(
"XMLException") <<
"Value of \"layer\" must be an integer" << std::endl;
687 rawId = layerId.
rawId();
690 Alignable *ali = alignableNavigator[rawId];
692 throw cms::Exception(
"XMLException") <<
"rawId \"" << rawId <<
"\" is not recognized" << std::endl;
697 if (ali ==
nullptr) {
699 <<
"rawId \"" << rawId <<
"\" is not a " << alignableObjectId.
idToString(structureType) << std::endl;
706 std::map<unsigned int, Alignable *> &alignableNavigator,
707 const XERCES_CPP_NAMESPACE::DOMElement *node,
711 DOMAttr *node_rawId = node->getAttributeNode(
str_rawId);
712 if (node_rawId !=
nullptr) {
714 rawId = XMLString::parseInt(node_rawId->getValue());
715 }
catch (
const XMLException &toCatch) {
716 throw cms::Exception(
"XMLException") <<
"Value of \"rawId\" must be an integer" << std::endl;
722 DOMAttr *node_endcap = node->getAttributeNode(
str_endcap);
723 if (node_endcap ==
nullptr)
724 throw cms::Exception(
"XMLException") <<
"GEM node is missing required \"endcap\" attribute" << std::endl;
726 endcap = XMLString::parseInt(node_endcap->getValue());
727 }
catch (
const XMLException &toCatch) {
728 throw cms::Exception(
"XMLException") <<
"Value of \"endcap\" must be an integer" << std::endl;
732 DOMAttr *node_station = node->getAttributeNode(
str_station);
733 if (node_station ==
nullptr)
734 throw cms::Exception(
"XMLException") <<
"GEM node is missing required \"station\" attribute" << std::endl;
736 station = XMLString::parseInt(node_station->getValue());
737 }
catch (
const XMLException &toCatch) {
738 throw cms::Exception(
"XMLException") <<
"Value of \"station\" must be an integer" << std::endl;
742 DOMAttr *node_ring = node->getAttributeNode(
str_ring);
743 if (node_ring ==
nullptr)
744 throw cms::Exception(
"XMLException") <<
"GEM node is missing required \"ring\" attribute" << std::endl;
746 ring = XMLString::parseInt(node_ring->getValue());
747 }
catch (
const XMLException &toCatch) {
748 throw cms::Exception(
"XMLException") <<
"Value of \"ring\" must be an integer" << std::endl;
752 DOMAttr *node_superChamber = node->getAttributeNode(
str_chamber);
753 if (node_superChamber ==
nullptr)
755 <<
"GEM node is missing required \"superChamber\" attribute" << std::endl;
757 superChamber = XMLString::parseInt(node_superChamber->getValue());
758 }
catch (
const XMLException &toCatch) {
759 throw cms::Exception(
"XMLException") <<
"Value of \"superChamber\" must be an integer" << std::endl;
766 rawId = chamberId.
rawId();
768 Alignable *ali = alignableNavigator[rawId];
770 throw cms::Exception(
"XMLException") <<
"rawId \"" << rawId <<
"\" is not recognized" << std::endl;
775 if (ali ==
nullptr) {
777 <<
"rawId \"" << rawId <<
"\" is not a " << alignableObjectId.
idToString(structureType) << std::endl;
784 unsigned int len = XMLString::stringLen(
str);
785 char *cstr = XMLString::transcode(
str);
786 std::stringstream errmessage;
787 errmessage <<
"Value of \"" << attribute <<
"\" must be a double, not \"" << cstr <<
"\"" << std::endl;
792 if (cstr[
i] ==
'-') {
795 }
else if (cstr[
i] ==
'+')
800 while (cstr[
i] !=
'.' && cstr[
i] !=
'e' && cstr[
i] !=
'E' &&
i < len) {
801 if (cstr[
i] <
'0' || cstr[
i] >
'9') {
811 if (cstr[
i] ==
'.') {
815 while (cstr[
i] !=
'e' && cstr[
i] !=
'E' &&
i < len) {
816 if (cstr[
i] <
'0' || cstr[
i] >
'9') {
821 output += (cstr[
i] -
'0') * place;
827 if (cstr[
i] ==
'e' || cstr[
i] ==
'E') {
831 bool expminus =
false;
832 if (cstr[
i] ==
'-') {
835 }
else if (cstr[
i] ==
'+')
839 if (cstr[
i] <
'0' || cstr[
i] >
'9') {
863 std::map<Alignable *, bool> &aliset,
864 std::map<Alignable *, Alignable *> &alitoideal)
const {
865 DOMAttr *node_relativeto = node->getAttributeNode(
str_relativeto);
866 if (node_relativeto ==
nullptr)
867 throw cms::Exception(
"XMLException") <<
"<setposition> is missing required \"relativeto\" attribute" << std::endl;
877 char *message = XMLString::transcode(node_relativeto->getValue());
878 throw cms::Exception(
"XMLException") <<
"relativeto must be \"none\", \"ideal\", or \"container\", not \"" 879 << message <<
"\"" << std::endl;
882 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
907 oldrot = oldrot * globalRotation.
transposed();
910 double x = oldpos.
x();
911 double y = oldpos.
y();
912 double z = oldpos.
z();
914 double phix = atan2(oldrot.
yz(), oldrot.
zz());
915 double phiy = asin(-oldrot.
xz());
916 double phiz = atan2(oldrot.
xy(), oldrot.
xx());
919 double alpha = oldEulerAngles(1);
920 double beta = oldEulerAngles(2);
921 double gamma = oldEulerAngles(3);
925 DOMAttr *node_x = node->getAttributeNode(
str_x);
926 DOMAttr *node_y = node->getAttributeNode(
str_y);
927 DOMAttr *node_z = node->getAttributeNode(
str_z);
929 if (node_x !=
nullptr)
931 if (node_y !=
nullptr)
933 if (node_z !=
nullptr)
937 DOMAttr *node_phix = node->getAttributeNode(
str_phix);
938 DOMAttr *node_phiy = node->getAttributeNode(
str_phiy);
939 DOMAttr *node_phiz = node->getAttributeNode(
str_phiz);
940 DOMAttr *node_alpha = node->getAttributeNode(
str_alpha);
941 DOMAttr *node_beta = node->getAttributeNode(
str_beta);
942 DOMAttr *node_gamma = node->getAttributeNode(
str_gamma);
945 bool phixyz = (node_phix !=
nullptr || node_phiy !=
nullptr || node_phiz !=
nullptr);
946 bool alphabetagamma = (node_alpha !=
nullptr || node_beta !=
nullptr || node_gamma !=
nullptr);
947 if (phixyz && alphabetagamma)
949 <<
"<setposition> must either have phix, phiy, and phiz or alpha, beta, and gamma, but not both" << std::endl;
950 if (!phixyz && !alphabetagamma)
951 alphabetagamma =
true;
954 if (node_phix !=
nullptr)
956 if (node_phiy !=
nullptr)
958 if (node_phiz !=
nullptr)
967 rot = rotX * rotY * rotZ;
970 else if (alphabetagamma) {
971 if (node_alpha !=
nullptr)
973 if (node_beta !=
nullptr)
975 if (node_gamma !=
nullptr)
980 eulerAngles(1) =
alpha;
981 eulerAngles(2) =
beta;
982 eulerAngles(3) =
gamma;
1010 if (container !=
nullptr) {
1061 if (survey !=
nullptr) {
1062 matrix6x6 = survey->
errors();
1068 std::map<Alignable *, bool> &aliset,
1069 std::map<Alignable *, Alignable *> &alitoideal)
const {
1070 DOMAttr *node_xx = node->getAttributeNode(
str_xx);
1071 DOMAttr *node_xy = node->getAttributeNode(
str_xy);
1072 DOMAttr *node_xz = node->getAttributeNode(
str_xz);
1073 DOMAttr *node_xa = node->getAttributeNode(
str_xa);
1074 DOMAttr *node_xb = node->getAttributeNode(
str_xb);
1075 DOMAttr *node_xc = node->getAttributeNode(
str_xc);
1076 DOMAttr *node_yy = node->getAttributeNode(
str_yy);
1077 DOMAttr *node_yz = node->getAttributeNode(
str_yz);
1078 DOMAttr *node_ya = node->getAttributeNode(
str_ya);
1079 DOMAttr *node_yb = node->getAttributeNode(
str_yb);
1080 DOMAttr *node_yc = node->getAttributeNode(
str_yc);
1081 DOMAttr *node_zz = node->getAttributeNode(
str_zz);
1082 DOMAttr *node_za = node->getAttributeNode(
str_za);
1083 DOMAttr *node_zb = node->getAttributeNode(
str_zb);
1084 DOMAttr *node_zc = node->getAttributeNode(
str_zc);
1085 DOMAttr *node_aa = node->getAttributeNode(
str_aa);
1086 DOMAttr *node_ab = node->getAttributeNode(
str_ab);
1087 DOMAttr *node_ac = node->getAttributeNode(
str_ac);
1088 DOMAttr *node_bb = node->getAttributeNode(
str_bb);
1089 DOMAttr *node_bc = node->getAttributeNode(
str_bc);
1090 DOMAttr *node_cc = node->getAttributeNode(
str_cc);
1092 if (node_xx ==
nullptr)
1093 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xx\" attribute" << std::endl;
1094 if (node_xy ==
nullptr)
1095 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xy\" attribute" << std::endl;
1096 if (node_xz ==
nullptr)
1097 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xz\" attribute" << std::endl;
1098 if (node_xa ==
nullptr)
1099 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xa\" attribute" << std::endl;
1100 if (node_xb ==
nullptr)
1101 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xb\" attribute" << std::endl;
1102 if (node_xc ==
nullptr)
1103 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xc\" attribute" << std::endl;
1104 if (node_yy ==
nullptr)
1105 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yy\" attribute" << std::endl;
1106 if (node_yz ==
nullptr)
1107 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yz\" attribute" << std::endl;
1108 if (node_ya ==
nullptr)
1109 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"ya\" attribute" << std::endl;
1110 if (node_yb ==
nullptr)
1111 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yb\" attribute" << std::endl;
1112 if (node_yc ==
nullptr)
1113 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yc\" attribute" << std::endl;
1114 if (node_zz ==
nullptr)
1115 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"zz\" attribute" << std::endl;
1116 if (node_za ==
nullptr)
1117 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"za\" attribute" << std::endl;
1118 if (node_zb ==
nullptr)
1119 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"zb\" attribute" << std::endl;
1120 if (node_zc ==
nullptr)
1121 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"zc\" attribute" << std::endl;
1122 if (node_aa ==
nullptr)
1123 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"aa\" attribute" << std::endl;
1124 if (node_ab ==
nullptr)
1125 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"ab\" attribute" << std::endl;
1126 if (node_ac ==
nullptr)
1127 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"ac\" attribute" << std::endl;
1128 if (node_bb ==
nullptr)
1129 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"bb\" attribute" << std::endl;
1130 if (node_bc ==
nullptr)
1131 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"bc\" attribute" << std::endl;
1132 if (node_cc ==
nullptr)
1133 throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"cc\" attribute" << std::endl;
1136 matrix6x6(0, 0) =
parseDouble(node_xx->getValue(),
"xx");
1137 matrix6x6(0, 1) =
parseDouble(node_xy->getValue(),
"xy");
1138 matrix6x6(0, 2) =
parseDouble(node_xz->getValue(),
"xz");
1139 matrix6x6(0, 3) =
parseDouble(node_xa->getValue(),
"xa");
1140 matrix6x6(0, 4) =
parseDouble(node_xb->getValue(),
"xb");
1141 matrix6x6(0, 5) =
parseDouble(node_xc->getValue(),
"xc");
1142 matrix6x6(1, 1) =
parseDouble(node_yy->getValue(),
"yy");
1143 matrix6x6(1, 2) =
parseDouble(node_yz->getValue(),
"yz");
1144 matrix6x6(1, 3) =
parseDouble(node_ya->getValue(),
"ya");
1145 matrix6x6(1, 4) =
parseDouble(node_yb->getValue(),
"yb");
1146 matrix6x6(1, 5) =
parseDouble(node_yc->getValue(),
"yc");
1147 matrix6x6(2, 2) =
parseDouble(node_zz->getValue(),
"zz");
1148 matrix6x6(2, 3) =
parseDouble(node_za->getValue(),
"za");
1149 matrix6x6(2, 4) =
parseDouble(node_zb->getValue(),
"zb");
1150 matrix6x6(2, 5) =
parseDouble(node_zc->getValue(),
"zc");
1151 matrix6x6(3, 3) =
parseDouble(node_aa->getValue(),
"aa");
1152 matrix6x6(3, 4) =
parseDouble(node_ab->getValue(),
"ab");
1153 matrix6x6(3, 5) =
parseDouble(node_ac->getValue(),
"ac");
1154 matrix6x6(4, 4) =
parseDouble(node_bb->getValue(),
"bb");
1155 matrix6x6(4, 5) =
parseDouble(node_bc->getValue(),
"bc");
1156 matrix6x6(5, 5) =
parseDouble(node_cc->getValue(),
"cc");
1158 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1165 std::map<Alignable *, bool> &aliset,
1166 std::map<Alignable *, Alignable *> &alitoideal)
const {
1167 DOMAttr *node_xx = node->getAttributeNode(
str_xx);
1168 DOMAttr *node_xy = node->getAttributeNode(
str_xy);
1169 DOMAttr *node_xz = node->getAttributeNode(
str_xz);
1170 DOMAttr *node_xa = node->getAttributeNode(
str_xa);
1171 DOMAttr *node_xb = node->getAttributeNode(
str_xb);
1172 DOMAttr *node_xc = node->getAttributeNode(
str_xc);
1173 DOMAttr *node_yy = node->getAttributeNode(
str_yy);
1174 DOMAttr *node_yz = node->getAttributeNode(
str_yz);
1175 DOMAttr *node_ya = node->getAttributeNode(
str_ya);
1176 DOMAttr *node_yb = node->getAttributeNode(
str_yb);
1177 DOMAttr *node_yc = node->getAttributeNode(
str_yc);
1178 DOMAttr *node_zz = node->getAttributeNode(
str_zz);
1179 DOMAttr *node_za = node->getAttributeNode(
str_za);
1180 DOMAttr *node_zb = node->getAttributeNode(
str_zb);
1181 DOMAttr *node_zc = node->getAttributeNode(
str_zc);
1182 DOMAttr *node_aa = node->getAttributeNode(
str_aa);
1183 DOMAttr *node_ab = node->getAttributeNode(
str_ab);
1184 DOMAttr *node_ac = node->getAttributeNode(
str_ac);
1185 DOMAttr *node_bb = node->getAttributeNode(
str_bb);
1186 DOMAttr *node_bc = node->getAttributeNode(
str_bc);
1187 DOMAttr *node_cc = node->getAttributeNode(
str_cc);
1189 if (node_xx ==
nullptr)
1190 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xx\" attribute" << std::endl;
1191 if (node_xy ==
nullptr)
1192 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xy\" attribute" << std::endl;
1193 if (node_xz ==
nullptr)
1194 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xz\" attribute" << std::endl;
1195 if (node_xa ==
nullptr)
1196 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xa\" attribute" << std::endl;
1197 if (node_xb ==
nullptr)
1198 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xb\" attribute" << std::endl;
1199 if (node_xc ==
nullptr)
1200 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xc\" attribute" << std::endl;
1201 if (node_yy ==
nullptr)
1202 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yy\" attribute" << std::endl;
1203 if (node_yz ==
nullptr)
1204 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yz\" attribute" << std::endl;
1205 if (node_ya ==
nullptr)
1206 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"ya\" attribute" << std::endl;
1207 if (node_yb ==
nullptr)
1208 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yb\" attribute" << std::endl;
1209 if (node_yc ==
nullptr)
1210 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yc\" attribute" << std::endl;
1211 if (node_zz ==
nullptr)
1212 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"zz\" attribute" << std::endl;
1213 if (node_za ==
nullptr)
1214 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"za\" attribute" << std::endl;
1215 if (node_zb ==
nullptr)
1216 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"zb\" attribute" << std::endl;
1217 if (node_zc ==
nullptr)
1218 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"zc\" attribute" << std::endl;
1219 if (node_aa ==
nullptr)
1220 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"aa\" attribute" << std::endl;
1221 if (node_ab ==
nullptr)
1222 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"ab\" attribute" << std::endl;
1223 if (node_ac ==
nullptr)
1224 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"ac\" attribute" << std::endl;
1225 if (node_bb ==
nullptr)
1226 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"bb\" attribute" << std::endl;
1227 if (node_bc ==
nullptr)
1228 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"bc\" attribute" << std::endl;
1229 if (node_cc ==
nullptr)
1230 throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"cc\" attribute" << std::endl;
1233 matrix6x6(0, 0) =
parseDouble(node_xx->getValue(),
"xx");
1234 matrix6x6(0, 1) =
parseDouble(node_xy->getValue(),
"xy");
1235 matrix6x6(0, 2) =
parseDouble(node_xz->getValue(),
"xz");
1236 matrix6x6(0, 3) =
parseDouble(node_xa->getValue(),
"xa");
1237 matrix6x6(0, 4) =
parseDouble(node_xb->getValue(),
"xb");
1238 matrix6x6(0, 5) =
parseDouble(node_xc->getValue(),
"xc");
1239 matrix6x6(1, 1) =
parseDouble(node_yy->getValue(),
"yy");
1240 matrix6x6(1, 2) =
parseDouble(node_yz->getValue(),
"yz");
1241 matrix6x6(1, 3) =
parseDouble(node_ya->getValue(),
"ya");
1242 matrix6x6(1, 4) =
parseDouble(node_yb->getValue(),
"yb");
1243 matrix6x6(1, 5) =
parseDouble(node_yc->getValue(),
"yc");
1244 matrix6x6(2, 2) =
parseDouble(node_zz->getValue(),
"zz");
1245 matrix6x6(2, 3) =
parseDouble(node_za->getValue(),
"za");
1246 matrix6x6(2, 4) =
parseDouble(node_zb->getValue(),
"zb");
1247 matrix6x6(2, 5) =
parseDouble(node_zc->getValue(),
"zc");
1248 matrix6x6(3, 3) =
parseDouble(node_aa->getValue(),
"aa");
1249 matrix6x6(3, 4) =
parseDouble(node_ab->getValue(),
"ab");
1250 matrix6x6(3, 5) =
parseDouble(node_ac->getValue(),
"ac");
1251 matrix6x6(4, 4) =
parseDouble(node_bb->getValue(),
"bb");
1252 matrix6x6(4, 5) =
parseDouble(node_bc->getValue(),
"bc");
1253 matrix6x6(5, 5) =
parseDouble(node_cc->getValue(),
"cc");
1255 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1262 std::map<Alignable *, bool> &aliset,
1263 std::map<Alignable *, Alignable *> &alitoideal)
const {
1264 DOMAttr *node_x = node->getAttributeNode(
str_x);
1265 DOMAttr *node_y = node->getAttributeNode(
str_y);
1266 DOMAttr *node_z = node->getAttributeNode(
str_z);
1267 if (node_x ==
nullptr)
1268 throw cms::Exception(
"XMLException") <<
"<moveglobal> is missing required \"x\" attribute" << std::endl;
1269 if (node_y ==
nullptr)
1270 throw cms::Exception(
"XMLException") <<
"<moveglobal> is missing required \"y\" attribute" << std::endl;
1271 if (node_z ==
nullptr)
1272 throw cms::Exception(
"XMLException") <<
"<moveglobal> is missing required \"z\" attribute" << std::endl;
1279 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1288 if (survey !=
nullptr) {
1289 matrix6x6 = survey->
errors();
1296 std::map<Alignable *, bool> &aliset,
1297 std::map<Alignable *, Alignable *> &alitoideal)
const {
1298 DOMAttr *node_x = node->getAttributeNode(
str_x);
1299 DOMAttr *node_y = node->getAttributeNode(
str_y);
1300 DOMAttr *node_z = node->getAttributeNode(
str_z);
1301 if (node_x ==
nullptr)
1302 throw cms::Exception(
"XMLException") <<
"<movelocal> is missing required \"x\" attribute" << std::endl;
1303 if (node_y ==
nullptr)
1304 throw cms::Exception(
"XMLException") <<
"<movelocal> is missing required \"y\" attribute" << std::endl;
1305 if (node_z ==
nullptr)
1306 throw cms::Exception(
"XMLException") <<
"<movelocal> is missing required \"z\" attribute" << std::endl;
1313 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1317 ali->
move(globalVector);
1323 if (survey !=
nullptr) {
1324 matrix6x6 = survey->
errors();
1331 std::map<Alignable *, bool> &aliset,
1332 std::map<Alignable *, Alignable *> &alitoideal)
const {
1333 DOMAttr *node_axisx = node->getAttributeNode(
str_axisx);
1334 DOMAttr *node_axisy = node->getAttributeNode(
str_axisy);
1335 DOMAttr *node_axisz = node->getAttributeNode(
str_axisz);
1336 DOMAttr *node_angle = node->getAttributeNode(
str_angle);
1337 if (node_axisx ==
nullptr)
1338 throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"axisx\" attribute" << std::endl;
1339 if (node_axisy ==
nullptr)
1340 throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"axisy\" attribute" << std::endl;
1341 if (node_axisz ==
nullptr)
1342 throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"axisz\" attribute" << std::endl;
1343 if (node_angle ==
nullptr)
1344 throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"angle\" attribute" << std::endl;
1352 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1361 if (survey !=
nullptr) {
1362 matrix6x6 = survey->
errors();
1369 std::map<Alignable *, bool> &aliset,
1370 std::map<Alignable *, Alignable *> &alitoideal)
const {
1371 DOMAttr *node_rphi = node->getAttributeNode(
str_rphi);
1372 DOMAttr *node_phi = node->getAttributeNode(
str_phi);
1373 if (node_rphi ==
nullptr && node_phi ==
nullptr)
1374 throw cms::Exception(
"XMLException") <<
"<rotatebeamline> is missing required \"*phi\" attribute" << std::endl;
1375 if (node_rphi !=
nullptr && node_phi !=
nullptr)
1376 throw cms::Exception(
"XMLException") <<
"<rotatebeamline> can't have both an \"rphi\" and a \"phi\" attribute" 1380 if (node_rphi !=
nullptr) {
1386 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1392 double phi0 =
pos.phi();
1393 double deltaphi =
value;
1394 if (node_rphi !=
nullptr)
1405 if (survey !=
nullptr) {
1406 matrix6x6 = survey->
errors();
1413 std::map<Alignable *, bool> &aliset,
1414 std::map<Alignable *, Alignable *> &alitoideal)
const {
1415 DOMAttr *node_x = node->getAttributeNode(
str_x);
1416 DOMAttr *node_y = node->getAttributeNode(
str_y);
1417 DOMAttr *node_z = node->getAttributeNode(
str_z);
1418 DOMAttr *node_angle = node->getAttributeNode(
str_angle);
1419 if (node_x ==
nullptr)
1420 throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"x\" attribute" << std::endl;
1421 if (node_y ==
nullptr)
1422 throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"y\" attribute" << std::endl;
1423 if (node_z ==
nullptr)
1424 throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"z\" attribute" << std::endl;
1425 if (node_angle ==
nullptr)
1426 throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"angle\" attribute" << std::endl;
1433 for (std::map<Alignable *, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1443 double q1 =
sin(
angle / 2.) * aprime;
1444 double q2 =
sin(
angle / 2.) * bprime;
1445 double q3 =
sin(
angle / 2.) * cprime;
1447 double pos2x = (
q0 *
q0 + q1 * q1 - q2 * q2 - q3 * q3) *
pos.x() + 2. * (q1 * q2 -
q0 * q3) *
pos.y() +
1448 2. * (q1 * q3 +
q0 * q2) *
pos.z();
1449 double pos2y = 2. * (q2 * q1 +
q0 * q3) *
pos.x() + (
q0 *
q0 - q1 * q1 + q2 * q2 - q3 * q3) *
pos.y() +
1450 2. * (q2 * q3 -
q0 * q1) *
pos.z();
1451 double pos2z = 2. * (q3 * q1 -
q0 * q2) *
pos.x() + 2. * (q3 * q2 +
q0 * q1) *
pos.y() +
1452 (
q0 *
q0 - q1 * q1 - q2 * q2 + q3 * q3) *
pos.z();
1454 double movex = pos2x -
pos.x();
1455 double movey = pos2y -
pos.y();
1456 double movez = pos2z -
pos.z();
1463 if (survey !=
nullptr) {
1464 matrix6x6 = survey->
errors();
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
TkRotation< Scalar > RotationType
Alignable * mother() const
Return pointer to container alignable (if any)
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
virtual void rotateAroundLocalAxis(const LocalVector &axis, Scalar radians)
Rotation around arbitratry local axis.
const AlignableObjectId & objectIdProvider() const
Return muon alignable object ID provider derived from the muon system geometry.
Sin< T >::type sin(const T &t)
align::Alignables DTBarrel()
const align::ErrorMatrix & errors() const
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
virtual void rotateAroundGlobalAxis(const GlobalVector &axis, Scalar radians)
Rotation around arbitratry global axis.
constexpr std::array< uint8_t, layerIndexSize > layer
virtual void rotateAroundGlobalZ(Scalar radians)
Rotation around global z-axis.
Point3DBase< Scalar, GlobalTag > PositionType
TkRotation transposed() const
const PositionType & globalPosition() const
Return the global position of the object.
align::Alignables CSCEndcaps()
void rectify(RotationType &)
Correct a rotation matrix for rounding errors.
const SurveyDet * survey() const
Return survey info.
Cos< T >::type cos(const T &t)
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
Allows conversion between type and name, and vice-versa.
EulerAngles toAngles(const RotationType &)
Convert rotation matrix to angles about x-, y-, z-axes (frame rotation).
const BasicVectorType & basicVector() const
AlgebraicVector EulerAngles
bool equals(const edm::RefToBase< Jet > &j1, const edm::RefToBase< Jet > &j2)
Basic3DVector< T > multiplyInverse(const Basic3DVector< T > &v) const
virtual void rotateInGlobalFrame(const RotationType &rotation)=0
const char * idToString(align::StructureType type) const
constexpr uint32_t rawId() const
get the raw id
void setSurvey(const SurveyDet *)
Set survey info.
std::vector< Alignable * > Alignables
align::Alignables GEMEndcaps()
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
const RotationType & globalRotation() const
Return the global orientation of the object.
math::Error< 6 >::type ErrorMatrix
Constructor of the full muon geometry.
Power< A, B >::type pow(const A &a, const B &b)
T angle(T x1, T y1, T z1, T x2, T y2, T z2)