Skip to content
Snippets Groups Projects
Geant4Mapping.cpp 2.63 KiB
Newer Older
//==========================================================================
Markus Frank's avatar
Markus Frank committed
//  AIDA Detector description implementation 
//--------------------------------------------------------------------------
Markus Frank's avatar
Markus Frank committed
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
// Author     : M.Frank
//
//==========================================================================

#include "DD4hep/Printout.h"
#include "DD4hep/VolumeManager.h"
Markus Frank's avatar
Markus Frank committed
using namespace dd4hep::sim;
using namespace dd4hep;
Geant4Mapping::Geant4Mapping(const Detector& description_ref)
Markus Frank's avatar
Markus Frank committed
  : m_detDesc(description_ref), m_dataPtr(0) {
Geant4Mapping::~Geant4Mapping() {
  if (m_dataPtr)
    delete m_dataPtr;
  m_dataPtr = 0;
}

/// Possibility to define a singleton instance
Geant4Mapping& Geant4Mapping::instance() {
Markus Frank's avatar
Markus Frank committed
  static Geant4Mapping inst(Detector::getInstance());
  return inst;
}

/// When resolving pointers, we must check for the validity of the data block
void Geant4Mapping::checkValidity() const {
  if (m_dataPtr)
    return;
  throw runtime_error("Geant4Mapping: Attempt to access an invalid data block!");
}

/// Create new data block. Delete old data block if present.
Geant4GeometryInfo& Geant4Mapping::init() {
  Geant4GeometryInfo* p = detach();
  attach(new Geant4GeometryInfo());
  return data();
}

/// Release data and pass over the ownership
Geant4GeometryInfo* Geant4Mapping::detach() {
  Geant4GeometryInfo* p = m_dataPtr;
void Geant4Mapping::attach(Geant4GeometryInfo* data_ptr) {
  m_dataPtr = data_ptr;
Geant4VolumeManager Geant4Mapping::volumeManager() const {
  if ( m_dataPtr ) {
    if ( m_dataPtr->g4Paths.empty() ) {
Markus Frank's avatar
Markus Frank committed
      return Geant4VolumeManager(m_detDesc, m_dataPtr);
Markus Frank's avatar
Markus Frank committed
    return Geant4VolumeManager(Handle < Geant4GeometryInfo > (m_dataPtr));
  throw runtime_error(format("Geant4Mapping", "Cannot create volume manager without Geant4 geometry info [Invalid-Info]"));
PlacedVolume Geant4Mapping::placement(const G4VPhysicalVolume* node) const {
Markus Frank's avatar
Markus Frank committed
  const Geant4GeometryMaps::PlacementMap& pm = m_dataPtr->g4Placements;
  for( const auto& entry : pm )  {
    if ( entry.second == node )
      return PlacedVolume(entry.first);
  }