4 IDDecoder

Sensitive volumes in a DD4hep geometry model are assigned a unique volume-ID. This ID is then used by the corresponding DDSegmentation object to create a unique cellID for tracker and calorimeter hits, allowing to uniquely match hits to their sensitive volumes and also to their DetElements if they have been defined appropriately. During reconstruction tasks, including digitization of simulated hits, one often needs to convert between a cellID assigned to the hit and the position of the corresponding detector cell. For example one could write out simulated calorimeter hits without position information in order to save disk space and retrieve the position information based on the cellID. Another application might be a clustering algorithm where one looks for hits in the neighbor cells of a given hit.

The functionality to do this is provided by the IDDecoder class with the following interface:

  class IDDecoder {  
  public:  
     /// Default constructor using the name of the corresponding readout collection  
    IDDecoder(const std::string& collectionName);  
 
     /// Default constructor using a readout object  
    IDDecoder(const Geometry::Readout& readout);  
 
     /// Destructor  
    virtual ~IDDecoder();  
 
     /// Returns the cell ID from the local position in the given volume ID.  
    CellID cellIDFromLocal(const Geometry::Position& local, const VolumeID volumeID) const;  
 
     /// Returns the global cell ID from a given global position  
    CellID cellID(const Geometry::Position& global) const;  
 
     /// Returns the global position from a given cell ID  
    Geometry::Position position(const CellID& cellID) const;  
 
     /// Returns the local position from a given cell ID  
    Geometry::Position localPosition(const CellID& cellID) const;  
 
     /// Returns the volume ID of a given cell ID  
    VolumeID volumeID(const CellID& cellID) const;  
 
     /// Returns the volume ID of a given global position  
    VolumeID volumeID(const Geometry::Position& global) const;  
 
     /// Returns the placement for a given cell ID  
    Geometry::PlacedVolume placement(const CellID& cellID) const;  
 
     /// Returns the placement for a given global position  
    Geometry::PlacedVolume placement(const Geometry::Position& global) const;  
 
     /// Returns the subdetector for a given cell ID  
    Geometry::DetElement subDetector(const CellID& cellID) const;  
 
     /// Returns the subdetector for a given global position  
    Geometry::DetElement subDetector(const Geometry::Position& global) const;  
 
     /// Returns the closest detector element in the hierarchy for a given cell ID  
    Geometry::DetElement detectorElement(const CellID& cellID) const;  
 
     /// Returns the closest detector element in the hierarchy for a given global position  
    Geometry::DetElement detectorElement(const Geometry::Position& global) const;  
 
     /// Calculates the neighbours of the given cell ID and adds them to the list of neighbours  
    void neighbours(const CellID& cellID, std::set<CellID>& neighbours) const;  
 
     /// Checks if the given cell IDs are neighbours  
    bool areNeighbours(const CellID& cellID, const CellID& otherCellID) const;  
}