File indexing completed on 2025-07-01 07:54:55
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include <DDSegmentation/MultiSegmentation.h>
0017 #include <DD4hep/Printout.h>
0018
0019
0020 #include <string>
0021
0022 namespace dd4hep {
0023
0024 namespace DDSegmentation {
0025
0026
0027 MultiSegmentation::MultiSegmentation(const std::string& cellEncoding)
0028 : Segmentation(cellEncoding), m_discriminator(0), m_debug(0)
0029 {
0030
0031 _type = "MultiSegmentation";
0032 _description = "Multi-segmenation wrapper segmentation";
0033
0034 registerParameter<std::string>("key", "Diskriminating field", m_discriminatorId, "");
0035 }
0036
0037
0038 MultiSegmentation::MultiSegmentation(const BitFieldCoder* decode)
0039 : Segmentation(decode), m_discriminator(0), m_debug(0)
0040 {
0041
0042 _type = "MultiSegmentation";
0043 _description = "Multi-segmenation wrapper segmentation";
0044
0045 registerParameter<std::string>("key", "Diskriminating field", m_discriminatorId, "");
0046 }
0047
0048
0049 MultiSegmentation::~MultiSegmentation() {
0050 for(Segmentations::iterator i=m_segmentations.begin(); i!=m_segmentations.end(); ++i)
0051 delete (*i).segmentation;
0052 m_segmentations.clear();
0053 }
0054
0055
0056 void MultiSegmentation::addSubsegmentation(long key_min, long key_max, Segmentation* entry) {
0057 Entry e;
0058 e.key_min = key_min;
0059 e.key_max = key_max;
0060 e.segmentation = entry;
0061 m_segmentations.emplace_back(e);
0062 }
0063
0064
0065 void MultiSegmentation::setDecoder(const BitFieldCoder* newDecoder) {
0066 this->Segmentation::setDecoder(newDecoder);
0067 for(Segmentations::iterator i=m_segmentations.begin(); i != m_segmentations.end(); ++i)
0068 (*i).segmentation->setDecoder(newDecoder);
0069 m_discriminator = &((*_decoder)[m_discriminatorId]);
0070 }
0071
0072
0073 const Segmentation& MultiSegmentation::subsegmentation(const CellID& cID) const {
0074 if ( m_discriminator ) {
0075 long seg_id = m_discriminator->value(cID);
0076 for(Segmentations::const_iterator i=m_segmentations.begin(); i != m_segmentations.end(); ++i) {
0077 const Entry& e = *i;
0078 if ( e.key_min<= seg_id && e.key_max >= seg_id ) {
0079 Segmentation* s = e.segmentation;
0080 if ( m_debug > 0 ) {
0081 printout(ALWAYS,"MultiSegmentation","Id: %04X %s", seg_id, s->name().c_str());
0082 const Parameters& pars = s->parameters();
0083 for( const auto* p : pars ) {
0084 printout(ALWAYS,"MultiSegmentation"," Param %s = %s",
0085 p->name().c_str(), p->value().c_str());
0086 }
0087 }
0088 return *s;
0089 }
0090 }
0091 }
0092 except("MultiSegmentation", "Invalid sub-segmentation identifier!");
0093 throw std::string("Invalid sub-segmentation identifier!");
0094 }
0095
0096
0097 Vector3D MultiSegmentation::position(const CellID& cID) const {
0098 return subsegmentation(cID).position(cID);
0099 }
0100
0101
0102 CellID MultiSegmentation::cellID(const Vector3D& localPosition, const Vector3D& globalPosition, const VolumeID& vID) const {
0103 return subsegmentation(vID).cellID(localPosition, globalPosition, vID);
0104 }
0105
0106 std::vector<double> MultiSegmentation::cellDimensions(const CellID& cID) const {
0107 return subsegmentation(cID).cellDimensions(cID);
0108 }
0109
0110 }
0111 }