CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDLRotationByAxis.cc
Go to the documentation of this file.
1 /***************************************************************************
2  DDLRotationByAxis.cc - description
3  -------------------
4  begin : Wed Nov 19, 2003
5  email : case@ucdhep.ucdavis.edu
6  ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * DDDParser sub-component of DDD *
11  * *
12  ***************************************************************************/
13 
15 
19 
20 #include <Math/RotationX.h>
21 #include <Math/RotationY.h>
22 #include <Math/RotationZ.h>
23 
25  : DDXMLElement( myreg )
26 {}
27 
29 {}
30 
31 void
32 DDLRotationByAxis::preProcessElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
33 {
34  pNameSpace = nmspace;
35  pName = name;
36 }
37 
38 void
39 DDLRotationByAxis::processElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
40 {
41  DCOUT_V('P', "DDLRotationByAxis::processElement started " << name);
42 
43  // std::cout << "my parent is : " << parent() << std::endl;
45  if (parent() != "RotationSequence")
46  {
47  std::string axis = atts.find("axis")->second;
48  std::string angle = atts.find("angle")->second;
49 
51  R = processOne(R, axis, angle);
52 
53  DDRotationMatrix* ddr = new DDRotationMatrix(R);
54  if (atts.find("name") == atts.end())
55  {
56  //how do we make up a ddname! damn_it!
57  // DDXMLElement * myRealParent = DDLElementRegistry::instance()->getElement(parent());
58  DDXMLElement * myRealParent = myRegistry_->getElement(parent());
59  DDName pName = myRealParent->getDDName(nmspace);
60  std::string tn = pName.name() + std::string("Rotation");
61  std::vector<std::string> names;
62  names.push_back("name");
63  //no need, used already names.push_back("axis");
64  //no need, used already names.push_back("angle");
65 
66  std::vector<std::string> values;
67  values.push_back(tn);
68  //no need, used already values.push_back(atts.find("axis")->second);
69  //no need, used already values.push_back(atts.find("angle")->second);
70  clear();
71  loadAttributes(name, names, values, nmspace, cpv);
72  }
73  DDRotation rot = DDrot(getDDName(nmspace), ddr);
74 
75  clear();
76  }
77  else { } //let the parent handle the clearing, etc.
78 
79  DCOUT_V('P', "DDLRotationByAxis::processElement completed");
80 }
81 
83 DDLRotationByAxis::processOne( DDRotationMatrix R, std::string& axis, std::string& angle )
84 {
89  double dAngle = ev.eval(pNameSpace, angle);
90  // CLHEP::HepRotation R;
91 
92  if ( axis == "x") {
93  R = ROOT::Math::RotationX(dAngle);
94  }
95  else if ( axis == "y" ) {
96  R = ROOT::Math::RotationY(dAngle);
97  }
98  else if ( axis =="z" ) {
99  R = ROOT::Math::RotationZ(dAngle);
100  }
101  else {
102  std::string msg = "\nDDLRotationByAxis invalid axis... you must not have validated XML sources! Element is ";
103  msg += pName;
104  throwError(msg);
105  }
106 
107  return R;
108 }
DDLElementRegistry * myRegistry_
Definition: DDXMLElement.h:187
virtual const DDXMLAttribute & getAttributeSet(size_t aIndex=0) const
Get a &quot;row&quot; of attributes, i.e. one attribute set.
Definition: DDXMLElement.cc:83
void throwError(const std::string &keyMessage) const
format std::string for throw an error.
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:18
const std::string & parent(void) const
access to parent element name
type of data representation of DDCompactView
Definition: DDCompactView.h:81
std::map< std::string, std::string > DDXMLAttribute
Definition: DDXMLElement.h:56
DDLRotationByAxis(DDLElementRegistry *myreg)
Constructor.
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:66
std::string pNameSpace
DDXMLElement * getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.
static value_type & instance()
void loadAttributes(const std::string &elemName, const std::vector< std::string > &names, const std::vector< std::string > &values, const std::string &nmspace, DDCompactView &cpv)
Load the element attributes.
Definition: DDXMLElement.cc:44
virtual DDRotationMatrix processOne(DDRotationMatrix R, std::string &axis, std::string &angle)
Interface of an Expression Evaluator.
virtual void preProcessElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv)
Called by loadAttributes AFTER attributes are loaded.
virtual void processElement(const std::string &name, const std::string &nmspace, DDCompactView &cpv)
Processing the element.
DDRotation DDrot(const DDName &name, DDRotationMatrix *rot)
Definition of a uniquely identifiable rotation matrix named by DDName name.
Definition: DDRotation.cc:94
#define DCOUT_V(M_v_Y, M_v_S)
Definition: DDdebug.h:54
virtual double eval(const std::string &ns, const std::string &expr)=0
evaluate an expression expr inside the local namespace
This is a base class for processing XML elements in the DDD.
Definition: DDXMLElement.h:59
virtual ~DDLRotationByAxis(void)
Destructor.
The main class for processing parsed elements.
virtual void clear(void)
clear this element&#39;s contents.
Definition: DDXMLElement.cc:65
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
virtual const DDName getDDName(const std::string &defaultNS, const std::string &attname=std::string("name"), size_t aIndex=0)
Definition: DDXMLElement.cc:91
static const HistoName names[]
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11