diff --git a/DDCore/include/DD4hep/Detector.h b/DDCore/include/DD4hep/Detector.h index f0858ecc141635294cfb954b9aae6015e5b54219..6403db50c2605835e45584ec3ae2695f5d148eef 100644 --- a/DDCore/include/DD4hep/Detector.h +++ b/DDCore/include/DD4hep/Detector.h @@ -91,6 +91,9 @@ namespace DD4hep { /// Constructor for a new sensitive detector element SensitiveDetector(const std::string& name, const std::string& type="sensitive"); + /// Assignment operator + SensitiveDetector& operator=(const SensitiveDetector& sd) { m_element = sd.m_element; return *this; } + /// Additional data accessor Object& _data() const { return *data<Object>(); } @@ -165,13 +168,13 @@ namespace DD4hep { typedef std::map<std::string,DetElement> Children; typedef std::map<const std::type_info*,void*> Extensions; - enum { + enum CopyParameters { COPY_NONE = 0, COPY_PLACEMENT = 1<<0, COPY_PARENT = 1<<1, COPY_ALIGNMENT = 1<<2, LAST - } CopyParameters; + }; struct Object { unsigned int magic; int id; @@ -282,6 +285,9 @@ namespace DD4hep { /// Constructor for a new subdetector element DetElement(DetElement parent, const std::string& name, int id); + /// Assignment operator + DetElement& operator=(const DetElement& e) { m_element=e.m_element; return *this; } + /// Clone (Deep copy) the DetElement structure with a new name DetElement clone(const std::string& new_name) const; diff --git a/DDCore/include/DD4hep/Fields.h b/DDCore/include/DD4hep/Fields.h index 875b7f7e8f641d89b9a1371f59de369c478b3f57..66dd0417f50ea8d8cb00a46cbefd9be5b617da55 100644 --- a/DDCore/include/DD4hep/Fields.h +++ b/DDCore/include/DD4hep/Fields.h @@ -67,6 +67,9 @@ namespace DD4hep { /// Constructor to be used when reading the already parsed DOM tree template <typename Q> CartesianField(const Handle<Q>& e) : Ref_t(e) {} + /// Assignment operator + CartesianField& operator=(const CartesianField& f) { m_element=f.m_element; return *this; } + /// Access the field type int fieldType() const { return data<Object>()->type; } diff --git a/DDCore/include/DD4hep/GeoHandler.h b/DDCore/include/DD4hep/GeoHandler.h index 07e7b57e08fd61e49c52b61d410cd830a493ae2d..8f123b91956298158ba1e88e6f04612b949b42f2 100644 --- a/DDCore/include/DD4hep/GeoHandler.h +++ b/DDCore/include/DD4hep/GeoHandler.h @@ -80,6 +80,12 @@ namespace DD4hep { /// Internal helper to collect geometry information from traversal GeoHandler& i_collect(const TGeoNode* node, int level); + private: + /// Never call Copy constructor + GeoHandler(const GeoHandler&) {} + /// Never call assignment operator + GeoHandler& operator=(const GeoHandler&) { return *this; } + public: /// Default constructor GeoHandler(); diff --git a/DDCore/include/DD4hep/Handle.h b/DDCore/include/DD4hep/Handle.h index a2ca0aa3fcfa2058ca3774dc9f4740f52144a563..f4104388573afead513ba462957ba7b57d9f2eb2 100644 --- a/DDCore/include/DD4hep/Handle.h +++ b/DDCore/include/DD4hep/Handle.h @@ -123,22 +123,22 @@ namespace DD4hep { typedef T Implementation; typedef Handle<Implementation> handle_t; T* m_element; - Handle() : m_element(0) { } - Handle(T* e) : m_element(e) { } - Handle(const Handle<T>& e) : m_element(e.m_element) { } + Handle() : m_element(0) { } + Handle(T* e) : m_element(e) { } + Handle(const Handle<T>& e) : m_element(e.m_element) { } template<typename Q> Handle(Q* e) - : m_element((T*)e) { verifyObject(); } + : m_element((T*)e) { verifyObject(); } template<typename Q> Handle(const Handle<Q>& e) - : m_element((T*)e.m_element) { verifyObject(); } - - bool isValid() const { return 0 != m_element; } - bool operator!() const { return 0 == m_element; } - T* operator->() const { return m_element; } - operator T& () const { return *m_element; } - T& operator*() const { return *m_element; } - T* ptr() const { return m_element; } - template <typename Q> Q* _ptr() const { return (Q*)m_element; } - template <typename Q> Q* data() const { return (Value<T,Q>*)m_element; } + : m_element((T*)e.m_element) { verifyObject(); } + Handle<T>& operator=(const Handle<T>& e){ m_element=e.m_element; return *this; } + bool isValid() const { return 0 != m_element; } + bool operator!() const { return 0 == m_element; } + T* operator->() const { return m_element; } + operator T& () const { return *m_element; } + T& operator*() const { return *m_element; } + T* ptr() const { return m_element; } + template <typename Q> Q* _ptr() const { return (Q*)m_element; } + template <typename Q> Q* data() const { return (Value<T,Q>*)m_element; } void verifyObject() const { increment_object_validations(); if ( m_element && dynamic_cast<T*>(m_element) == 0 ) { diff --git a/DDCore/include/DD4hep/Volumes.h b/DDCore/include/DD4hep/Volumes.h index 6118df963c44a6ab949c4c28e5e2f75897944441..d110ea6d05c12bb9e88cf5601296c0d68a484c72 100644 --- a/DDCore/include/DD4hep/Volumes.h +++ b/DDCore/include/DD4hep/Volumes.h @@ -55,9 +55,11 @@ namespace DD4hep { /// ID container VolIDs volIDs; /// Default constructor - Object() : volIDs() {} + Object() : magic(0), volIDs() {} /// Copy constructor Object(const Object& c) : magic(c.magic), volIDs(c.volIDs) {} + /// Assignment operator + Object& operator=(const Object& c) { magic=c.magic; volIDs=c.volIDs; return *this; } }; /// Constructor to be used when reading the already parsed DOM tree PlacedVolume(const TGeoNode* e) : Handle<TGeoNodeMatrix>(e) {} @@ -67,6 +69,9 @@ namespace DD4hep { PlacedVolume(const PlacedVolume& e) : Handle<TGeoNodeMatrix>(e) {} /// Copy assignment from other handle type template <typename T> PlacedVolume(const Handle<T>& e) : Handle<TGeoNodeMatrix>(e) {} + /// Assignment operator (must match copy constructor) + PlacedVolume& operator=(const PlacedVolume& v) { m_element=v.m_element; return *this; } + /// Add identifier PlacedVolume& addPhysVolID(const std::string& name, int value); /// Volume material @@ -99,8 +104,8 @@ namespace DD4hep { VisAttr vis; Ref_t sens_det; int referenced; - Object() : region(), limits(), vis(), sens_det(), referenced(0) {} - void copy(const Object& c) { region=c.region; limits=c.limits; vis=c.vis; sens_det=c.sens_det; referenced=c.referenced; } + Object() : magic(0), region(), limits(), vis(), sens_det(), referenced(0) {} + void copy(const Object& c) { magic=c.magic; region=c.region; limits=c.limits; vis=c.vis; sens_det=c.sens_det; referenced=c.referenced; } }; public: @@ -119,6 +124,9 @@ namespace DD4hep { /// Constructor to be used when creating a new geometry tree. Also sets materuial and solid attributes Volume(const std::string& name, const Solid& s, const Material& m); + /// Assignment operator (must match copy constructor) + Volume& operator=(const Volume& a) { m_element=a.m_element; return *this; } + /// Place daughter volume. The position and rotation are the identity PlacedVolume placeVolume(const Volume& vol) const { return placeVolume(vol,IdentityPos()); } @@ -201,6 +209,9 @@ namespace DD4hep { /// Constructor to be used when creating a new geometry tree. Assembly(const std::string& name); + + /// Assignment operator (must match copy constructor) + Assembly& operator=(const Assembly& a) { m_element=a.m_element; return *this; } }; } /* End namespace Geometry */ diff --git a/DDCore/include/XML/XMLDetector.h b/DDCore/include/XML/XMLDetector.h index 283245d0d52d428819663a2951ea58faf19c2ee1..be8e13b8e3f84feb4567e6c186521e6847e37091 100644 --- a/DDCore/include/XML/XMLDetector.h +++ b/DDCore/include/XML/XMLDetector.h @@ -10,7 +10,7 @@ #define DD4HEP_XMLDETECTOR_H // Framework include files -#include "XML/XMLTags.h" +#include "XML/XMLDimension.h" /* * DD4hep namespace declaration @@ -22,329 +22,6 @@ namespace DD4hep { */ namespace XML { - - /** @class Dimension XMLDetector.h XML/XMLDetector.h - * - * Helper class to access any field in a xml tag in a - * very easy way. - * - You may assign any xml handle to a dimension object - * - Any attribute of this xml element may then be accessed - * by it's natural way. All possible attribute names are - * reflected by the Dimmension object's member functions. - * - If an attribute is requested and not present, a exception - * is thrown. - * - Functions, which accept a default value do NOT throw - * an exception if the attribute is not present. These - * rather return the default value. - * - If a often used function is not present - the - * implementation thereof is simple. - * - * @author M.Frank - * @version 1.0 - */ - struct Dimension : public Element { - /// Default constructor - Dimension() : Element(Handle_t(0)) {} - /// Constructor from Handle - Dimension(Handle_t e) : Element(e) {} - /// Constructor from Element - Dimension(const Element& e) : Element(e) {} - - /// Access parameters: id - int id() const; - /// Access parameters: id, if not present returns default - int id(int default_value) const; - - /// Access parameters: type - int type() const; - /// Access rotation constants: combineHits - bool combineHits() const; - - /// Access rotation constants: angle - double angle() const; - /// Access rotation constants: angle - double alpha() const; - /// Access rotation constants: angle - double beta() const; - /// Access rotation constants: angle - double gamma() const; - /// Access rotation constants: angle - double delta() const; - /// Access rotation constants: angle - double epsilon() const; - /// Access rotation constants: theta - double theta() const; - /// Access rotation constants: thetaBins - int thetaBins() const; - - /// Access rotation constants: phi - double phi() const; - /// Access rotation constants: phiBins - int phiBins() const; - /// Access rotation constants: phi0 - double phi0() const; - /// Access parameters: phi0, if not present returns default - double phi0(double default_value) const; - /// Access rotation constants: psi - double psi() const; - - /// Access Tube parameters: zhalf - double zhalf() const; - /// Access Tube parameters: deltaphi - double deltaphi() const; - - /// Access parameters: b - double b() const; - /// Access parameters: B - double B() const; - /// Access parameters: g - double g() const; - /// Access parameters: G - double G() const; - - /// Access parameters: r - double r() const; - /// Access parameters: r, if not present returns default - double r(double default_value) const; - /// Access parameters: R - double R() const; - /// Access parameters: dr - double dr() const; - /// Access parameters: r0 - double r0() const; - /// Access parameters: dr, if not present returns default - double dr(double default_value) const; - /// Access min/max parameters: rmin - double rmin() const; - /// Access min/max parameters: rmax - double rmax() const; - /// Access min/max parameters: rmin1 - double rmin1() const; - /// Access min/max parameters: rmax1 - double rmax1() const; - /// Access min/max parameters: rmin2 - double rmin2() const; - /// Access min/max parameters: rmax2 - double rmax2() const; - /// Access parameters: radius - double radius() const; - /// Access attribute values: outer_radius - double outer_radius() const; - /// Access attribute values: outer_r - double outer_r() const; - /// Access attribute values: inner_radius - double inner_radius() const; - /// Access attribute values: inner_r - double inner_r() const; - - /// Access parameters: x - double x() const; - /// Access parameters: x, if not present returns default - double x(double default_val) const; - /// Access parameters: X - double X() const; - /// Access parameters: x0 - double x0() const; - /// Access parameters: x1 - double x1() const; - /// Access parameters: x2 - double x2() const; - /// Access parameters: dx - double dx() const; - /// Access parameters: dx, if not present returns default - double dx(double default_value) const; - /// Access min/max parameters: xmax - double xmin() const; - /// Access min/max parameters: xmax - double xmax() const; - /// Access min/max parameters: x_offset - double x_offset() const; - /// Access min/max parameters: dim_x - double dim_x() const; - - /// Access parameters: y - double y() const; - /// Access parameters: y, if not present returns default - double y(double default_val) const; - /// Access parameters: Y - double Y() const; - /// Access parameters: y0 - double y0() const; - /// Access parameters: y1 - double y1() const; - /// Access parameters: y2 - double y2() const; - /// Access parameters: dy - double dy() const; - /// Access parameters: dz, if not present returns default - double dy(double default_value) const; - /// Access min/max parameters: ymax - double ymin() const; - /// Access min/max parameters: ymax - double ymax() const; - /// Access min/max parameters: y_offset - double y_offset() const; - /// Access min/max parameters: dim_y - double dim_y() const; - - /// Access parameters: z - double z() const; - /// Access parameters: z, if not present returns default - double z(double default_val) const; - /// Access parameters: Z - double Z() const; - /// Access parameters: z0 - double z0() const; - /// Access parameters: z1 - double z1() const; - /// Access parameters: z2 - double z2() const; - /// Access parameters: dz - double dz() const; - /// Access parameters: dz, if not present returns default - double dz(double default_value) const; - /// Access min/max parameters: zmax - double zmin() const; - /// Access min/max parameters: zmax - double zmax() const; - /// Access attribute values: outer_z - double outer_z() const; - /// Access attribute values: inner_z - double inner_z() const; - /// Access min/max parameters: z_offset - double z_offset() const; - /// Access min/max parameters: dim_z - double dim_z() const; - - /// Access attribute values: length - double length() const; - /// Access attribute values: width - double width() const; - /// Access attribute values: height - double height() const; - /// Access attribute values: depth - double depth() const; - /// Access attribute values: thickness - double thickness() const; - - /// Access attribute values: z_length - double z_length() const; - /// Access attribute values: gap - double gap() const; - /// Access attribute values: r_size - double r_size() const; - /// Access attribute values: phi_size_max - double phi_size_max() const; - /// Access attribute values: reflect - bool reflect() const; - /// Access attribute values: reflect - bool reflect(bool default_value) const; - /// Access attribute values: crossing_angle - double crossing_angle() const; - /// Access attribute values: repeat - int repeat() const; - - /// Access attribute values: outgoing_r - double outgoing_r() const; - /// Access attribute values: incoming_r - double incoming_r() const; - /// Access attribute values: offset - double offset() const; - /// Access attribute values: offset - double offset(double default_value) const; - /// Access attribute values: number - int number() const; - - /// Access attribute values: nmodules - int nmodules() const; - /// Access attribute values: nModules - int nModules() const; - /// Access attribute values: RowID - int RowID() const; - /// Access attribute values: moduleHeight - double moduleHeight() const; - /// Access attribute values: moduleWidth - double moduleWidth() const; - /// Access attribute values: modulePitch - double modulePitch() const; - /// Access attribute values: modulePosX - double modulePosX() const; - /// Access attribute values: modulePosY - double modulePosY() const; - - /// Access attribute values: nPads - int nPads() const; - /// Access attribute values: rowPitch - double rowPitch() const; - /// Access attribute values: padPitch - double padPitch() const; - /// Access attribute values: rowHeight - double rowHeight() const; - /// Access attribute values: padType - std::string padType() const; - - /// Access attribute values: numsides - int numsides() const; - - /// Access attribute values: phi_tilt - double phi_tilt() const; - /// Access attribute values: nphi - int nphi() const; - /// Access attribute values: rc - double rc() const; - - /// Access attribute values: zstart - double zstart() const; - /// Access attribute values: nz - int nz() const; - - /// Access attribute values: start - double start() const; - /// Access attribute values: end - double end() const; - /// Access attribute values: inner_field - double inner_field() const; - /// Access attribute values: outer_field - double outer_field() const; - - /// Access attribute values: visible - bool visible() const; - /// Access attribute values: show_daughters - bool show_daughters() const; - - /// Access child element with tag "dimensions" as Dimension object - Dimension dimensions(bool throw_if_not_present=true) const; - /// Child access: position - Dimension position(bool throw_if_not_present=true) const; - /// Child access: rotation - Dimension rotation(bool throw_if_not_present=true) const; - /// Child access: trd - Dimension trd(bool throw_if_not_present=true) const; - /// Child access: tubs - Dimension tubs(bool throw_if_not_present=true) const; - /// Child access: staves - Dimension staves(bool throw_if_not_present=true) const; - /// Child access: beampipe - Dimension beampipe(bool throw_if_not_present=true) const; - - /// Access name attribute as STL string - std::string nameStr() const; - /// Access ref attribute as a string - std::string refStr() const; - /// Access type attribute as STL string - std::string typeStr() const; - /// Access module attribute as STL string - std::string moduleStr() const; - /// Access readout attribute as STL string - std::string readoutStr() const; - /// Access vis attribute as STL string. If not present empty return empty string - std::string visStr() const; - /// Access region attribute as STL string. If not present empty return empty string - std::string regionStr() const; - /// Access limits attribute as STL string. If not present empty return empty string - std::string limitsStr() const; - }; - /** @class DetElement::Component XMLDetector.h XML/XMLDetector.h * * Helper class to access any field in a xml tag. diff --git a/DDCore/include/XML/XMLDimension.h b/DDCore/include/XML/XMLDimension.h new file mode 100644 index 0000000000000000000000000000000000000000..b5fc9cd2bb0a7641f6edbae6d5fac6238838e059 --- /dev/null +++ b/DDCore/include/XML/XMLDimension.h @@ -0,0 +1,349 @@ +// $Id: XMLDetector.h 513 2013-04-05 14:31:53Z gaede $ +//==================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== +#ifndef DD4HEP_XMLDIMENSION_H +#define DD4HEP_XMLDIMENSION_H + +// Framework include files +#include "XML/XMLTags.h" + +/* + * DD4hep namespace declaration + */ +namespace DD4hep { + + /* + * XML namespace declaration + */ + namespace XML { + + + /** @class Dimension XMLDetector.h XML/XMLDetector.h + * + * Helper class to access any field in a xml tag in a + * very easy way. + * - You may assign any xml handle to a dimension object + * - Any attribute of this xml element may then be accessed + * by it's natural way. All possible attribute names are + * reflected by the Dimmension object's member functions. + * - If an attribute is requested and not present, a exception + * is thrown. + * - Functions, which accept a default value do NOT throw + * an exception if the attribute is not present. These + * rather return the default value. + * - If a often used function is not present - the + * implementation thereof is simple. + * + * @author M.Frank + * @version 1.0 + */ + struct Dimension : public Element { + /// Default constructor + Dimension() : Element(Handle_t(0)) {} + /// Constructor from Handle + Dimension(Handle_t e) : Element(e) {} + /// Constructor from Element + Dimension(const Element& e) : Element(e) {} + + /// Access parameters: id + int id() const; + /// Access parameters: id, if not present returns default + int id(int default_value) const; + + /// Access parameters: type + int type() const; + /// Access rotation constants: combineHits + bool combineHits() const; + + /// Access rotation constants: angle + double angle() const; + /// Access rotation constants: angle + double alpha() const; + /// Access rotation constants: angle + double beta() const; + /// Access rotation constants: angle + double gamma() const; + /// Access rotation constants: angle + double delta() const; + /// Access rotation constants: angle + double epsilon() const; + /// Access rotation constants: theta + double theta() const; + /// Access rotation constants: thetaBins + int thetaBins() const; + + /// Access rotation constants: phi + double phi() const; + /// Access rotation constants: phiBins + int phiBins() const; + /// Access rotation constants: phi0 + double phi0() const; + /// Access parameters: phi0, if not present returns default + double phi0(double default_value) const; + /// Access rotation constants: psi + double psi() const; + + /// Access Tube parameters: zhalf + double zhalf() const; + /// Access Tube parameters: deltaphi + double deltaphi() const; + + /// Access parameters: b + double b() const; + /// Access parameters: B + double B() const; + /// Access parameters: g + double g() const; + /// Access parameters: G + double G() const; + + /// Access parameters: r + double r() const; + /// Access parameters: r, if not present returns default + double r(double default_value) const; + /// Access parameters: R + double R() const; + /// Access parameters: dr + double dr() const; + /// Access parameters: r0 + double r0() const; + /// Access parameters: dr, if not present returns default + double dr(double default_value) const; + /// Access min/max parameters: rmin + double rmin() const; + /// Access min/max parameters: rmax + double rmax() const; + /// Access min/max parameters: rmin1 + double rmin1() const; + /// Access min/max parameters: rmax1 + double rmax1() const; + /// Access min/max parameters: rmin2 + double rmin2() const; + /// Access min/max parameters: rmax2 + double rmax2() const; + /// Access parameters: radius + double radius() const; + /// Access attribute values: outer_radius + double outer_radius() const; + /// Access attribute values: outer_r + double outer_r() const; + /// Access attribute values: inner_radius + double inner_radius() const; + /// Access attribute values: inner_r + double inner_r() const; + + /// Access parameters: x + double x() const; + /// Access parameters: x, if not present returns default + double x(double default_val) const; + /// Access parameters: X + double X() const; + /// Access parameters: x0 + double x0() const; + /// Access parameters: x1 + double x1() const; + /// Access parameters: x2 + double x2() const; + /// Access parameters: dx + double dx() const; + /// Access parameters: dx, if not present returns default + double dx(double default_value) const; + /// Access min/max parameters: xmax + double xmin() const; + /// Access min/max parameters: xmax + double xmax() const; + /// Access min/max parameters: x_offset + double x_offset() const; + /// Access min/max parameters: dim_x + double dim_x() const; + + /// Access parameters: y + double y() const; + /// Access parameters: y, if not present returns default + double y(double default_val) const; + /// Access parameters: Y + double Y() const; + /// Access parameters: y0 + double y0() const; + /// Access parameters: y1 + double y1() const; + /// Access parameters: y2 + double y2() const; + /// Access parameters: dy + double dy() const; + /// Access parameters: dz, if not present returns default + double dy(double default_value) const; + /// Access min/max parameters: ymax + double ymin() const; + /// Access min/max parameters: ymax + double ymax() const; + /// Access min/max parameters: y_offset + double y_offset() const; + /// Access min/max parameters: dim_y + double dim_y() const; + + /// Access parameters: z + double z() const; + /// Access parameters: z, if not present returns default + double z(double default_val) const; + /// Access parameters: Z + double Z() const; + /// Access parameters: z0 + double z0() const; + /// Access parameters: z1 + double z1() const; + /// Access parameters: z2 + double z2() const; + /// Access parameters: dz + double dz() const; + /// Access parameters: dz, if not present returns default + double dz(double default_value) const; + /// Access min/max parameters: zmax + double zmin() const; + /// Access min/max parameters: zmax + double zmax() const; + /// Access attribute values: outer_z + double outer_z() const; + /// Access attribute values: inner_z + double inner_z() const; + /// Access min/max parameters: z_offset + double z_offset() const; + /// Access min/max parameters: dim_z + double dim_z() const; + + /// Access attribute values: length + double length() const; + /// Access attribute values: width + double width() const; + /// Access attribute values: height + double height() const; + /// Access attribute values: depth + double depth() const; + /// Access attribute values: thickness + double thickness() const; + + /// Access attribute values: z_length + double z_length() const; + /// Access attribute values: gap + double gap() const; + /// Access attribute values: r_size + double r_size() const; + /// Access attribute values: phi_size_max + double phi_size_max() const; + /// Access attribute values: reflect + bool reflect() const; + /// Access attribute values: reflect + bool reflect(bool default_value) const; + /// Access attribute values: crossing_angle + double crossing_angle() const; + /// Access attribute values: repeat + int repeat() const; + + /// Access attribute values: outgoing_r + double outgoing_r() const; + /// Access attribute values: incoming_r + double incoming_r() const; + /// Access attribute values: offset + double offset() const; + /// Access attribute values: offset + double offset(double default_value) const; + /// Access attribute values: number + int number() const; + + /// Access attribute values: nmodules + int nmodules() const; + /// Access attribute values: nModules + int nModules() const; + /// Access attribute values: RowID + int RowID() const; + /// Access attribute values: moduleHeight + double moduleHeight() const; + /// Access attribute values: moduleWidth + double moduleWidth() const; + /// Access attribute values: modulePitch + double modulePitch() const; + /// Access attribute values: modulePosX + double modulePosX() const; + /// Access attribute values: modulePosY + double modulePosY() const; + + /// Access attribute values: nPads + int nPads() const; + /// Access attribute values: rowPitch + double rowPitch() const; + /// Access attribute values: padPitch + double padPitch() const; + /// Access attribute values: rowHeight + double rowHeight() const; + /// Access attribute values: padType + std::string padType() const; + + /// Access attribute values: numsides + int numsides() const; + + /// Access attribute values: phi_tilt + double phi_tilt() const; + /// Access attribute values: nphi + int nphi() const; + /// Access attribute values: rc + double rc() const; + + /// Access attribute values: zstart + double zstart() const; + /// Access attribute values: nz + int nz() const; + + /// Access attribute values: start + double start() const; + /// Access attribute values: end + double end() const; + /// Access attribute values: inner_field + double inner_field() const; + /// Access attribute values: outer_field + double outer_field() const; + + /// Access attribute values: visible + bool visible() const; + /// Access attribute values: show_daughters + bool show_daughters() const; + + /// Access child element with tag "dimensions" as Dimension object + Dimension dimensions(bool throw_if_not_present=true) const; + /// Child access: position + Dimension position(bool throw_if_not_present=true) const; + /// Child access: rotation + Dimension rotation(bool throw_if_not_present=true) const; + /// Child access: trd + Dimension trd(bool throw_if_not_present=true) const; + /// Child access: tubs + Dimension tubs(bool throw_if_not_present=true) const; + /// Child access: staves + Dimension staves(bool throw_if_not_present=true) const; + /// Child access: beampipe + Dimension beampipe(bool throw_if_not_present=true) const; + + /// Access name attribute as STL string + std::string nameStr() const; + /// Access ref attribute as a string + std::string refStr() const; + /// Access type attribute as STL string + std::string typeStr() const; + /// Access module attribute as STL string + std::string moduleStr() const; + /// Access readout attribute as STL string + std::string readoutStr() const; + /// Access vis attribute as STL string. If not present empty return empty string + std::string visStr() const; + /// Access region attribute as STL string. If not present empty return empty string + std::string regionStr() const; + /// Access limits attribute as STL string. If not present empty return empty string + std::string limitsStr() const; + }; + } /* End namespace XML */ +} /* End namespace DD4hep */ +#endif /* DD4HEP_XMLDIMENSION_H */ diff --git a/DDCore/include/XML/XMLElements.h b/DDCore/include/XML/XMLElements.h index d52a0cb8e986c04828d10442764e1e392b9c6a26..e5dd0f19ecd8cb8ee324cf85947d2d5de90e2e0c 100644 --- a/DDCore/include/XML/XMLElements.h +++ b/DDCore/include/XML/XMLElements.h @@ -636,6 +636,8 @@ namespace DD4hep { RefElement(const RefElement& e); /// Initializing constructor to create a new XMLElement and add it to the document. RefElement(const Document& d, const XmlChar* type, const XmlChar* name); + /// Assignment operator + RefElement& operator=(const RefElement& e); /// Access the object's name in unicode const XmlChar* name() const; /// Access the object's reference name in unicode (same as name) diff --git a/DDCore/include/XML/XMLTags.h b/DDCore/include/XML/XMLTags.h index 73ed57e99c945f46efec974ba230197f0408a121..ce7e7c432d2e7fc945151dd374ef69e366c74499 100644 --- a/DDCore/include/XML/XMLTags.h +++ b/DDCore/include/XML/XMLTags.h @@ -9,6 +9,8 @@ #ifndef DD4hep_XML_TAGS_H #define DD4hep_XML_TAGS_H +#define DECLARE_UNICODE_TAG(x) namespace DD4hep { namespace XML { extern const Tag_t Unicode_##x (#x); }} + #include "XML/XMLElements.h" #define UNICODE(x) extern const Tag_t Unicode_##x #include "XML/UnicodeValues.h" diff --git a/DDCore/include/XML/tinyxml.h b/DDCore/include/XML/tinyxml.h index 600ac5f0bd5b483e810672a8dbaed2b2a89378ef..4dc88f3b088a2062169b2989e077d26da68ea458 100644 --- a/DDCore/include/XML/tinyxml.h +++ b/DDCore/include/XML/tinyxml.h @@ -134,23 +134,23 @@ public: virtual ~TiXmlVisitor() {} /// Visit a document. - virtual bool VisitEnter( const TiXmlDocument& doc ) { return true; } + virtual bool VisitEnter( const TiXmlDocument& /* doc */) { return true; } /// Visit a document. - virtual bool VisitExit( const TiXmlDocument& doc ) { return true; } + virtual bool VisitExit( const TiXmlDocument& /* doc */) { return true; } /// Visit an element. - virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) { return true; } + virtual bool VisitEnter( const TiXmlElement& /* element */, const TiXmlAttribute* /* firstAttribute */ ) { return true; } /// Visit an element. - virtual bool VisitExit( const TiXmlElement& element ) { return true; } + virtual bool VisitExit( const TiXmlElement& /* element */ ) { return true; } /// Visit a declaration - virtual bool Visit( const TiXmlDeclaration& declaration ) { return true; } + virtual bool Visit( const TiXmlDeclaration& /* declaration */ ) { return true; } /// Visit a text node - virtual bool Visit( const TiXmlText& text ) { return true; } + virtual bool Visit( const TiXmlText& /* text */ ) { return true; } /// Visit a comment node - virtual bool Visit( const TiXmlComment& comment ) { return true; } + virtual bool Visit( const TiXmlComment& /* comment */ ) { return true; } /// Visit an unknow node - virtual bool Visit( const TiXmlUnknown& unknown ) { return true; } + virtual bool Visit( const TiXmlUnknown& /* unknown */ ) { return true; } }; // Only used by Attribute::Query functions diff --git a/DDCore/src/GeoHandler.cpp b/DDCore/src/GeoHandler.cpp index 62803c1cfcbce1e871776695cec13b3ca407e830..a34d6bf4fe7abe348fe07bf29e7e15eb54fc211c 100644 --- a/DDCore/src/GeoHandler.cpp +++ b/DDCore/src/GeoHandler.cpp @@ -74,27 +74,29 @@ GeoHandler& GeoHandler::collect(DetElement element, GeometryInfo& info) { for(Data::mapped_type::const_iterator j=v.begin(); j != v.end(); ++j) { const TGeoNode* n = *j; TGeoVolume* v = n->GetVolume(); - TGeoMedium* m = v->GetMedium(); - Volume vol = Ref_t(v); - VisAttr vis = vol.visAttributes(); - //Region reg = vol.region(); - //LimitSet lim = vol.limitSet(); - //SensitiveDetector det = vol.sensitiveDetector(); - - // Note : assemblies and the world do not have a real volume nor a material - if ( v && info.volumeSet.find(v) == info.volumeSet.end() ) { - info.volumeSet.insert(v); - info.volumes.push_back(v); + if ( v ) { + TGeoMedium* m = v->GetMedium(); + Volume vol = Ref_t(v); + VisAttr vis = vol.visAttributes(); + //Region reg = vol.region(); + //LimitSet lim = vol.limitSet(); + //SensitiveDetector det = vol.sensitiveDetector(); + + // Note : assemblies and the world do not have a real volume nor a material + if ( info.volumeSet.find(v) == info.volumeSet.end() ) { + info.volumeSet.insert(v); + info.volumes.push_back(v); + } + if ( m ) info.materials.insert(m); + if ( dynamic_cast<Volume::Object*>(v) ) { + if ( vis.isValid() ) info.vis.insert(vis.ptr()); + } + //if ( lim.isValid() ) info.limits[lim.ptr()].insert(v); + //if ( reg.isValid() ) info.regions[reg.ptr()].insert(v); + //if ( det.isValid() ) info.sensitives[det.ptr()].insert(v); + + collectSolid(info,v->GetName(),n->GetName(),v->GetShape(),n->GetMatrix()); } - if ( m ) info.materials.insert(m); - if ( dynamic_cast<Volume::Object*>(v) ) { - if ( vis.isValid() ) info.vis.insert(vis.ptr()); - } - //if ( lim.isValid() ) info.limits[lim.ptr()].insert(v); - //if ( reg.isValid() ) info.regions[reg.ptr()].insert(v); - //if ( det.isValid() ) info.sensitives[det.ptr()].insert(v); - - collectSolid(info,v->GetName(),n->GetName(),v->GetShape(),n->GetMatrix()); } } return *this; diff --git a/DDCore/src/GeometryTreeDump.cpp b/DDCore/src/GeometryTreeDump.cpp index 7c39aa0c565beee51c09e89075b8ca62db7a2483..3048845f2299bfdf26797182ab590ca9f71a31d6 100644 --- a/DDCore/src/GeometryTreeDump.cpp +++ b/DDCore/src/GeometryTreeDump.cpp @@ -276,7 +276,7 @@ static void dumpStructure(PlacedVolume pv, int level) { _path += "/"; _path += current->GetName(); - ::sprintf(fmt, "%%4d %%%ds %%7s %%s\n",level*2+5); + ::snprintf(fmt, sizeof(fmt), "%%4d %%%ds %%7s %%s\n", level*2+5); ::printf(fmt,level,""," ->LV: ",volume->GetName()); ::printf(fmt,level,""," ->PV: ",current->GetName()); ::printf(fmt,level,""," ->path:",_path.c_str()); @@ -296,7 +296,7 @@ static void dumpDetectors(DetElement parent,int level) { _path += "/"; _path += parent.name(); - ::sprintf(fmt, "%%4d %%%ds %%7s %%s\n",level*2+5); + ::snprintf(fmt, sizeof(fmt), "%%4d %%%ds %%7s %%s\n",level*2+5); ::printf(fmt,level,"","->path:",_path.c_str()); if ( pl.isValid() ) { ::printf(fmt,level,""," ->placement:",parent.placementPath().c_str()); diff --git a/DDCore/src/Handle.cpp b/DDCore/src/Handle.cpp index 30b1f4fc114d92fd020d37a5b242b2722ea1ac5d..78c949db9914119066a37b18cab15c1521f4a800 100644 --- a/DDCore/src/Handle.cpp +++ b/DDCore/src/Handle.cpp @@ -110,25 +110,25 @@ void DD4hep::Geometry::_toDictionary(const string& name, const string& value) { string DD4hep::Geometry::_toString(bool value) { char text[32]; - ::sprintf(text,"%s",value ? "true" : "false"); + ::snprintf(text,sizeof(text),"%s",value ? "true" : "false"); return text; } string DD4hep::Geometry::_toString(int value) { char text[32]; - ::sprintf(text,"%d",value); + ::snprintf(text,sizeof(text),"%d",value); return text; } string DD4hep::Geometry::_toString(float value) { char text[32]; - ::sprintf(text,"%f",value); + ::snprintf(text,sizeof(text),"%f",value); return text; } string DD4hep::Geometry::_toString(double value) { char text[32]; - ::sprintf(text,"%f",value); + ::snprintf(text,sizeof(text),"%f",value); return text; } namespace DD4hep { namespace Geometry { diff --git a/DDCore/src/LCDDImp.h b/DDCore/src/LCDDImp.h index 4bd9508daba5eeb8020744dfb0dac842e1d87f44..e2a54a00536046bbe96a4d10fec503c5e35c60b3 100644 --- a/DDCore/src/LCDDImp.h +++ b/DDCore/src/LCDDImp.h @@ -30,6 +30,12 @@ namespace DD4hep { namespace Geometry { class LCDDImp : public LCDD { + private: + /// Disable copy constructor + LCDDImp(const LCDDImp&) {} + /// Disable assignment operator + LCDDImp& operator=(const LCDDImp&) { return *this; } + public: struct InvalidObjectError : public std::runtime_error { InvalidObjectError(const std::string& msg) : std::runtime_error(msg) {} diff --git a/DDCore/src/Objects.cpp b/DDCore/src/Objects.cpp index 235557e99fcb31b8e4575ca512d4b36b861d0a93..a9425e5f08088f8e0a7c16d503d29b7b67a14c45 100644 --- a/DDCore/src/Objects.cpp +++ b/DDCore/src/Objects.cpp @@ -256,7 +256,8 @@ string VisAttr::toString() const { const VisAttr::Object* obj = &_data(); TColor* col = gROOT->GetColor(obj->color); char text[256]; - ::sprintf(text,"%-20s RGB:%-8s [%d] %7.2f Style:%d %d ShowDaughters:%3s Visible:%3s", + ::snprintf(text,sizeof(text), + "%-20s RGB:%-8s [%d] %7.2f Style:%d %d ShowDaughters:%3s Visible:%3s", ptr()->GetName(),col->AsHexString(), obj->color, col->GetAlpha(), int(obj->drawingStyle), int(obj->lineStyle), obj->showDaughters ? "YES" : "NO", obj->visible ? "YES" : "NO"); @@ -297,11 +298,13 @@ int AlignmentEntry::align(const Position& pos, const Rotation& rot, bool check, /// Assignment operator Limit& Limit::operator=(const Limit& c) { - particles = c.particles; - name = c.name; - unit = c.unit; - value = c.value; - content = c.content; + if ( this != &c ) { + particles = c.particles; + name = c.name; + unit = c.unit; + value = c.value; + content = c.content; + } return *this; } diff --git a/DDCore/src/Segementations.cpp b/DDCore/src/Segementations.cpp index 646ee9d82578da9b050a9310a5e6eb5a80cf5a0e..047401cd28d5180485921be7160515a029605793 100644 --- a/DDCore/src/Segementations.cpp +++ b/DDCore/src/Segementations.cpp @@ -13,8 +13,11 @@ using namespace std; using namespace DD4hep::Geometry; -Segmentation::Object::Object() : magic(magic_word()), type(REGULAR), useForHitPosition(0) { +Segmentation::Object::Object() +: magic(magic_word()), type(REGULAR), useForHitPosition(0) +{ ::memset(data.values,0,sizeof(data.values)); + _spare[5]=_spare[4]=_spare[3]=_spare[2]=_spare[1]=_spare[0]=0; } Segmentation::Object::~Object() { diff --git a/DDCore/src/Shapes.cpp b/DDCore/src/Shapes.cpp index 9bf0e3d690d2ef1c76a201cd4db59a891fd5fd74..e6805bde0e462dd647f8cb5fc38e4a6abfa49651 100644 --- a/DDCore/src/Shapes.cpp +++ b/DDCore/src/Shapes.cpp @@ -63,7 +63,7 @@ void Box::make(const string& name, double x, double y, double z) { _assign(new TGeoBBox(x*MM_2_CM,y*MM_2_CM,z*MM_2_CM),name,"box"); } -/// Set the box dimensions +/// Set the box dimensionsy Box& Box::setDimensions(double x, double y, double z) { double params[] = {x*MM_2_CM,y*MM_2_CM,z*MM_2_CM}; _setDimensions(params); diff --git a/DDCore/src/XML/DocumentHandler.cpp b/DDCore/src/XML/DocumentHandler.cpp index 03e0ef4ed20b9c3473d7d840762713894dc2d0d9..aa666c520772bb1c661d6ab001c8b49a7d084d0c 100644 --- a/DDCore/src/XML/DocumentHandler.cpp +++ b/DDCore/src/XML/DocumentHandler.cpp @@ -290,7 +290,7 @@ Document DocumentHandler::load(const string& fname) const { } /// Parse a standalong XML string into a document. -Document DocumentHandler::parse(const char* doc_string, size_t length) const { +Document DocumentHandler::parse(const char* doc_string, size_t /* length */) const { TiXmlDocument* doc = new TiXmlDocument(); try { if ( 0 == doc->Parse(doc_string) ) { diff --git a/DDCore/src/XML/XMLDetector.cpp b/DDCore/src/XML/XMLDetector.cpp index d8a254dfa2c8bc3088ab88ab87506f2f0e3327ec..4cddd3658a88191d702ed5c7383b8d9786f0e95c 100644 --- a/DDCore/src/XML/XMLDetector.cpp +++ b/DDCore/src/XML/XMLDetector.cpp @@ -1,202 +1,17 @@ +// $Id$ +//==================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== +// Framework include files #include "XML/XMLDetector.h" using namespace std; using namespace DD4hep::XML; -#define XML_ATTR_ACCESSOR(type,name) type Dimension::name() const { return m_element.attr<type>(Unicode_##name); } -#define XML_ATTR_ACCESSOR_DOUBLE(name) \ - double Dimension::name(double default_val) const { \ - const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name); \ - return val ? _toDouble(val) : default_val; } -#define XML_ATTR_ACCESSOR_INT(name) \ - int Dimension::name(int default_val) const { \ - const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name); \ - return val ? _toInt(val) : default_val; } -#define XML_ATTR_ACCESSOR_BOOL(name) \ - bool Dimension::name(bool default_val) const { \ - const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name); \ - return val ? _toBool(val) : default_val; } - -#define XML_CHILD_ACCESSOR_XML_DIM(name) \ - Dimension Dimension::name(bool throw_if_not_present) const { \ - return m_element.child(Unicode_##name,throw_if_not_present); } - -XML_ATTR_ACCESSOR(int,id) - XML_ATTR_ACCESSOR_INT(id) - XML_ATTR_ACCESSOR(bool,combineHits) - - XML_ATTR_ACCESSOR(double,x) - XML_ATTR_ACCESSOR_DOUBLE(x) - XML_ATTR_ACCESSOR(double,X) - XML_ATTR_ACCESSOR(double,dx) - XML_ATTR_ACCESSOR_DOUBLE(dx) - XML_ATTR_ACCESSOR(double,x0) - XML_ATTR_ACCESSOR(double,x1) - XML_ATTR_ACCESSOR(double,x2) - XML_ATTR_ACCESSOR(double,xmin) - XML_ATTR_ACCESSOR(double,xmax) - XML_ATTR_ACCESSOR(double,x_offset) - XML_ATTR_ACCESSOR(double,dim_x) - - XML_ATTR_ACCESSOR(double,y) - XML_ATTR_ACCESSOR_DOUBLE(y) - XML_ATTR_ACCESSOR(double,Y) - XML_ATTR_ACCESSOR(double,dy) - XML_ATTR_ACCESSOR_DOUBLE(dy) - XML_ATTR_ACCESSOR(double,y0) - XML_ATTR_ACCESSOR(double,y1) - XML_ATTR_ACCESSOR(double,y2) - XML_ATTR_ACCESSOR(double,ymin) - XML_ATTR_ACCESSOR(double,ymax) - XML_ATTR_ACCESSOR(double,y_offset) - XML_ATTR_ACCESSOR(double,dim_y) - - XML_ATTR_ACCESSOR(double,z) - XML_ATTR_ACCESSOR_DOUBLE(z) - XML_ATTR_ACCESSOR(double,Z) - XML_ATTR_ACCESSOR(double,dz) - XML_ATTR_ACCESSOR_DOUBLE(dz) - XML_ATTR_ACCESSOR(double,z0) - XML_ATTR_ACCESSOR(double,z1) - XML_ATTR_ACCESSOR(double,z2) - XML_ATTR_ACCESSOR(double,zmin) - XML_ATTR_ACCESSOR(double,zmax) - XML_ATTR_ACCESSOR(double,z_offset) - XML_ATTR_ACCESSOR(double,dim_z) - XML_ATTR_ACCESSOR(double,outer_z) - XML_ATTR_ACCESSOR(double,inner_z) - - XML_ATTR_ACCESSOR(double,b) - XML_ATTR_ACCESSOR(double,g) - XML_ATTR_ACCESSOR(double,B) - XML_ATTR_ACCESSOR(double,G) - XML_ATTR_ACCESSOR(double,r) - XML_ATTR_ACCESSOR_DOUBLE(r) - XML_ATTR_ACCESSOR(double,R) - XML_ATTR_ACCESSOR(double,dr) - XML_ATTR_ACCESSOR(double,rmin) - XML_ATTR_ACCESSOR(double,rmax) - XML_ATTR_ACCESSOR(double,radius) - XML_ATTR_ACCESSOR(double,outer_r) - XML_ATTR_ACCESSOR(double,outer_radius) - XML_ATTR_ACCESSOR(double,inner_r) - XML_ATTR_ACCESSOR(double,inner_radius) - - XML_ATTR_ACCESSOR(double,angle) - XML_ATTR_ACCESSOR(double,alpha) - XML_ATTR_ACCESSOR(double,beta) - XML_ATTR_ACCESSOR(double,gamma) - XML_ATTR_ACCESSOR(double,delta) - XML_ATTR_ACCESSOR(double,epsilon) - XML_ATTR_ACCESSOR(double,theta) - XML_ATTR_ACCESSOR(int,thetaBins) - XML_ATTR_ACCESSOR(double,psi) - XML_ATTR_ACCESSOR(double,phi) - XML_ATTR_ACCESSOR(int,phiBins) - XML_ATTR_ACCESSOR(double,phi0) - XML_ATTR_ACCESSOR_DOUBLE(phi0) - XML_ATTR_ACCESSOR(double,deltaphi) - - - XML_ATTR_ACCESSOR(double,length) - XML_ATTR_ACCESSOR(double,width) - XML_ATTR_ACCESSOR(double,height) - XML_ATTR_ACCESSOR(double,depth) - XML_ATTR_ACCESSOR(double,offset) - XML_ATTR_ACCESSOR_DOUBLE(offset) - XML_ATTR_ACCESSOR(double,crossing_angle) - XML_ATTR_ACCESSOR(double,incoming_r) - XML_ATTR_ACCESSOR(double,outgoing_r) - XML_ATTR_ACCESSOR(double,phi_size_max) - XML_ATTR_ACCESSOR(double,r_size) - - XML_ATTR_ACCESSOR(double,gap) - XML_ATTR_ACCESSOR(double,z_length) - XML_ATTR_ACCESSOR(double,zhalf) - XML_ATTR_ACCESSOR(double,phi_tilt) - XML_ATTR_ACCESSOR(int,nphi) - XML_ATTR_ACCESSOR(double,rc) - XML_ATTR_ACCESSOR(int,nz) - XML_ATTR_ACCESSOR(double,zstart) - XML_ATTR_ACCESSOR(double,start) - XML_ATTR_ACCESSOR(double,end) - XML_ATTR_ACCESSOR(double,thickness) - XML_ATTR_ACCESSOR(int,numsides) - XML_ATTR_ACCESSOR(int,number) - XML_ATTR_ACCESSOR(int,repeat) - XML_ATTR_ACCESSOR(bool,reflect) - XML_ATTR_ACCESSOR_BOOL(reflect) - - XML_ATTR_ACCESSOR(int,nmodules) - XML_ATTR_ACCESSOR(int,nModules) - XML_ATTR_ACCESSOR(int,RowID) - XML_ATTR_ACCESSOR(int,nPads) - XML_ATTR_ACCESSOR(double,moduleHeight) - XML_ATTR_ACCESSOR(double,moduleWidth) - XML_ATTR_ACCESSOR(double,modulePosX) - XML_ATTR_ACCESSOR(double,modulePosY) - XML_ATTR_ACCESSOR(double,modulePitch) - XML_ATTR_ACCESSOR(double,rowPitch) - XML_ATTR_ACCESSOR(double,padPitch) - XML_ATTR_ACCESSOR(double,rowHeight) - XML_ATTR_ACCESSOR(double,inner_field) - XML_ATTR_ACCESSOR(double,outer_field) - XML_ATTR_ACCESSOR(int,type) - - XML_ATTR_ACCESSOR(bool,visible) - XML_ATTR_ACCESSOR(bool,show_daughters) -#if 0 - XML_ATTR_ACCESSOR(double,) - XML_ATTR_ACCESSOR(double,) - XML_ATTR_ACCESSOR(double,) - XML_ATTR_ACCESSOR(double,) -#endif - - XML_CHILD_ACCESSOR_XML_DIM(dimensions) - XML_CHILD_ACCESSOR_XML_DIM(position) - XML_CHILD_ACCESSOR_XML_DIM(rotation) - XML_CHILD_ACCESSOR_XML_DIM(trd) - XML_CHILD_ACCESSOR_XML_DIM(tubs) - XML_CHILD_ACCESSOR_XML_DIM(staves) - XML_CHILD_ACCESSOR_XML_DIM(beampipe) - - - string Dimension::padType() const { - return m_element.attr<string>(_U(pads)); -} - -string Dimension::nameStr() const { - return m_element.attr<string>(_U(name)); -} - -string Dimension::refStr() const { - return m_element.attr<string>(_U(ref)); -} - -string Dimension::typeStr() const { - return m_element.attr<string>(_U(type)); -} - -string Dimension::regionStr() const { - return m_element.hasAttr(_U(region)) ? m_element.attr<string>(_U(region)) : string(); -} - -string Dimension::limitsStr() const { - return m_element.hasAttr(_U(limits)) ? m_element.attr<string>(_U(limits)) : string(); -} - -string Dimension::visStr() const { - return m_element.hasAttr(_U(vis)) ? m_element.attr<string>(_U(vis)) : string(); -} - -string Dimension::readoutStr() const { - return m_element.hasAttr(_U(readout)) ? m_element.attr<string>(_U(readout)) : string(); -} - -string Dimension::moduleStr() const { - return m_element.hasAttr(_U(module)) ? m_element.attr<string>(_U(module)) : string(); -} - string Component::materialStr() const { return m_element.attr<string>(_U(material)); } diff --git a/DDCore/src/XML/XMLDimension.cpp b/DDCore/src/XML/XMLDimension.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9048df2e3ae5ea56f32d26caafe0013bbc353363 --- /dev/null +++ b/DDCore/src/XML/XMLDimension.cpp @@ -0,0 +1,207 @@ +// $Id: XMLElements.cpp 513 2013-04-05 14:31:53Z gaede $ +//==================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== +// Framework include files +#include "XML/XMLDimension.h" + +using namespace std; +using namespace DD4hep::XML; + +#define XML_ATTR_ACCESSOR(type,name) type Dimension::name() const { return m_element.attr<type>(Unicode_##name); } +#define XML_ATTR_ACCESSOR_DOUBLE(name) \ + double Dimension::name(double default_val) const { \ + const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name); \ + return val ? _toDouble(val) : default_val; } +#define XML_ATTR_ACCESSOR_INT(name) \ + int Dimension::name(int default_val) const { \ + const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name); \ + return val ? _toInt(val) : default_val; } +#define XML_ATTR_ACCESSOR_BOOL(name) \ + bool Dimension::name(bool default_val) const { \ + const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name); \ + return val ? _toBool(val) : default_val; } + +#define XML_CHILD_ACCESSOR_XML_DIM(name) \ + Dimension Dimension::name(bool throw_if_not_present) const { \ + return m_element.child(Unicode_##name,throw_if_not_present); } + +XML_ATTR_ACCESSOR(int,id) + XML_ATTR_ACCESSOR_INT(id) + XML_ATTR_ACCESSOR(bool,combineHits) + + XML_ATTR_ACCESSOR(double,x) + XML_ATTR_ACCESSOR_DOUBLE(x) + XML_ATTR_ACCESSOR(double,X) + XML_ATTR_ACCESSOR(double,dx) + XML_ATTR_ACCESSOR_DOUBLE(dx) + XML_ATTR_ACCESSOR(double,x0) + XML_ATTR_ACCESSOR(double,x1) + XML_ATTR_ACCESSOR(double,x2) + XML_ATTR_ACCESSOR(double,xmin) + XML_ATTR_ACCESSOR(double,xmax) + XML_ATTR_ACCESSOR(double,x_offset) + XML_ATTR_ACCESSOR(double,dim_x) + + XML_ATTR_ACCESSOR(double,y) + XML_ATTR_ACCESSOR_DOUBLE(y) + XML_ATTR_ACCESSOR(double,Y) + XML_ATTR_ACCESSOR(double,dy) + XML_ATTR_ACCESSOR_DOUBLE(dy) + XML_ATTR_ACCESSOR(double,y0) + XML_ATTR_ACCESSOR(double,y1) + XML_ATTR_ACCESSOR(double,y2) + XML_ATTR_ACCESSOR(double,ymin) + XML_ATTR_ACCESSOR(double,ymax) + XML_ATTR_ACCESSOR(double,y_offset) + XML_ATTR_ACCESSOR(double,dim_y) + + XML_ATTR_ACCESSOR(double,z) + XML_ATTR_ACCESSOR_DOUBLE(z) + XML_ATTR_ACCESSOR(double,Z) + XML_ATTR_ACCESSOR(double,dz) + XML_ATTR_ACCESSOR_DOUBLE(dz) + XML_ATTR_ACCESSOR(double,z0) + XML_ATTR_ACCESSOR(double,z1) + XML_ATTR_ACCESSOR(double,z2) + XML_ATTR_ACCESSOR(double,zmin) + XML_ATTR_ACCESSOR(double,zmax) + XML_ATTR_ACCESSOR(double,z_offset) + XML_ATTR_ACCESSOR(double,dim_z) + XML_ATTR_ACCESSOR(double,outer_z) + XML_ATTR_ACCESSOR(double,inner_z) + + XML_ATTR_ACCESSOR(double,b) + XML_ATTR_ACCESSOR(double,g) + XML_ATTR_ACCESSOR(double,B) + XML_ATTR_ACCESSOR(double,G) + XML_ATTR_ACCESSOR(double,r) + XML_ATTR_ACCESSOR_DOUBLE(r) + XML_ATTR_ACCESSOR(double,R) + XML_ATTR_ACCESSOR(double,dr) + XML_ATTR_ACCESSOR(double,rmin) + XML_ATTR_ACCESSOR(double,rmax) + XML_ATTR_ACCESSOR(double,radius) + XML_ATTR_ACCESSOR(double,outer_r) + XML_ATTR_ACCESSOR(double,outer_radius) + XML_ATTR_ACCESSOR(double,inner_r) + XML_ATTR_ACCESSOR(double,inner_radius) + + XML_ATTR_ACCESSOR(double,angle) + XML_ATTR_ACCESSOR(double,alpha) + XML_ATTR_ACCESSOR(double,beta) + XML_ATTR_ACCESSOR(double,gamma) + XML_ATTR_ACCESSOR(double,delta) + XML_ATTR_ACCESSOR(double,epsilon) + XML_ATTR_ACCESSOR(double,theta) + XML_ATTR_ACCESSOR(int,thetaBins) + XML_ATTR_ACCESSOR(double,psi) + XML_ATTR_ACCESSOR(double,phi) + XML_ATTR_ACCESSOR(int,phiBins) + XML_ATTR_ACCESSOR(double,phi0) + XML_ATTR_ACCESSOR_DOUBLE(phi0) + XML_ATTR_ACCESSOR(double,deltaphi) + + + XML_ATTR_ACCESSOR(double,length) + XML_ATTR_ACCESSOR(double,width) + XML_ATTR_ACCESSOR(double,height) + XML_ATTR_ACCESSOR(double,depth) + XML_ATTR_ACCESSOR(double,offset) + XML_ATTR_ACCESSOR_DOUBLE(offset) + XML_ATTR_ACCESSOR(double,crossing_angle) + XML_ATTR_ACCESSOR(double,incoming_r) + XML_ATTR_ACCESSOR(double,outgoing_r) + XML_ATTR_ACCESSOR(double,phi_size_max) + XML_ATTR_ACCESSOR(double,r_size) + + XML_ATTR_ACCESSOR(double,gap) + XML_ATTR_ACCESSOR(double,z_length) + XML_ATTR_ACCESSOR(double,zhalf) + XML_ATTR_ACCESSOR(double,phi_tilt) + XML_ATTR_ACCESSOR(int,nphi) + XML_ATTR_ACCESSOR(double,rc) + XML_ATTR_ACCESSOR(int,nz) + XML_ATTR_ACCESSOR(double,zstart) + XML_ATTR_ACCESSOR(double,start) + XML_ATTR_ACCESSOR(double,end) + XML_ATTR_ACCESSOR(double,thickness) + XML_ATTR_ACCESSOR(int,numsides) + XML_ATTR_ACCESSOR(int,number) + XML_ATTR_ACCESSOR(int,repeat) + XML_ATTR_ACCESSOR(bool,reflect) + XML_ATTR_ACCESSOR_BOOL(reflect) + + XML_ATTR_ACCESSOR(int,nmodules) + XML_ATTR_ACCESSOR(int,nModules) + XML_ATTR_ACCESSOR(int,RowID) + XML_ATTR_ACCESSOR(int,nPads) + XML_ATTR_ACCESSOR(double,moduleHeight) + XML_ATTR_ACCESSOR(double,moduleWidth) + XML_ATTR_ACCESSOR(double,modulePosX) + XML_ATTR_ACCESSOR(double,modulePosY) + XML_ATTR_ACCESSOR(double,modulePitch) + XML_ATTR_ACCESSOR(double,rowPitch) + XML_ATTR_ACCESSOR(double,padPitch) + XML_ATTR_ACCESSOR(double,rowHeight) + XML_ATTR_ACCESSOR(double,inner_field) + XML_ATTR_ACCESSOR(double,outer_field) + XML_ATTR_ACCESSOR(int,type) + + XML_ATTR_ACCESSOR(bool,visible) + XML_ATTR_ACCESSOR(bool,show_daughters) +#if 0 + XML_ATTR_ACCESSOR(double,) + XML_ATTR_ACCESSOR(double,) + XML_ATTR_ACCESSOR(double,) + XML_ATTR_ACCESSOR(double,) +#endif + + XML_CHILD_ACCESSOR_XML_DIM(dimensions) + XML_CHILD_ACCESSOR_XML_DIM(position) + XML_CHILD_ACCESSOR_XML_DIM(rotation) + XML_CHILD_ACCESSOR_XML_DIM(trd) + XML_CHILD_ACCESSOR_XML_DIM(tubs) + XML_CHILD_ACCESSOR_XML_DIM(staves) + XML_CHILD_ACCESSOR_XML_DIM(beampipe) + + + string Dimension::padType() const { + return m_element.attr<string>(_U(pads)); +} + +string Dimension::nameStr() const { + return m_element.attr<string>(_U(name)); +} + +string Dimension::refStr() const { + return m_element.attr<string>(_U(ref)); +} + +string Dimension::typeStr() const { + return m_element.attr<string>(_U(type)); +} + +string Dimension::regionStr() const { + return m_element.hasAttr(_U(region)) ? m_element.attr<string>(_U(region)) : string(); +} + +string Dimension::limitsStr() const { + return m_element.hasAttr(_U(limits)) ? m_element.attr<string>(_U(limits)) : string(); +} + +string Dimension::visStr() const { + return m_element.hasAttr(_U(vis)) ? m_element.attr<string>(_U(vis)) : string(); +} + +string Dimension::readoutStr() const { + return m_element.hasAttr(_U(readout)) ? m_element.attr<string>(_U(readout)) : string(); +} + +string Dimension::moduleStr() const { + return m_element.hasAttr(_U(module)) ? m_element.attr<string>(_U(module)) : string(); +} diff --git a/DDCore/src/XML/XMLElements.cpp b/DDCore/src/XML/XMLElements.cpp index 198de30cb80e815191bd5fce8cdb1bf47bce9c0e..02d6f8d482b3dcb372eebeb9cdb0909daeaf130f 100644 --- a/DDCore/src/XML/XMLElements.cpp +++ b/DDCore/src/XML/XMLElements.cpp @@ -19,7 +19,7 @@ using namespace std; using namespace DD4hep::XML; -#define INVALID_NODE ~0x0 +static const size_t INVALID_NODE = ~0U; // Forward declarations namespace DD4hep { @@ -417,6 +417,7 @@ const XmlChar* Handle_t::rawValue() const { Handle_t Handle_t::clone(XmlDocument* new_doc) const { if ( m_node ) { #ifdef DD4HEP_USE_TINYXML + if ( new_doc ) {} if ( _N(m_node)->Type() == ELEMENT_NODE_TYPE ) { XmlElement* e = _XE(_N(m_node)->Clone()->ToElement()); if ( e ) return e; @@ -822,7 +823,6 @@ Document Element::document() const { /// Clone the DOM element tree Handle_t Element::clone(Handle_t h) const { if ( m_element && h ) { - Document d = document(); return h.clone(Document::DOC(document())); } throw runtime_error("Element::clone: Invalid element pointer -- unable to clone node!"); @@ -869,23 +869,31 @@ void Element::addComment(const char* text) const { #endif } +/// Initializing constructor to create a new XMLElement and add it to the document. RefElement::RefElement(const Document& document, const XmlChar* type, const XmlChar* name) : Element(document, type) { m_name = name ? setAttr(_U(name),name) : 0; } +/// Construction from existing object handle RefElement::RefElement(const Handle_t& e) : Element(e) { m_name = m_element ? getAttr(_U(name)) : 0; } +/// Copy constructor RefElement::RefElement(const RefElement& e) : Element(e), m_name(e.m_name) { } +/// Assignment operator +RefElement& RefElement::operator=(const RefElement& e) { + m_element = e.m_element; return *this; +} + const XmlChar* RefElement::name() const { if ( 0 == m_name ) cout << "Error:tag=" << m_element.tag() << endl; return attribute_value(m_name); diff --git a/DDCore/src/XML/XMLTags.cpp b/DDCore/src/XML/XMLTags.cpp index d501d37f210b07d3b8db159a7a9b46090c801267..e7a05107278ab82b5997ca41715b9991b5d9506e 100644 --- a/DDCore/src/XML/XMLTags.cpp +++ b/DDCore/src/XML/XMLTags.cpp @@ -30,7 +30,7 @@ namespace { } #endif -#define UNICODE(x) extern const Tag_t Unicode_##x (#x) +#define UNICODE(x) extern const Tag_t Unicode_##x (#x) #include "XML/UnicodeValues.h" namespace DD4hep { namespace XML { diff --git a/DDCore/src/XML/tinyxml_inl.h b/DDCore/src/XML/tinyxml_inl.h index 7997302b7b66ee0bdc63b0a334079097218bbefd..b472d2af045ef0152929f0eed6be66dd16d6364c 100644 --- a/DDCore/src/XML/tinyxml_inl.h +++ b/DDCore/src/XML/tinyxml_inl.h @@ -1292,9 +1292,9 @@ void TiXmlAttribute::SetDoubleValue( double _value ) { char buf [256]; #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "%lf", _value); + TIXML_SNPRINTF( buf, sizeof(buf), "%f", _value); #else - sprintf (buf, "%lf", _value); + sprintf (buf, "%f", _value); #endif SetValue (buf); } diff --git a/DDCore/src/plugins/Compact2Objects.cpp b/DDCore/src/plugins/Compact2Objects.cpp index 66d9795ee7b60c55d60d7282ef267719c6f8b9fb..3459162d4d39ba5b1edcecd4967a053a32d04240 100644 --- a/DDCore/src/plugins/Compact2Objects.cpp +++ b/DDCore/src/plugins/Compact2Objects.cpp @@ -359,6 +359,10 @@ template <> void Converter<Atom>::operator()(xml_h e) const { atom.attr<int>(_U(value)) ); element = tab->FindElement(eltname.c_str()); + if ( !element ) { + throw runtime_error("Failed to properly insert the Element:"+ + eltname+" into the element table!"); + } } } @@ -727,7 +731,7 @@ template <> void Converter<Compact>::operator()(xml_h element) const { xml_coll_t(compact,_U(alignments) ).for_each(_U(alignment),Converter<AlignmentEntry>(lcdd)); xml_coll_t(compact,_U(fields) ).for_each(_U(field), Converter<CartesianField>(lcdd)); xml_coll_t(compact,_U(sensitive_detectors)).for_each(_U(sd),Converter<SensitiveDetector>(lcdd)); - ::sprintf(text,"%u",xml_h(element).checksum(0)); + ::snprintf(text,sizeof(text),"%u",xml_h(element).checksum(0)); lcdd.addConstant(Constant("compact_checksum",text)); lcdd.endDocument(); }