From 64bb729fa7c60e943af434b934249ed56290ff29 Mon Sep 17 00:00:00 2001
From: Markus Frank <markus.frank@cern.ch>
Date: Thu, 5 Jul 2012 18:55:21 +0000
Subject: [PATCH] Fix problems with TPC pad layout
---
DDCore/include/DD4hep/Detector.h | 13 ++--
DDCore/include/DD4hep/Segmentations.h | 20 +++---
DDCore/src/Detector.cpp | 9 +--
DDCore/src/Segementations.cpp | 30 ++++-----
DDCore/src/compact/Compact2Objects.cpp | 24 +++----
.../include/FixedPadAngleDiskLayout.h | 48 ++++++++------
DDExamples/ILDExDet/include/PadLayout.h | 64 +++++++++++++++++++
DDExamples/ILDExDet/include/TPCModule.h | 28 ++++----
.../ILDExDet/src/FixedPadAngleDiskLayout.cpp | 57 ++++++++---------
DDExamples/ILDExDet/src/TPCModule.cpp | 10 ++-
.../ILDExDet/src/compact/ILDExTPC_geo.cpp | 10 +--
DDExamples/ILDExReco/ILDExReco.cpp | 4 +-
12 files changed, 196 insertions(+), 121 deletions(-)
create mode 100644 DDExamples/ILDExDet/include/PadLayout.h
diff --git a/DDCore/include/DD4hep/Detector.h b/DDCore/include/DD4hep/Detector.h
index f3649e24c..f41d41a11 100644
--- a/DDCore/include/DD4hep/Detector.h
+++ b/DDCore/include/DD4hep/Detector.h
@@ -143,14 +143,17 @@ namespace DD4hep {
void check(bool condition, const std::string& msg) const;
/// Templated default constructor
- template <typename T> static void* _construct() { return new T(); }
+ template <typename T> static void* _construct()
+ { return new T(); }
/// Templated copy constructor
- template <typename T> static void* _copy(const void* ptr) { return new T(*(T*)ptr); }
+ template <typename T> static void* _copy(const void* ptr, DetElement elt)
+ { return new T(*(dynamic_cast<const T*>((T*)ptr)),elt); }
/// Templated destructor function
- template <typename T> static void _delete(void* ptr) { delete (T*)(ptr); }
+ template <typename T> static void _delete(void* ptr)
+ { delete (T*)(ptr); }
/// Add an extension object to the detector element
- void* i_addExtension(void* ptr, const std::type_info& info, void* (*construct)(), void* (*copy)(const void*), void (*destruct)(void*));
+ void* i_addExtension(void* ptr, const std::type_info& info, void* (*copy)(const void*, DetElement), void (*destruct)(void*));
/// Access an existing extension object from the detector element
void* i_extension(const std::type_info& info) const;
@@ -183,7 +186,7 @@ namespace DD4hep {
DetElement clone(const std::string& new_name, int new_id) const;
template<typename IFACE, typename CONCRETE> IFACE* addExtension(CONCRETE* c)
- { return (IFACE*)i_addExtension(c,typeid(IFACE),_construct<CONCRETE>,_copy<CONCRETE>,_delete<IFACE>); }
+ { return (IFACE*)i_addExtension(dynamic_cast<IFACE*>(c),typeid(IFACE),_copy<CONCRETE>,_delete<IFACE>); }
template <class T> T* extension() const
{ return (T*)i_extension(typeid(T)); }
diff --git a/DDCore/include/DD4hep/Segmentations.h b/DDCore/include/DD4hep/Segmentations.h
index 6bfe53cec..6d0171c9c 100644
--- a/DDCore/include/DD4hep/Segmentations.h
+++ b/DDCore/include/DD4hep/Segmentations.h
@@ -67,7 +67,7 @@ namespace DD4hep {
template <typename Q> Segmentation(const Handle<Q>& e)
: Handle<Implementation>(e){}
/// Constructor to create a new segmentation object (to be called by super class only)
- Segmentation(LCDD& lcdd, const std::string& type);
+ Segmentation(const std::string& type);
Object& _data() const { return *data<Object>(); }
bool useForHitPosition() const;
const std::string type() const;
@@ -82,7 +82,7 @@ namespace DD4hep {
/// Constructor to be used when reading the already parsed object
template <typename Q> ProjectiveCylinder(const Handle<Q>& e) : Segmentation(e) {}
/// Constructor to create a new segmentation object
- ProjectiveCylinder(LCDD& lcdd);
+ ProjectiveCylinder();
/// Accessors: get number of bins in theta
int thetaBins() const;
/// Accessors: get number of bins in phi
@@ -102,7 +102,7 @@ namespace DD4hep {
/// Constructor to be used when reading the already parsed object
template <typename Q> NonProjectiveCylinder(const Handle<Q>& e) : Segmentation(e) {}
/// Constructor to create a new segmentation object
- NonProjectiveCylinder(LCDD& lcdd);
+ NonProjectiveCylinder();
/// Accessors: get size of bins in Z
double gridSizeZ() const;
/// Accessors: get size of bins in phi
@@ -122,7 +122,7 @@ namespace DD4hep {
/// Constructor to be used when reading the already parsed object
template <typename Q> ProjectiveZPlane(const Handle<Q>& e) : Segmentation(e) {}
/// Constructor to create a new segmentation object
- ProjectiveZPlane(LCDD& lcdd);
+ ProjectiveZPlane();
/// Accessors: get number of bins in theta
int thetaBins() const;
/// Accessors: get number of bins in phi
@@ -142,9 +142,9 @@ namespace DD4hep {
/// Constructor to be used when reading the already parsed object
template <typename Q> GridXY(const Handle<Q>& e) : Segmentation(e) {}
/// Constructor to be used when creating a new object. Data are taken from the input handle
- GridXY(LCDD& lcdd, const std::string& tag);
+ GridXY(const std::string& tag);
/// Constructor to be used when creating a new object.
- GridXY(LCDD& lcdd, const std::string& tag, double size_x, double size_y);
+ GridXY(const std::string& tag, double size_x, double size_y);
/// Accessors: set grid size in X
void setGridSizeX(double value);
/// Accessors: set grid size in Y
@@ -160,9 +160,9 @@ namespace DD4hep {
/// Constructor to be used when reading the already parsed object
template <typename Q> GridXYZ(const Handle<Q>& e) : GridXY(e) {}
/// Constructor to be used when creating a new object.
- GridXYZ(LCDD& lcdd);
+ GridXYZ();
/// Constructor to be used when creating a new object.
- GridXYZ(LCDD& lcdd, double size_x, double size_y, double size_z);
+ GridXYZ(double size_x, double size_y, double size_z);
/// Accessors: set grid size in Z
void setGridSizeZ(double value);
};
@@ -176,7 +176,7 @@ namespace DD4hep {
/// Constructor to be used when reading the already parsed object
template <typename Q> CartesianGridXY(const Handle<Q>& e) : GridXY(e) {}
/// Constructor to be used when creating a new object. Data are taken from the input handle
- CartesianGridXY(LCDD& lcdd) : GridXY(lcdd,"cartesian_grid_xy") {}
+ CartesianGridXY() : GridXY("cartesian_grid_xy") {}
};
/** @class GlobalGridXY Segmentations.h DD4hep/lcdd/Segmentations.h
@@ -188,7 +188,7 @@ namespace DD4hep {
/// Constructor to be used when reading the already parsed object
template <typename Q> GlobalGridXY(const Handle<Q>& e) : GridXY(e) {}
/// Constructor to be used when creating a new object. Data are taken from the input handle
- GlobalGridXY(LCDD& lcdd) : GridXY(lcdd,"global_grid_xy") {}
+ GlobalGridXY() : GridXY("global_grid_xy") {}
};
} /* End namespace Geometry */
diff --git a/DDCore/src/Detector.cpp b/DDCore/src/Detector.cpp
index 932727381..e706836da 100644
--- a/DDCore/src/Detector.cpp
+++ b/DDCore/src/Detector.cpp
@@ -20,7 +20,7 @@ using namespace DD4hep::Geometry;
namespace {
struct ExtensionEntry {
void* (*construct)();
- void* (*copy)(const void*);
+ void* (*copy)(const void*,DetElement);
void (*destruct)(void*);
int id;
};
@@ -146,7 +146,7 @@ Value<TNamed,DetElement::Object>* DetElement::Object::clone(int new_id, int flag
const std::type_info* info = (*i).first;
ExtensionMap::const_iterator j = m.find(info);
const ExtensionEntry& e = (*j).second;
- obj->extensions[info] = (*(e.copy))((*i).second);
+ obj->extensions[info] = (*(e.copy))((*i).second,det);
}
obj->children.clear();
@@ -246,7 +246,7 @@ DetElement::DetElement(DetElement parent, const string& name, int id) {
}
/// Add an extension object to the detector element
-void* DetElement::i_addExtension(void* ptr, const std::type_info& info, void* (*construct)(), void* (*copy)(const void*), void (*destruct)(void*)) {
+void* DetElement::i_addExtension(void* ptr, const std::type_info& info, void* (*copy)(const void*,DetElement), void (*destruct)(void*)) {
Object& o = _data();
Extensions::iterator j = o.extensions.find(&info);
if ( j == o.extensions.end() ) {
@@ -254,7 +254,7 @@ void* DetElement::i_addExtension(void* ptr, const std::type_info& info, void* (*
ExtensionMap::iterator i = m.find(&info);
if ( i == m.end() ) {
ExtensionEntry entry;
- entry.construct = construct;
+ entry.construct = 0;//construct;
entry.destruct = destruct;
entry.copy = copy;
entry.id = ++s_extensionID;
@@ -262,6 +262,7 @@ void* DetElement::i_addExtension(void* ptr, const std::type_info& info, void* (*
i = m.find(&info);
}
ExtensionEntry& e = (*i).second;
+ cout << "Extension["<<name()<<"]:" << ptr << " " << typeid(*(TNamed*)ptr).name() << endl;
return o.extensions[&info] = ptr;
}
throw runtime_error("addExtension: The object "+string(name())+
diff --git a/DDCore/src/Segementations.cpp b/DDCore/src/Segementations.cpp
index c8efb8928..1cf06135f 100644
--- a/DDCore/src/Segementations.cpp
+++ b/DDCore/src/Segementations.cpp
@@ -13,7 +13,7 @@
using namespace std;
using namespace DD4hep::Geometry;
-Segmentation::Segmentation(LCDD& /* lcdd */, const string& type) {
+Segmentation::Segmentation(const string& type) {
assign(new Value<TNamed,Segmentation::Object>(),"segmentation",type);
}
@@ -25,8 +25,8 @@ const string Segmentation::type() const {
return m_element->GetTitle();
}
-ProjectiveCylinder::ProjectiveCylinder(LCDD& lcdd)
-: Segmentation(lcdd,"projective_cylinder") {}
+ProjectiveCylinder::ProjectiveCylinder()
+: Segmentation("projective_cylinder") {}
/// Accessors: get number of bins in theta
int ProjectiveCylinder::thetaBins() const {
@@ -48,8 +48,8 @@ void ProjectiveCylinder::setPhiBins(int value) {
_data().data.cylindrical_binning.nphi = value;
}
-NonProjectiveCylinder::NonProjectiveCylinder(LCDD& lcdd)
-: Segmentation(lcdd, "nonprojective_cylinder")
+NonProjectiveCylinder::NonProjectiveCylinder()
+: Segmentation("nonprojective_cylinder")
{
}
@@ -72,8 +72,8 @@ void NonProjectiveCylinder::setPhiBinSize(double value) {
}
/// Constructor to be used when creating a new DOM tree.
-ProjectiveZPlane::ProjectiveZPlane(LCDD& lcdd)
-: Segmentation(lcdd,"projective_zplane")
+ProjectiveZPlane::ProjectiveZPlane()
+: Segmentation("projective_zplane")
{
}
@@ -98,14 +98,14 @@ void ProjectiveZPlane::setPhiBins(int value) {
}
/// Constructor to be used when creating a new object. Data are taken from the input handle
-GridXY::GridXY(LCDD& lcdd, const std::string& tag)
-: Segmentation(lcdd,tag)
+GridXY::GridXY(const std::string& tag)
+: Segmentation(tag)
{
}
/// Constructor to be used when creating a new object.
-GridXY::GridXY(LCDD& lcdd, const std::string& tag, double size_x, double size_y)
-: Segmentation(lcdd,tag)
+GridXY::GridXY(const std::string& tag, double size_x, double size_y)
+: Segmentation(tag)
{
_data().data.cartesian_grid.grid_size_x = size_x;
_data().data.cartesian_grid.grid_size_y = size_y;
@@ -122,14 +122,14 @@ void GridXY::setGridSizeY(double value) {
}
/// Constructor to be used when creating a new DOM tree.
-GridXYZ::GridXYZ(LCDD& lcdd)
-: GridXY(lcdd, "grid_xyz")
+GridXYZ::GridXYZ()
+: GridXY("grid_xyz")
{
}
/// Constructor to be used when creating a new object.
-GridXYZ::GridXYZ(LCDD& lcdd, double size_x, double size_y, double size_z)
-: GridXY(lcdd, "grid_xyz", size_x, size_y)
+GridXYZ::GridXYZ(double size_x, double size_y, double size_z)
+: GridXY("grid_xyz", size_x, size_y)
{
_data().data.cartesian_grid.grid_size_z = size_z;
}
diff --git a/DDCore/src/compact/Compact2Objects.cpp b/DDCore/src/compact/Compact2Objects.cpp
index 783fd0568..337e6f761 100644
--- a/DDCore/src/compact/Compact2Objects.cpp
+++ b/DDCore/src/compact/Compact2Objects.cpp
@@ -181,43 +181,43 @@ namespace DD4hep { namespace Geometry {
return attr;
}
- template <> Elt_t toObject<GridXYZ>(lcdd_t& lcdd, const xml_h& e) {
- GridXYZ obj(lcdd);
+ template <> Elt_t toObject<GridXYZ>(lcdd_t& /* lcdd */, const xml_h& e) {
+ GridXYZ obj;
if ( e.hasAttr(_A(gridSizeX)) ) obj.setGridSizeX(e.attr<float>(_A(gridSizeX)));
if ( e.hasAttr(_A(gridSizeY)) ) obj.setGridSizeY(e.attr<float>(_A(gridSizeY)));
if ( e.hasAttr(_A(gridSizeZ)) ) obj.setGridSizeZ(e.attr<float>(_A(gridSizeZ)));
return obj;
}
- template <> Elt_t toObject<GlobalGridXY>(lcdd_t& lcdd, const xml_h& e) {
- GlobalGridXY obj(lcdd);
+ template <> Elt_t toObject<GlobalGridXY>(lcdd_t& /* lcdd */, const xml_h& e) {
+ GlobalGridXY obj;
if ( e.hasAttr(_A(gridSizeX)) ) obj.setGridSizeX(e.attr<float>(_A(gridSizeX)));
if ( e.hasAttr(_A(gridSizeY)) ) obj.setGridSizeY(e.attr<float>(_A(gridSizeY)));
return obj;
}
- template <> Elt_t toObject<CartesianGridXY>(lcdd_t& lcdd, const xml_h& e) {
- CartesianGridXY obj(lcdd);
+ template <> Elt_t toObject<CartesianGridXY>(lcdd_t& /* lcdd */, const xml_h& e) {
+ CartesianGridXY obj;
if ( e.hasAttr(_A(gridSizeX)) ) obj.setGridSizeX(e.attr<double>(_A(gridSizeX)));
if ( e.hasAttr(_A(gridSizeY)) ) obj.setGridSizeY(e.attr<double>(_A(gridSizeY)));
return obj;
}
- template <> Elt_t toObject<ProjectiveCylinder>(lcdd_t& lcdd, const xml_h& e) {
- ProjectiveCylinder obj(lcdd);
+ template <> Elt_t toObject<ProjectiveCylinder>(lcdd_t& /* lcdd */, const xml_h& e) {
+ ProjectiveCylinder obj;
if ( e.hasAttr(_A(phiBins)) ) obj.setPhiBins(e.attr<int>(_A(phiBins)));
if ( e.hasAttr(_A(thetaBins)) ) obj.setThetaBins(e.attr<int>(_A(thetaBins)));
return obj;
}
- template <> Elt_t toObject<NonProjectiveCylinder>(lcdd_t& lcdd, const xml_h& e) {
- NonProjectiveCylinder obj(lcdd);
+ template <> Elt_t toObject<NonProjectiveCylinder>(lcdd_t& /* lcdd */, const xml_h& e) {
+ NonProjectiveCylinder obj;
if ( e.hasAttr(_A(gridSizePhi)) ) obj.setThetaBinSize(e.attr<double>(_A(gridSizePhi)));
if ( e.hasAttr(_A(gridSizeZ)) ) obj.setPhiBinSize(e.attr<double>(_A(gridSizeZ)));
return obj;
}
- template <> Elt_t toObject<ProjectiveZPlane>(lcdd_t& lcdd, const xml_h& e) {
- ProjectiveZPlane obj(lcdd);
+ template <> Elt_t toObject<ProjectiveZPlane>(lcdd_t& /* lcdd */, const xml_h& e) {
+ ProjectiveZPlane obj;
if ( e.hasAttr(_A(phiBins)) ) obj.setThetaBins(e.attr<int>(_A(phiBins)));
if ( e.hasAttr(_A(thetaBins)) ) obj.setPhiBins(e.attr<int>(_A(thetaBins)));
return obj;
diff --git a/DDExamples/ILDExDet/include/FixedPadAngleDiskLayout.h b/DDExamples/ILDExDet/include/FixedPadAngleDiskLayout.h
index 5ae9436a9..33156c105 100644
--- a/DDExamples/ILDExDet/include/FixedPadAngleDiskLayout.h
+++ b/DDExamples/ILDExDet/include/FixedPadAngleDiskLayout.h
@@ -10,6 +10,7 @@
#define FixedPadAngleDiskLayout_H
#include "DD4hep/Detector.h"
+#include "DD4hep/Segmentations.h"
#include "PadLayout.h"
#include <Exceptions.h>
@@ -18,51 +19,60 @@ namespace DD4hep {
struct FixedPadAngleDiskLayout : public PadLayout {
- Geometry::DetElement module;
- //various constructors
- FixedPadAngleDiskLayout() {}
- FixedPadAngleDiskLayout(const Geometry::DetElement& e) : module(e) {}
- FixedPadAngleDiskLayout(const FixedPadAngleDiskLayout& p) : module(p.module) {}
-
+ Geometry::DetElement module;
+ Geometry::ProjectiveCylinder pads;
+ Geometry::Tube tube;
+ /// Default empty constructor
+ FixedPadAngleDiskLayout() : module(), pads(), tube() {}
+
+ /// Standard constructor with arguments
+ FixedPadAngleDiskLayout(const Geometry::DetElement& d);
+
+ /// Standard extension constructor. det is the NEW detector element e.g. when reflecting a detector
+ FixedPadAngleDiskLayout(const FixedPadAngleDiskLayout& c,const Geometry::DetElement& det);
+
+ /// Default destructor
+ virtual ~FixedPadAngleDiskLayout() {}
+
/** The type of pad layout (segmentation) on this module.
*/
- std::string getPadType() const;
+ virtual std::string getPadType() const;
/** The total number of pads on this module.
*/
- int getNPads() const;
+ virtual int getNPads() const;
/** The total number of rows on this module.
*/
- int getNRows() const;
+ virtual int getNRows() const;
/** The number of pads in a given row on this module.
*/
- int getNPadsInRow(int row)const;
+ virtual int getNPadsInRow(int row)const;
/** The height of a given row on this module.
*/
- double getRowHeight (int row) const;
+ virtual double getRowHeight (int row) const;
/** The pad pitch (sensitive plus surroundings = effective size) of a given pad on this module.
*/
- double getPadPitch (int padIndex) const;
+ virtual double getPadPitch (int padIndex) const;
/** The row which contains the given pad on this module.
*/
- int getRowNumber (int padIndex) const;
+ virtual int getRowNumber (int padIndex) const;
/** The position of a pad within the row on this module.
*/
- int getPadNumber (int padIndex) const;
+ virtual int getPadNumber (int padIndex) const;
/** The pad id for a pad with padNum in row with rowNum on this module.
*/
- int getPadIndex (int rowNum, int padNum)const ;
+ virtual int getPadIndex (int rowNum, int padNum)const ;
/** The right neighbour of a pad with the given index on this module.
*/
- int getRightNeighbour (int padIndex) const;
+ virtual int getRightNeighbour (int padIndex) const;
/** The left neighbour of a pad with the given index on this module.
*/
- int getLeftNeighbour (int padIndex) const;
+ virtual int getLeftNeighbour (int padIndex) const;
/** The center of a pad on this module in global coordinates.
*/
- std::vector<double> getPadCenter (int padIndex) const;
+ virtual std::vector<double> getPadCenter (int padIndex) const;
/** Closest pad to a given location.
*/
- int getNearestPad (double c0, double c1) const;
+ virtual int getNearestPad (double c0, double c1) const;
};
}
diff --git a/DDExamples/ILDExDet/include/PadLayout.h b/DDExamples/ILDExDet/include/PadLayout.h
new file mode 100644
index 000000000..f08ff11f0
--- /dev/null
+++ b/DDExamples/ILDExDet/include/PadLayout.h
@@ -0,0 +1,64 @@
+// $Id:$
+//====================================================================
+// AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+// Author : A.Muennich
+//
+//====================================================================
+#ifndef PadLayout_H
+#define PadLayout_H
+
+#include <string>
+#include <vector>
+
+namespace DD4hep {
+
+
+ struct PadLayout {
+ /// Default destructir
+ virtual ~PadLayout() {}
+
+ /** The type of pad layout (segmentation) on this module.
+ */
+ virtual std::string getPadType() const=0;
+ /** The total number of pads on this module.
+ */
+ virtual int getNPads() const=0;
+ /** The total number of rows on this module.
+ */
+ virtual int getNRows() const=0;
+ /** The number of pads in a given row on this module.
+ */
+ virtual int getNPadsInRow(int row)const=0;
+ /** The height of a given row on this module.
+ */
+ virtual double getRowHeight (int row) const=0;
+ /** The pad pitch (sensitive plus surroundings = effective size) of a given pad on this module.
+ */
+ virtual double getPadPitch (int padIndex) const=0;
+ /** The row which contains the given pad on this module.
+ */
+ virtual int getRowNumber (int padIndex) const=0;
+ /** The position of a pad within the row on this module.
+ */
+ virtual int getPadNumber (int padIndex) const=0;
+ /** The pad id for a pad with padNum in row with rowNum on this module.
+ */
+ virtual int getPadIndex (int rowNum, int padNum)const=0;
+ /** The right neighbour of a pad with the given index on this module.
+ */
+ virtual int getRightNeighbour (int padIndex) const=0;
+ /** The left neighbour of a pad with the given index on this module.
+ */
+ virtual int getLeftNeighbour (int padIndex) const=0;
+ /** The center of a pad on this module in global coordinates.
+ */
+ virtual std::vector<double> getPadCenter (int padIndex) const=0;
+ /** Closest pad to a given location.
+ */
+ virtual int getNearestPad (double c0, double c1) const=0;
+ };
+
+}
+#endif
diff --git a/DDExamples/ILDExDet/include/TPCModule.h b/DDExamples/ILDExDet/include/TPCModule.h
index 3f62cb8f4..9ab2b0b90 100644
--- a/DDExamples/ILDExDet/include/TPCModule.h
+++ b/DDExamples/ILDExDet/include/TPCModule.h
@@ -27,7 +27,7 @@ namespace DD4hep {
TPCModule() : padLayout(0) {}
TPCModule(const Ref_t& e) : Geometry::DetElement(e), padLayout(0) {getExtension();}
TPCModule(const Geometry::DetElement& e) : Geometry::DetElement(e), padLayout(0) {getExtension();}
- TPCModule(const std::string& name, const std::string& type, int id) : Geometry::DetElement(name,type,id), padLayout(0) {getExtension();}
+ // TPCModule(const std::string& name, const std::string& type, int id) : Geometry::DetElement(name,type,id), padLayout(0) {getExtension();}
template<typename T> TPCModule& operator=(const T& h) {
m_element = h.m_element;
getExtension();
@@ -44,43 +44,43 @@ namespace DD4hep {
//Now all the functionality that depends on specific implementation of padlayout
/** The type of pad layout (segmentation) on this module.
*/
- virtual std::string getPadType() const { padLayout->getPadType(); }
+ std::string getPadType() const { return padLayout->getPadType(); }
/** The total number of pads on this module.
*/
- virtual int getNPads() const { padLayout->getNPads(); }
+ int getNPads() const { return padLayout->getNPads(); }
/** The total number of rows on this module.
*/
- virtual int getNRows() const { padLayout->getNRows(); }
+ int getNRows() const { return padLayout->getNRows(); }
/** The number of pads in a given row on this module.
*/
- virtual int getNPadsInRow(int row)const { padLayout->getNPadsInRow(row); }
+ int getNPadsInRow(int row)const { return padLayout->getNPadsInRow(row); }
/** The height of a given row on this module.
*/
- virtual double getRowHeight (int row) const { padLayout->getRowHeight (row); }
+ double getRowHeight (int row) const { return padLayout->getRowHeight (row); }
/** The pad pitch (sensitive plus surroundings = effective size) of a given pad on this module.
*/
- virtual double getPadPitch (int padIndex) const { padLayout->getPadPitch (padIndex); }
+ double getPadPitch (int padIndex) const { return padLayout->getPadPitch (padIndex); }
/** The row which contains the given pad on this module.
*/
- virtual int getRowNumber (int padIndex) const { padLayout->getRowNumber (padIndex);}
+ int getRowNumber (int padIndex) const { return padLayout->getRowNumber (padIndex);}
/** The position of a pad within the row on this module.
*/
- virtual int getPadNumber (int padIndex) const { padLayout->getPadNumber (padIndex); }
+ int getPadNumber (int padIndex) const { return padLayout->getPadNumber (padIndex); }
/** The pad id for a pad with padNum in row with rowNum on this module.
*/
- virtual int getPadIndex (int rowNum, int padNum)const { padLayout->getPadIndex (rowNum, padNum); }
+ int getPadIndex (int rowNum, int padNum)const { return padLayout->getPadIndex (rowNum, padNum); }
/** The right neighbour of a pad with the given index on this module.
*/
- virtual int getRightNeighbour (int padIndex) const { padLayout->getRightNeighbour (padIndex); }
+ int getRightNeighbour (int padIndex) const { return padLayout->getRightNeighbour (padIndex); }
/** The left neighbour of a pad with the given index on this module.
*/
- virtual int getLeftNeighbour (int padIndex) const { padLayout->getLeftNeighbour (padIndex) ;}
+ int getLeftNeighbour (int padIndex) const { return padLayout->getLeftNeighbour (padIndex) ;}
/** The center of a pad on this module in global coordinates.
*/
- virtual std::vector<double> getPadCenter (int padIndex) const { padLayout->getPadCenter (padIndex) ;}
+ std::vector<double> getPadCenter (int padIndex) const { return padLayout->getPadCenter (padIndex) ;}
/** Closest pad to a given location.
*/
- virtual int getNearestPad (double c0, double c1) const { padLayout->getNearestPad (c0,c1); }
+ int getNearestPad (double c0, double c1) const { return padLayout->getNearestPad (c0,c1); }
};
}
diff --git a/DDExamples/ILDExDet/src/FixedPadAngleDiskLayout.cpp b/DDExamples/ILDExDet/src/FixedPadAngleDiskLayout.cpp
index 14df42e6e..e328bd11e 100644
--- a/DDExamples/ILDExDet/src/FixedPadAngleDiskLayout.cpp
+++ b/DDExamples/ILDExDet/src/FixedPadAngleDiskLayout.cpp
@@ -18,7 +18,7 @@
#include "DD4hep/LCDD.h"
#include "FixedPadAngleDiskLayout.h"
-#include "TPCModule.h"
+//#include "TPCModule.h"
#include "TGeoTube.h"
#include "TGeoMatrix.h"
#include "TGeoManager.h"
@@ -31,25 +31,35 @@ namespace DD4hep {
using namespace Geometry;
+ /// Standard constructor with arguments
+ FixedPadAngleDiskLayout::FixedPadAngleDiskLayout(const Geometry::DetElement& d) : module(d) {
+ pads = module.readout().segmentation();
+ tube = module.volume().solid();
+ }
+
+ /// Standard extension constructor. det is the NEW detector element e.g. when reflecting a detector
+ FixedPadAngleDiskLayout::FixedPadAngleDiskLayout(const FixedPadAngleDiskLayout& /* c */, const Geometry::DetElement& d) : module(d) {
+ pads = module.readout().segmentation();
+ tube = module.volume().solid();
+ }
std::string FixedPadAngleDiskLayout::getPadType()const {
- ProjectiveCylinder pads= module.readout().segmentation();
- string typ = pads.type();
- return typ.empty() ? "" : typ;
+ //ProjectiveCylinder pads= module.readout().segmentation();
+ return pads.type();
}
int FixedPadAngleDiskLayout::getNPads()const {
- ProjectiveCylinder pads= module.readout().segmentation();
+ //ProjectiveCylinder pads= module.readout().segmentation();
return pads.thetaBins()* pads.phiBins();
}
int FixedPadAngleDiskLayout::getNRows()const {
- ProjectiveCylinder pads= module.readout().segmentation();
+ //ProjectiveCylinder pads= module.readout().segmentation();
return pads.thetaBins();
}
int FixedPadAngleDiskLayout::getNPadsInRow(int row)const {
- ProjectiveCylinder pads= module.readout().segmentation();
+ //ProjectiveCylinder pads= module.readout().segmentation();
return pads.phiBins();
}
@@ -57,7 +67,7 @@ namespace DD4hep {
if(row>getNRows() || row<0)
throw OutsideGeometryException("getRowHeight: Requested row not on module querried!");
//all rows are the same for FixedPadAngleDiskLayout=ProjectiveCylinder
- Tube tube=module.volume().solid();
+ ////Tube tube=module.volume().solid();
double module_height= tube->GetRmax()-tube->GetRmin();
return module_height/getNRows();
}
@@ -72,7 +82,7 @@ namespace DD4hep {
if(pad>getNPads() || pad<0)
throw OutsideGeometryException("getPadPitch: Requested pad not on module querried!");
int row=getRowNumber(pad);
- Tube tube=module.volume().solid();
+ /////Tube tube=module.volume().solid();
double pad_radius=tube->GetRmin()+(row+0.5)*getRowHeight(0);
double module_width= tube->GetPhi2()-tube->GetPhi1();
double pad_angle=module_width/getNPadsInRow(row);
@@ -115,30 +125,17 @@ namespace DD4hep {
if(pad>getNPads())
throw OutsideGeometryException("getPadCenter: Requested pad not on module querried!");
int row=getRowNumber(pad);
- Tube tube=module.volume().solid();
+ //////Tube tube=module.volume().solid();
double pad_radius=tube->GetRmin()+(row+0.5)*getRowHeight(0);
double module_width= tube->GetPhi2()-tube->GetPhi1();
double pad_angle=(getPadNumber(pad)+0.5)*module_width/getNPadsInRow(row);
//local center coordinates in module system
- double pad_x=pad_radius*cos(pad_angle*M_PI/180.);
- double pad_y=pad_radius*sin(pad_angle*M_PI/180.);
+ double pad_x = pad_radius*cos(pad_angle*M_PI/180.);
+ double pad_y = pad_radius*sin(pad_angle*M_PI/180.);
//trafo to global coordinates
- Double_t point_local[3];
- Double_t point_global[3];
- Double_t point_global_m[3];
- Double_t point_global_t[3];
- point_local[0] = pad_x;
- point_local[1] = pad_y;
- point_local[2] = TPCModule(module).getModuleZPosition();
-
- Position global, global_w, global_r, global_p, local(point_local[0],point_local[1],point_local[2]);
+ Position global_w, local(pad_x,pad_y,0);//TPCModule(module).getModuleZPosition();
module.localToWorld(local,global_w);
- // this->localToParent(local,global);
-// std::cout<<"Exp-Local: "<<point_local[0]<<" "<<point_local[1]<<" "<<point_local[2]<<std::endl;
-// std::cout<<"Det-Par: " << global.x << " " << global.y << " " << global.z << std::endl;
-// std::cout<<"Det-Top: " << global_w.x << " " << global_w.y << " " << global_w.z << std::endl;
-
vector<double> center;
center.push_back(global_w.x);
@@ -149,18 +146,18 @@ namespace DD4hep {
int FixedPadAngleDiskLayout::getNearestPad(double c0,double c1)const {
//find z position of module in world coordinates
- Position fake_local(0,0,TPCModule(module).getModuleZPosition());
+ Position fake_local(0,0,0);
Position fake_global;
module.localToWorld(fake_local,fake_global);
- //trafo to local coordinates
+ // trafo to local coordinates
Position global(c0,c1,fake_global.z), local;
module.worldToLocal(global,local);
Double_t point_local[3]={local.x,local.y,local.z};
//check if it is on that module
- bool onMod=module.volume().solid()->Contains(point_local);
+ ////Tube tube=module.volume().solid();
+ bool onMod=tube->Contains(point_local);
if(!onMod)
throw OutsideGeometryException("getNearestPad: Requested point not on module querried!");
- Tube tube=module.volume().solid();
double module_width= tube->GetPhi2()-tube->GetPhi1();
double radius=sqrt(point_local[0]*point_local[0]+point_local[1]*point_local[1]);
int row=(radius-tube->GetRmin())/getRowHeight(0);
diff --git a/DDExamples/ILDExDet/src/TPCModule.cpp b/DDExamples/ILDExDet/src/TPCModule.cpp
index c50e76bfa..6ecacd078 100644
--- a/DDExamples/ILDExDet/src/TPCModule.cpp
+++ b/DDExamples/ILDExDet/src/TPCModule.cpp
@@ -29,17 +29,15 @@ namespace DD4hep {
void TPCModule::getExtension() {
padLayout = isValid() ? extension<PadLayout>() : 0;
}
-
+
int TPCModule::getID()const {
return _data().id;
}
-
-
-
+
double TPCModule::getModuleZPosition() const {
//for internal use only, gives back coordinate in local system
- TGeoMatrix *nm=placement()->GetMatrix();
- const Double_t *trans=nm->GetTranslation();
+ TGeoMatrix *nm = placement()->GetMatrix();
+ const Double_t *trans = nm->GetTranslation();
return trans[2];
}
}
diff --git a/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp b/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp
index 85d5ac017..b796fdd10 100644
--- a/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp
@@ -76,16 +76,16 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
//templated TPCModule
DetElement module(part_det,m_nam,mdcount);
- //additional data of module
- //PadLayout* layout = new FixedPadAngleDiskLayout(module);
- //module.addExtension<PadLayout>(layout);
- PadLayout* layout = module.addExtension<PadLayout>(new FixedPadAngleDiskLayout(module));
- module.setReadout(xml_pads);
mdcount++;
double rotz=md*2*M_PI/nmodules+row.modulePitch()/(rmin+(rmax-rmin))/2;
PlacedVolume m_phv = part_vol.placeVolume(mr_vol,Position(0,0,0),Rotation(0,0,rotz));
m_phv.addPhysVolID("module",md);
module.setPlacement(m_phv);
+
+ module.setReadout(xml_pads);
+ // Readout and placement must be present before adding extension,
+ // since they are aquired internally for optimisation reasons. (MF)
+ module.addExtension<PadLayout>(new FixedPadAngleDiskLayout(module));
}//modules
}//rows
}//module groups
diff --git a/DDExamples/ILDExReco/ILDExReco.cpp b/DDExamples/ILDExReco/ILDExReco.cpp
index 9f609a631..831dd3bf1 100644
--- a/DDExamples/ILDExReco/ILDExReco.cpp
+++ b/DDExamples/ILDExReco/ILDExReco.cpp
@@ -61,7 +61,9 @@ int main(int argc,char** argv) {
TPCModule mymod=tpc.getModule(10,1);
cout << "-----> Module 10 EP 1 ID:\t " << mymod.getID()<<endl;
- cout << "-----> Module 10 Pads:\t " << mymod.getPadType()<<endl;
+ string typ = mymod.getPadType();
+ //cout << "-----> Module 10 Pads:\t " << mymod.getPadType()<<endl;
+ cout << "-----> Module 10 Pads:\t " << typ<<endl;
cout << "-----> Module 10 NPads:\t " << mymod.getNPads()<<endl;
cout << "-----> Module 10 pad rows:\t " << mymod.getNRows()<<endl;
cout << "-----> Module 10 pads in rows:\t " << mymod.getNPadsInRow(0)<<endl;
--
GitLab