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"
25 XERCES_CPP_NAMESPACE_USE
48 : m_fileName(fileName)
52 str_name = XMLString::transcode(
"name");
73 str_rawId = XMLString::transcode(
"rawId");
74 str_wheel = XMLString::transcode(
"wheel");
78 str_layer = XMLString::transcode(
"layer");
80 str_ring = XMLString::transcode(
"ring");
82 str_axisx = XMLString::transcode(
"axisx");
83 str_axisy = XMLString::transcode(
"axisy");
84 str_axisz = XMLString::transcode(
"axisz");
85 str_angle = XMLString::transcode(
"angle");
86 str_x = XMLString::transcode(
"x");
87 str_y = XMLString::transcode(
"y");
88 str_z = XMLString::transcode(
"z");
89 str_phix = XMLString::transcode(
"phix");
90 str_phiy = XMLString::transcode(
"phiy");
91 str_phiz = XMLString::transcode(
"phiz");
92 str_alpha = XMLString::transcode(
"alpha");
93 str_beta = XMLString::transcode(
"beta");
94 str_gamma = XMLString::transcode(
"gamma");
95 str_rphi = XMLString::transcode(
"rphi");
96 str_phi = XMLString::transcode(
"phi");
97 str_xx = XMLString::transcode(
"xx");
98 str_xy = XMLString::transcode(
"xy");
99 str_xz = XMLString::transcode(
"xz");
100 str_xa = XMLString::transcode(
"xa");
101 str_xb = XMLString::transcode(
"xb");
102 str_xc = XMLString::transcode(
"xc");
103 str_yy = XMLString::transcode(
"yy");
104 str_yz = XMLString::transcode(
"yz");
105 str_ya = XMLString::transcode(
"ya");
106 str_yb = XMLString::transcode(
"yb");
107 str_yc = XMLString::transcode(
"yc");
108 str_zz = XMLString::transcode(
"zz");
109 str_za = XMLString::transcode(
"za");
110 str_zb = XMLString::transcode(
"zb");
111 str_zc = XMLString::transcode(
"zc");
112 str_aa = XMLString::transcode(
"aa");
113 str_ab = XMLString::transcode(
"ab");
114 str_ac = XMLString::transcode(
"ac");
115 str_bb = XMLString::transcode(
"bb");
116 str_bc = XMLString::transcode(
"bc");
117 str_cc = XMLString::transcode(
"cc");
118 str_none = XMLString::transcode(
"none");
119 str_ideal = XMLString::transcode(
"ideal");
219 for (align::Alignables::const_iterator ali = alignables.begin(); ali != alignables.end(); ++ali) {
223 alignableNavigator[(*ali)->geomDetId().rawId()] = *ali;
230 align::Alignables::const_iterator alignable = alignables.begin();
231 align::Alignables::const_iterator ideal = ideals.begin();
233 while (alignable != alignables.end() && ideal != ideals.end()) {
234 alitoideal[*alignable] = *ideal;
236 fillAliToIdeal(alitoideal, (*alignable)->components(), (*ideal)->components());
242 if (alignable != alignables.end() || ideal != ideals.end()) {
243 throw cms::Exception(
"Alignment") <<
"alignable and ideal-alignable trees are out of sync (this should never happen)";
252 std::map<unsigned int, Alignable*> alignableNavigator;
257 std::map<unsigned int, Alignable*> ideal_alignableNavigator;
258 recursiveGetId(ideal_alignableNavigator, ideal_alignableMuon->DTBarrel());
259 recursiveGetId(ideal_alignableNavigator, ideal_alignableMuon->CSCEndcaps());
264 catch (
const XMLException &toCatch) {
265 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw an exception on initialization." << std::endl;
268 XercesDOMParser *
parser =
new XercesDOMParser();
269 parser->setValidationScheme(XercesDOMParser::Val_Always);
271 XERCES_CPP_NAMESPACE::ErrorHandler *errHandler = (XERCES_CPP_NAMESPACE::ErrorHandler*)(
new HandlerBase());
272 parser->setErrorHandler(errHandler);
277 catch (
const XMLException &toCatch) {
278 char *
message = XMLString::transcode(toCatch.getMessage());
279 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw this exception: " << message << std::endl;
281 catch (
const DOMException &toCatch) {
282 char *
message = XMLString::transcode(toCatch.msg);
283 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw this exception: " << message << std::endl;
285 catch (
const SAXException &toCatch) {
286 char *
message = XMLString::transcode(toCatch.getMessage());
287 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw this exception: " << message << std::endl;
290 throw cms::Exception(
"XMLException") <<
"Xerces XML parser threw an unknown exception" << std::endl;
293 DOMDocument *doc = parser->getDocument();
294 DOMElement *node_MuonAlignment = doc->getDocumentElement();
295 DOMNodeList *collections = doc->getElementsByTagName(
str_collection);
296 DOMNodeList *operations = doc->getElementsByTagName(
str_operation);
298 std::map<Alignable*, Alignable*> alitoideal;
303 std::map<std::string, std::map<Alignable*, bool> > alicollections;
304 for (
unsigned int i = 0;
i < collections->getLength();
i++) {
305 DOMElement *
collection = (DOMElement*)(collections->item(
i));
306 if (collection->getParentNode() == node_MuonAlignment) {
307 DOMNodeList *children = collection->getChildNodes();
309 DOMAttr *node_name = collection->getAttributeNode(
str_name);
310 if (node_name ==
NULL) {
311 throw cms::Exception(
"XMLException") <<
"<collection> requires a name attribute" << std::endl;
313 char *ascii_name = XMLString::transcode(node_name->getValue());
317 std::map<Alignable*, bool> aliset;
318 for (
unsigned int j = 0;
j < children->getLength();
j++) {
319 DOMNode *node = children->item(
j);
321 if (node->getNodeType() == DOMNode::ELEMENT_NODE) {
322 Alignable *ali =
getNode(alignableNavigator, (DOMElement*)(node), alignableObjectId);
324 throw cms::Exception(
"XMLException") <<
"<collection> must contain only alignables" << std::endl;
331 alicollections[
name] = aliset;
335 for (
unsigned int i = 0;
i < operations->getLength();
i++) {
336 DOMElement *operation = (DOMElement*)(operations->item(
i));
337 if (operation->getParentNode() != node_MuonAlignment) {
338 throw cms::Exception(
"XMLException") <<
"All operations must be top-level elements" << std::endl;
341 DOMNodeList *children = operation->getChildNodes();
343 std::map<Alignable*, bool> aliset;
344 std::vector<DOMNode*> nodesToRemove;
345 for (
unsigned int j = 0;
j < children->getLength();
j++) {
346 DOMNode *node = children->item(
j);
348 if (node->getNodeType() == DOMNode::ELEMENT_NODE) {
349 Alignable *ali =
getNode(alignableNavigator, (DOMElement*)(node), alignableObjectId);
352 nodesToRemove.push_back(node);
355 else if (XMLString::equals(node->getNodeName(),
str_collection)) {
356 DOMAttr *node_name = ((DOMElement*)(node))->getAttributeNode(
str_name);
357 if (node_name ==
NULL) {
358 throw cms::Exception(
"XMLException") <<
"<collection> requires a name attribute" << std::endl;
360 char *ascii_name = XMLString::transcode(node_name->getValue());
364 std::map<std::string, std::map<Alignable*, bool> >::const_iterator alicollections_iter = alicollections.find(name);
365 if (alicollections_iter == alicollections.end()) {
366 throw cms::Exception(
"XMLException") <<
"<collection name=\"" << name <<
"\"> hasn't been defined" << std::endl;
369 for (std::map<Alignable*, bool>::const_iterator aliiter = alicollections_iter->second.begin();
370 aliiter != alicollections_iter->second.end();
372 aliset[aliiter->first] =
true;
375 nodesToRemove.push_back(node);
384 for (std::vector<DOMNode*>::const_iterator node = nodesToRemove.begin(); node != nodesToRemove.end(); ++node) {
385 operation->removeChild(*node);
387 children = operation->getChildNodes();
389 for (
unsigned int j = 0;
j < children->getLength();
j++) {
390 DOMNode *node = children->item(
j);
391 if (node->getNodeType() == DOMNode::ELEMENT_NODE) {
397 else if (XMLString::equals(node->getNodeName(),
str_setape)) {
398 do_setape((DOMElement*)(node), aliset, alitoideal);
405 else if (XMLString::equals(node->getNodeName(),
str_moveglobal)) {
409 else if (XMLString::equals(node->getNodeName(),
str_movelocal)) {
426 char *
message = XMLString::transcode(node->getNodeName());
427 throw cms::Exception(
"XMLException") <<
"Unrecognized operation: \"" << message <<
"\"" << std::endl;
439 delete ideal_alignableMuon;
440 return alignableMuon;
444 const XERCES_CPP_NAMESPACE::DOMElement *node,
461 std::map<unsigned int, Alignable*> &alignableNavigator,
const XERCES_CPP_NAMESPACE::DOMElement *node,
463 unsigned int rawId = 0;
465 DOMAttr *node_rawId = node->getAttributeNode(
str_rawId);
466 if (node_rawId !=
NULL) {
468 rawId = XMLString::parseInt(node_rawId->getValue());
470 catch (
const XMLException &toCatch) {
471 throw cms::Exception(
"XMLException") <<
"Value of \"rawId\" must be an integer" << std::endl;
475 int wheel,
station, sector, superlayer, layer;
476 wheel = station = sector = superlayer = layer = 1;
479 DOMAttr *node_wheel = node->getAttributeNode(
str_wheel);
480 if (node_wheel ==
NULL)
throw cms::Exception(
"XMLException") <<
"DT node is missing required \"wheel\" attribute" << std::endl;
482 wheel = XMLString::parseInt(node_wheel->getValue());
484 catch (
const XMLException &toCatch) {
485 throw cms::Exception(
"XMLException") <<
"Value of \"wheel\" must be an integer" << std::endl;
489 DOMAttr *node_station = node->getAttributeNode(
str_station);
490 if (node_station ==
NULL)
throw cms::Exception(
"XMLException") <<
"DT node is missing required \"station\" attribute" << std::endl;
492 station = XMLString::parseInt(node_station->getValue());
494 catch (
const XMLException &toCatch) {
495 throw cms::Exception(
"XMLException") <<
"Value of \"station\" must be an integer" << std::endl;
499 DOMAttr *node_sector = node->getAttributeNode(
str_sector);
500 if (node_sector ==
NULL)
throw cms::Exception(
"XMLException") <<
"DT node is missing required \"sector\" attribute" << std::endl;
502 sector = XMLString::parseInt(node_sector->getValue());
504 catch (
const XMLException &toCatch) {
505 throw cms::Exception(
"XMLException") <<
"Value of \"sector\" must be an integer" << std::endl;
509 DOMAttr *node_superlayer = node->getAttributeNode(
str_superlayer);
510 if (node_superlayer ==
NULL)
throw cms::Exception(
"XMLException") <<
"DT node is missing required \"superlayer\" attribute" << std::endl;
512 superlayer = XMLString::parseInt(node_superlayer->getValue());
514 catch (
const XMLException &toCatch) {
515 throw cms::Exception(
"XMLException") <<
"Value of \"superlayer\" must be an integer" << std::endl;
519 DOMAttr *node_layer = node->getAttributeNode(
str_layer);
520 if (node_layer ==
NULL)
throw cms::Exception(
"XMLException") <<
"DT node is missing required \"layer\" attribute" << std::endl;
522 layer = XMLString::parseInt(node_layer->getValue());
524 catch (
const XMLException &toCatch) {
525 throw cms::Exception(
"XMLException") <<
"Value of \"layer\" must be an integer" << std::endl;
534 DTLayerId layerId(wheel, station, sector, superlayer, layer);
535 rawId = layerId.
rawId();
538 Alignable *ali = alignableNavigator[rawId];
539 if (ali ==
NULL)
throw cms::Exception(
"XMLException") <<
"rawId \"" << rawId <<
"\" is not recognized" << std::endl;
546 <<
"rawId \"" << rawId <<
"\" is not a "
547 << alignableObjectId.
idToString(structureType) << std::endl;
554 std::map<unsigned int, Alignable*> &alignableNavigator,
const XERCES_CPP_NAMESPACE::DOMElement *node,
558 DOMAttr *node_rawId = node->getAttributeNode(
str_rawId);
559 if (node_rawId !=
NULL) {
561 rawId = XMLString::parseInt(node_rawId->getValue());
563 catch (
const XMLException &toCatch) {
564 throw cms::Exception(
"XMLException") <<
"Value of \"rawId\" must be an integer" << std::endl;
569 endcap = station = ring = chamber = layer = 1;
571 DOMAttr *node_endcap = node->getAttributeNode(
str_endcap);
572 if (node_endcap ==
NULL)
throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"endcap\" attribute" << std::endl;
574 endcap = XMLString::parseInt(node_endcap->getValue());
576 catch (
const XMLException &toCatch) {
577 throw cms::Exception(
"XMLException") <<
"Value of \"endcap\" must be an integer" << std::endl;
579 if (endcap == -1) endcap = 2;
582 DOMAttr *node_station = node->getAttributeNode(
str_station);
583 if (node_station ==
NULL)
throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"station\" attribute" << std::endl;
585 station = XMLString::parseInt(node_station->getValue());
587 catch (
const XMLException &toCatch) {
588 throw cms::Exception(
"XMLException") <<
"Value of \"station\" must be an integer" << std::endl;
592 DOMAttr *node_ring = node->getAttributeNode(
str_ring);
593 if (node_ring ==
NULL)
throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"ring\" attribute" << std::endl;
595 ring = XMLString::parseInt(node_ring->getValue());
597 catch (
const XMLException &toCatch) {
598 throw cms::Exception(
"XMLException") <<
"Value of \"ring\" must be an integer" << std::endl;
602 DOMAttr *node_chamber = node->getAttributeNode(
str_chamber);
603 if (node_chamber ==
NULL)
throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"chamber\" attribute" << std::endl;
605 chamber = XMLString::parseInt(node_chamber->getValue());
607 catch (
const XMLException &toCatch) {
608 throw cms::Exception(
"XMLException") <<
"Value of \"chamber\" must be an integer" << std::endl;
612 DOMAttr *node_layer = node->getAttributeNode(
str_layer);
613 if (node_layer ==
NULL)
throw cms::Exception(
"XMLException") <<
"CSC node is missing required \"layer\" attribute" << std::endl;
615 layer = XMLString::parseInt(node_layer->getValue());
617 catch (
const XMLException &toCatch) {
618 throw cms::Exception(
"XMLException") <<
"Value of \"layer\" must be an integer" << std::endl;
626 CSCDetId layerId(endcap, station, ring, chamber, layer);
627 rawId = layerId.
rawId();
630 Alignable *ali = alignableNavigator[rawId];
631 if (ali ==
NULL)
throw cms::Exception(
"XMLException") <<
"rawId \"" << rawId <<
"\" is not recognized" << std::endl;
638 <<
"rawId \"" << rawId <<
"\" is not a "
639 << alignableObjectId.
idToString(structureType) << std::endl;
646 unsigned int len = XMLString::stringLen(str);
647 char *cstr = XMLString::transcode(str);
648 std::stringstream errmessage;
649 errmessage <<
"Value of \"" << attribute <<
"\" must be a double, not \"" << cstr <<
"\"" << std::endl;
654 if (cstr[i] ==
'-') {
658 else if (cstr[i] ==
'+') i++;
662 while (cstr[i] !=
'.' && cstr[i] !=
'e' && cstr[i] !=
'E' && i < len) {
663 if (cstr[i] <
'0' || cstr[i] >
'9') {
669 output += cstr[
i] -
'0';
673 if (cstr[i] ==
'.') {
677 while (cstr[i] !=
'e' && cstr[i] !=
'E' && i < len) {
678 if (cstr[i] <
'0' || cstr[i] >
'9') {
683 output += (cstr[
i] -
'0') * place;
689 if (cstr[i] ==
'e' || cstr[i] ==
'E') {
693 bool expminus =
false;
694 if (cstr[i] ==
'-') {
698 else if (cstr[i] ==
'+') i++;
701 if (cstr[i] <
'0' || cstr[i] >
'9') {
707 exponent += cstr[
i] -
'0';
711 if (expminus) exponent *= -1;
713 output *=
pow(10., exponent);
716 if (minus) output *= -1.;
723 DOMAttr *node_relativeto = node->getAttributeNode(
str_relativeto);
724 if (node_relativeto ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setposition> is missing required \"relativeto\" attribute" << std::endl;
727 if (XMLString::equals(node_relativeto->getValue(),
str_none)) {
730 else if (XMLString::equals(node_relativeto->getValue(),
str_ideal)) {
733 else if (XMLString::equals(node_relativeto->getValue(),
str_container)) {
737 char *
message = XMLString::transcode(node_relativeto->getValue());
738 throw cms::Exception(
"XMLException") <<
"relativeto must be \"none\", \"ideal\", or \"container\", not \"" << message <<
"\"" << std::endl;
741 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
750 if (relativeto == 0) {}
752 else if (relativeto == 1) {
760 else if (relativeto == 2 && ali->
mother() !=
NULL) {
765 oldrot = oldrot * globalRotation.
transposed();
768 double x = oldpos.
x();
769 double y = oldpos.
y();
770 double z = oldpos.
z();
772 double phix = atan2(oldrot.
yz(), oldrot.
zz());
773 double phiy = asin(-oldrot.
xz());
774 double phiz = atan2(oldrot.
xy(), oldrot.
xx());
777 double alpha = oldEulerAngles(1);
778 double beta = oldEulerAngles(2);
779 double gamma = oldEulerAngles(3);
783 DOMAttr *node_x = node->getAttributeNode(
str_x);
784 DOMAttr *node_y = node->getAttributeNode(
str_y);
785 DOMAttr *node_z = node->getAttributeNode(
str_z);
792 DOMAttr *node_phix = node->getAttributeNode(
str_phix);
793 DOMAttr *node_phiy = node->getAttributeNode(
str_phiy);
794 DOMAttr *node_phiz = node->getAttributeNode(
str_phiz);
795 DOMAttr *node_alpha = node->getAttributeNode(
str_alpha);
796 DOMAttr *node_beta = node->getAttributeNode(
str_beta);
797 DOMAttr *node_gamma = node->getAttributeNode(
str_gamma);
800 bool phixyz = (node_phix !=
NULL || node_phiy !=
NULL || node_phiz !=
NULL);
801 bool alphabetagamma = (node_alpha !=
NULL || node_beta !=
NULL || node_gamma !=
NULL);
802 if (phixyz && alphabetagamma)
throw cms::Exception(
"XMLException") <<
"<setposition> must either have phix, phiy, and phiz or alpha, beta, and gamma, but not both" << std::endl;
803 if (!phixyz && !alphabetagamma) alphabetagamma =
true;
806 if (node_phix !=
NULL) phix =
parseDouble(node_phix->getValue(),
"phix");
807 if (node_phiy !=
NULL) phiy =
parseDouble(node_phiy->getValue(),
"phiy");
808 if (node_phiz !=
NULL) phiz =
parseDouble(node_phiz->getValue(),
"phiz");
814 0., -
sin(phix),
cos(phix));
817 sin(phiy), 0.,
cos(phiy));
819 -
sin(phiz),
cos(phiz), 0.,
822 rot = rotX * rotY * rotZ;
825 else if (alphabetagamma) {
826 if (node_alpha !=
NULL) alpha =
parseDouble(node_alpha->getValue(),
"alpha");
827 if (node_beta !=
NULL) beta =
parseDouble(node_beta->getValue(),
"beta");
828 if (node_gamma !=
NULL) gamma =
parseDouble(node_gamma->getValue(),
"gamma");
832 eulerAngles(1) =
alpha;
833 eulerAngles(2) =
beta;
834 eulerAngles(3) = gamma;
840 if (relativeto == 0) {
844 else if (relativeto == 1) {
856 else if (relativeto == 2) {
860 if (container !=
NULL) {
909 if (survey !=
NULL) {
910 matrix6x6 = survey->
errors();
915 void MuonAlignmentInputXML::do_setape(
const XERCES_CPP_NAMESPACE::DOMElement *node, std::map<Alignable*, bool> &aliset, std::map<Alignable*, Alignable*> &alitoideal)
const {
916 DOMAttr *node_xx = node->getAttributeNode(
str_xx);
917 DOMAttr *node_xy = node->getAttributeNode(
str_xy);
918 DOMAttr *node_xz = node->getAttributeNode(
str_xz);
919 DOMAttr *node_xa = node->getAttributeNode(
str_xa);
920 DOMAttr *node_xb = node->getAttributeNode(
str_xb);
921 DOMAttr *node_xc = node->getAttributeNode(
str_xc);
922 DOMAttr *node_yy = node->getAttributeNode(
str_yy);
923 DOMAttr *node_yz = node->getAttributeNode(
str_yz);
924 DOMAttr *node_ya = node->getAttributeNode(
str_ya);
925 DOMAttr *node_yb = node->getAttributeNode(
str_yb);
926 DOMAttr *node_yc = node->getAttributeNode(
str_yc);
927 DOMAttr *node_zz = node->getAttributeNode(
str_zz);
928 DOMAttr *node_za = node->getAttributeNode(
str_za);
929 DOMAttr *node_zb = node->getAttributeNode(
str_zb);
930 DOMAttr *node_zc = node->getAttributeNode(
str_zc);
931 DOMAttr *node_aa = node->getAttributeNode(
str_aa);
932 DOMAttr *node_ab = node->getAttributeNode(
str_ab);
933 DOMAttr *node_ac = node->getAttributeNode(
str_ac);
934 DOMAttr *node_bb = node->getAttributeNode(
str_bb);
935 DOMAttr *node_bc = node->getAttributeNode(
str_bc);
936 DOMAttr *node_cc = node->getAttributeNode(
str_cc);
938 if (node_xx ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xx\" attribute" << std::endl;
939 if (node_xy ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xy\" attribute" << std::endl;
940 if (node_xz ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xz\" attribute" << std::endl;
941 if (node_xa ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xa\" attribute" << std::endl;
942 if (node_xb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xb\" attribute" << std::endl;
943 if (node_xc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"xc\" attribute" << std::endl;
944 if (node_yy ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yy\" attribute" << std::endl;
945 if (node_yz ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yz\" attribute" << std::endl;
946 if (node_ya ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"ya\" attribute" << std::endl;
947 if (node_yb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yb\" attribute" << std::endl;
948 if (node_yc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"yc\" attribute" << std::endl;
949 if (node_zz ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"zz\" attribute" << std::endl;
950 if (node_za ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"za\" attribute" << std::endl;
951 if (node_zb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"zb\" attribute" << std::endl;
952 if (node_zc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"zc\" attribute" << std::endl;
953 if (node_aa ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"aa\" attribute" << std::endl;
954 if (node_ab ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"ab\" attribute" << std::endl;
955 if (node_ac ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"ac\" attribute" << std::endl;
956 if (node_bb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"bb\" attribute" << std::endl;
957 if (node_bc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"bc\" attribute" << std::endl;
958 if (node_cc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setape> is missing required \"cc\" attribute" << std::endl;
961 matrix6x6(0,0) =
parseDouble(node_xx->getValue(),
"xx");
962 matrix6x6(0,1) =
parseDouble(node_xy->getValue(),
"xy");
963 matrix6x6(0,2) =
parseDouble(node_xz->getValue(),
"xz");
964 matrix6x6(0,3) =
parseDouble(node_xa->getValue(),
"xa");
965 matrix6x6(0,4) =
parseDouble(node_xb->getValue(),
"xb");
966 matrix6x6(0,5) =
parseDouble(node_xc->getValue(),
"xc");
967 matrix6x6(1,1) =
parseDouble(node_yy->getValue(),
"yy");
968 matrix6x6(1,2) =
parseDouble(node_yz->getValue(),
"yz");
969 matrix6x6(1,3) =
parseDouble(node_ya->getValue(),
"ya");
970 matrix6x6(1,4) =
parseDouble(node_yb->getValue(),
"yb");
971 matrix6x6(1,5) =
parseDouble(node_yc->getValue(),
"yc");
972 matrix6x6(2,2) =
parseDouble(node_zz->getValue(),
"zz");
973 matrix6x6(2,3) =
parseDouble(node_za->getValue(),
"za");
974 matrix6x6(2,4) =
parseDouble(node_zb->getValue(),
"zb");
975 matrix6x6(2,5) =
parseDouble(node_zc->getValue(),
"zc");
976 matrix6x6(3,3) =
parseDouble(node_aa->getValue(),
"aa");
977 matrix6x6(3,4) =
parseDouble(node_ab->getValue(),
"ab");
978 matrix6x6(3,5) =
parseDouble(node_ac->getValue(),
"ac");
979 matrix6x6(4,4) =
parseDouble(node_bb->getValue(),
"bb");
980 matrix6x6(4,5) =
parseDouble(node_bc->getValue(),
"bc");
981 matrix6x6(5,5) =
parseDouble(node_cc->getValue(),
"cc");
983 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
990 DOMAttr *node_xx = node->getAttributeNode(
str_xx);
991 DOMAttr *node_xy = node->getAttributeNode(
str_xy);
992 DOMAttr *node_xz = node->getAttributeNode(
str_xz);
993 DOMAttr *node_xa = node->getAttributeNode(
str_xa);
994 DOMAttr *node_xb = node->getAttributeNode(
str_xb);
995 DOMAttr *node_xc = node->getAttributeNode(
str_xc);
996 DOMAttr *node_yy = node->getAttributeNode(
str_yy);
997 DOMAttr *node_yz = node->getAttributeNode(
str_yz);
998 DOMAttr *node_ya = node->getAttributeNode(
str_ya);
999 DOMAttr *node_yb = node->getAttributeNode(
str_yb);
1000 DOMAttr *node_yc = node->getAttributeNode(
str_yc);
1001 DOMAttr *node_zz = node->getAttributeNode(
str_zz);
1002 DOMAttr *node_za = node->getAttributeNode(
str_za);
1003 DOMAttr *node_zb = node->getAttributeNode(
str_zb);
1004 DOMAttr *node_zc = node->getAttributeNode(
str_zc);
1005 DOMAttr *node_aa = node->getAttributeNode(
str_aa);
1006 DOMAttr *node_ab = node->getAttributeNode(
str_ab);
1007 DOMAttr *node_ac = node->getAttributeNode(
str_ac);
1008 DOMAttr *node_bb = node->getAttributeNode(
str_bb);
1009 DOMAttr *node_bc = node->getAttributeNode(
str_bc);
1010 DOMAttr *node_cc = node->getAttributeNode(
str_cc);
1012 if (node_xx ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xx\" attribute" << std::endl;
1013 if (node_xy ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xy\" attribute" << std::endl;
1014 if (node_xz ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xz\" attribute" << std::endl;
1015 if (node_xa ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xa\" attribute" << std::endl;
1016 if (node_xb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xb\" attribute" << std::endl;
1017 if (node_xc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"xc\" attribute" << std::endl;
1018 if (node_yy ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yy\" attribute" << std::endl;
1019 if (node_yz ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yz\" attribute" << std::endl;
1020 if (node_ya ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"ya\" attribute" << std::endl;
1021 if (node_yb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yb\" attribute" << std::endl;
1022 if (node_yc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"yc\" attribute" << std::endl;
1023 if (node_zz ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"zz\" attribute" << std::endl;
1024 if (node_za ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"za\" attribute" << std::endl;
1025 if (node_zb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"zb\" attribute" << std::endl;
1026 if (node_zc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"zc\" attribute" << std::endl;
1027 if (node_aa ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"aa\" attribute" << std::endl;
1028 if (node_ab ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"ab\" attribute" << std::endl;
1029 if (node_ac ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"ac\" attribute" << std::endl;
1030 if (node_bb ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"bb\" attribute" << std::endl;
1031 if (node_bc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"bc\" attribute" << std::endl;
1032 if (node_cc ==
NULL)
throw cms::Exception(
"XMLException") <<
"<setsurveyerr> is missing required \"cc\" attribute" << std::endl;
1035 matrix6x6(0,0) =
parseDouble(node_xx->getValue(),
"xx");
1036 matrix6x6(0,1) =
parseDouble(node_xy->getValue(),
"xy");
1037 matrix6x6(0,2) =
parseDouble(node_xz->getValue(),
"xz");
1038 matrix6x6(0,3) =
parseDouble(node_xa->getValue(),
"xa");
1039 matrix6x6(0,4) =
parseDouble(node_xb->getValue(),
"xb");
1040 matrix6x6(0,5) =
parseDouble(node_xc->getValue(),
"xc");
1041 matrix6x6(1,1) =
parseDouble(node_yy->getValue(),
"yy");
1042 matrix6x6(1,2) =
parseDouble(node_yz->getValue(),
"yz");
1043 matrix6x6(1,3) =
parseDouble(node_ya->getValue(),
"ya");
1044 matrix6x6(1,4) =
parseDouble(node_yb->getValue(),
"yb");
1045 matrix6x6(1,5) =
parseDouble(node_yc->getValue(),
"yc");
1046 matrix6x6(2,2) =
parseDouble(node_zz->getValue(),
"zz");
1047 matrix6x6(2,3) =
parseDouble(node_za->getValue(),
"za");
1048 matrix6x6(2,4) =
parseDouble(node_zb->getValue(),
"zb");
1049 matrix6x6(2,5) =
parseDouble(node_zc->getValue(),
"zc");
1050 matrix6x6(3,3) =
parseDouble(node_aa->getValue(),
"aa");
1051 matrix6x6(3,4) =
parseDouble(node_ab->getValue(),
"ab");
1052 matrix6x6(3,5) =
parseDouble(node_ac->getValue(),
"ac");
1053 matrix6x6(4,4) =
parseDouble(node_bb->getValue(),
"bb");
1054 matrix6x6(4,5) =
parseDouble(node_bc->getValue(),
"bc");
1055 matrix6x6(5,5) =
parseDouble(node_cc->getValue(),
"cc");
1057 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1064 DOMAttr *node_x = node->getAttributeNode(
str_x);
1065 DOMAttr *node_y = node->getAttributeNode(
str_y);
1066 DOMAttr *node_z = node->getAttributeNode(
str_z);
1067 if (node_x ==
NULL)
throw cms::Exception(
"XMLException") <<
"<moveglobal> is missing required \"x\" attribute" << std::endl;
1068 if (node_y ==
NULL)
throw cms::Exception(
"XMLException") <<
"<moveglobal> is missing required \"y\" attribute" << std::endl;
1069 if (node_z ==
NULL)
throw cms::Exception(
"XMLException") <<
"<moveglobal> is missing required \"z\" attribute" << std::endl;
1076 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1085 if (survey !=
NULL) {
1086 matrix6x6 = survey->
errors();
1093 DOMAttr *node_x = node->getAttributeNode(
str_x);
1094 DOMAttr *node_y = node->getAttributeNode(
str_y);
1095 DOMAttr *node_z = node->getAttributeNode(
str_z);
1096 if (node_x ==
NULL)
throw cms::Exception(
"XMLException") <<
"<movelocal> is missing required \"x\" attribute" << std::endl;
1097 if (node_y ==
NULL)
throw cms::Exception(
"XMLException") <<
"<movelocal> is missing required \"y\" attribute" << std::endl;
1098 if (node_z ==
NULL)
throw cms::Exception(
"XMLException") <<
"<movelocal> is missing required \"z\" attribute" << std::endl;
1105 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1109 ali->
move(globalVector);
1115 if (survey !=
NULL) {
1116 matrix6x6 = survey->
errors();
1123 DOMAttr *node_axisx = node->getAttributeNode(
str_axisx);
1124 DOMAttr *node_axisy = node->getAttributeNode(
str_axisy);
1125 DOMAttr *node_axisz = node->getAttributeNode(
str_axisz);
1126 DOMAttr *node_angle = node->getAttributeNode(
str_angle);
1127 if (node_axisx ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"axisx\" attribute" << std::endl;
1128 if (node_axisy ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"axisy\" attribute" << std::endl;
1129 if (node_axisz ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"axisz\" attribute" << std::endl;
1130 if (node_angle ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotatelocal> is missing required \"angle\" attribute" << std::endl;
1138 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1147 if (survey !=
NULL) {
1148 matrix6x6 = survey->
errors();
1155 DOMAttr *node_rphi = node->getAttributeNode(
str_rphi);
1156 DOMAttr *node_phi = node->getAttributeNode(
str_phi);
1157 if (node_rphi ==
NULL && node_phi ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotatebeamline> is missing required \"*phi\" attribute" << std::endl;
1158 if (node_rphi !=
NULL && node_phi !=
NULL)
throw cms::Exception(
"XMLException") <<
"<rotatebeamline> can't have both an \"rphi\" and a \"phi\" attribute" << std::endl;
1161 if (node_rphi !=
NULL) {
1162 value =
parseDouble(node_rphi->getValue(),
"rphi");
1168 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1174 double phi0 = pos.
phi();
1175 double deltaphi =
value;
1176 if (node_rphi !=
NULL) deltaphi = value /
radius;
1180 radius * (
sin(phi0 + deltaphi) -
sin(phi0)),
1187 if (survey !=
NULL) {
1188 matrix6x6 = survey->
errors();
1195 DOMAttr *node_x = node->getAttributeNode(
str_x);
1196 DOMAttr *node_y = node->getAttributeNode(
str_y);
1197 DOMAttr *node_z = node->getAttributeNode(
str_z);
1198 DOMAttr *node_angle = node->getAttributeNode(
str_angle);
1199 if (node_x ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"x\" attribute" << std::endl;
1200 if (node_y ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"y\" attribute" << std::endl;
1201 if (node_z ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"z\" attribute" << std::endl;
1202 if (node_angle ==
NULL)
throw cms::Exception(
"XMLException") <<
"<rotateglobalaxis> is missing required \"angle\" attribute" << std::endl;
1209 for (std::map<Alignable*, bool>::const_iterator aliiter = aliset.begin(); aliiter != aliset.end(); ++aliiter) {
1215 double aprime = x/
sqrt(x*x + y*y + z*z);
1216 double bprime = y/
sqrt(x*x + y*y + z*z);
1217 double cprime = z/
sqrt(x*x + y*y + z*z);
1218 double q0 =
cos(angle/2.);
1219 double q1 =
sin(angle/2.) * aprime;
1220 double q2 =
sin(angle/2.) * bprime;
1221 double q3 =
sin(angle/2.) * cprime;
1223 double pos2x = (q0*q0 + q1*q1 - q2*q2 - q3*q3) * pos.
x() + 2.*(q1*q2 - q0*q3) * pos.
y() + 2.*(q1*q3 + q0*
q2) * pos.
z();
1224 double pos2y = 2.*(q2*q1 + q0*q3) * pos.
x() + (q0*q0 - q1*q1 + q2*q2 - q3*q3) * pos.
y() + 2.*(q2*q3 - q0*
q1) * pos.
z();
1225 double pos2z = 2.*(q3*q1 - q0*
q2) * pos.
x() + 2.*(q3*q2 + q0*
q1) * pos.
y() + (q0*q0 - q1*q1 - q2*q2 + q3*q3) * pos.
z();
1227 double movex = pos2x - pos.
x();
1228 double movey = pos2y - pos.
y();
1229 double movez = pos2z - pos.
z();
1236 if (survey !=
NULL) {
1237 matrix6x6 = survey->
errors();
TkRotation< Scalar > RotationType
virtual void rotateAroundLocalAxis(const LocalVector &axis, Scalar radians)
Rotation around arbitratry local axis.
Sin< T >::type sin(const T &t)
align::Alignables DTBarrel()
const SurveyDet * survey() const
Return survey info.
Geom::Phi< T > phi() const
const RotationType & globalRotation() const
Return the global orientation of the object.
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
const align::ErrorMatrix & errors() const
const AlignableObjectId & objectIdProvider() const
Return muon alignable object ID provider derived from the muon system geometry.
virtual void rotateAroundGlobalAxis(const GlobalVector &axis, Scalar radians)
Rotation around arbitratry global axis.
virtual void rotateAroundGlobalZ(Scalar radians)
Rotation around global z-axis.
uint32_t rawId() const
get the raw id
Point3DBase< Scalar, GlobalTag > PositionType
align::Alignables CSCEndcaps()
void rectify(RotationType &)
Correct a rotation matrix for rounding errors.
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 AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
AlgebraicVector EulerAngles
const char * idToString(align::StructureType type) const
virtual void rotateInGlobalFrame(const RotationType &rotation)=0
void setSurvey(const SurveyDet *)
Set survey info.
std::vector< Alignable * > Alignables
TkRotation transposed() const
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
const PositionType & globalPosition() const
Return the global position of the object.
math::Error< 6 >::type ErrorMatrix
Basic3DVector< T > multiplyInverse(const Basic3DVector< T > &v) const
Constructor of the full muon geometry.
const BasicVectorType & basicVector() const
Alignable * mother() const
Return pointer to container alignable (if any)
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)