diff --git a/src/TrapezoidSegmentation.cpp b/src/TrapezoidSegmentation.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5179b9479910faea45c950155f91c184a98fbc4f --- /dev/null +++ b/src/TrapezoidSegmentation.cpp @@ -0,0 +1,107 @@ +// Trapezoid Segmentation for GlueX type barrel calorimeter +// Author: M. Zurek, C. Peng (ANL) +// Date: 06/25/2021 + +#include "DD4hep/Factories.h" +#include "DD4hep/detail/SegmentationsInterna.h" +#include "DDSegmentation/Segmentation.h" + + +using namespace dd4hep::DDSegmentation; + +namespace athena::seg { + class TrapezoidGrid: public Segmentation { + public: + // Default constructor used by derived classes passing the encoding string + TrapezoidGrid(const std::string& cellEncoding = "") + : Segmentation(cellEncoding) + { + // define type and description + _type = "TrapezoidGrid"; + _description = "Trapezoid segmentation in the local YZ-plane"; + registerParameters(); + } + + // Default constructor used by derived classes passing an existing decoder + TrapezoidGrid(const BitFieldCoder* decoder) + : Segmentation(decoder) + { + // define type and description + _type = "TrapezoidGrid"; + _description = "Trapezoid segmentation in the local YZ-plane"; + registerParameters(); + } + + // Destructor + virtual ~TrapezoidGrid() {} + + void registerParameters() + { + // @TODO: register all necessary parameters + // mandatory + registerParameter("grid_size_y", "Cell size in Y", _gridSizeY, 1., SegmentationParameter::LengthUnit); + // optional + registerIdentifier("identifier_y", "Cell ID identifier for Y", _yId, "y"); + } + + // override + virtual Vector3D position(const CellID& cellID) const + { + // @TODO + /* PolarGridRPhi + Vector3D cellPosition; + double R = binToPosition(_decoder->get(cID,_rId), _gridSizeR, _offsetR); + double phi = binToPosition(_decoder->get(cID,_phiId), _gridSizePhi, _offsetPhi); + + cellPosition.X = R * cos(phi); + cellPosition.Y = R * sin(phi); + + return cellPosition; + */ + return Vector3D(); + } + + // override + virtual CellID cellID(const Vector3D& localPosition, const Vector3D& globalPosition, const VolumeID& volumeID) const + { + // @TODO + /* PolarGridRPhi + double phi = atan2(localPosition.Y,localPosition.X); + double R = sqrt( localPosition.X * localPosition.X + localPosition.Y * localPosition.Y ); + CellID cID = vID ; + _decoder->set(cID,_rId , positionToBin(R, _gridSizeR, _offsetR)); + _decoder->set(cID,_phiId, positionToBin(phi, _gridSizePhi, _offsetPhi)); + */ + return volumeID; + } + + // override + virtual std::vector<double> cellDimensions(const CellID& cellID) const + { + // @TODO + /* PolarGridRPhi + const double rPhiSize = binToPosition(_decoder->get(cID,_rId), _gridSizeR, _offsetR)*_gridSizePhi; + return {_gridSizeR, rPhiSize}; + */ + return std::vector<double>{0., 0., 0.}; + } + + + // public methods to get member value + double gridSizeY() const { return _gridSizeY; } + const std::string& fieldNameY() const { return _yId; } + // public methods to set member value + void setGridSizeY(double cellSize) { _gridSizeY = cellSize; } + void setFieldNameY(const std::string& fieldName) { _yId = fieldName; } + + protected: + // @TODO: add parameters accordingly + double _gridSizeY; + std::string _yId; + + + }; // class TrapezoidGrid +} // namespace athena::seg + +DECLARE_SEGMENTATION(TrapezoidGrid, new dd4hep::SegmentationWrapper<athena::seg::TrapezoidGrid>) +