Newer
Older
//==========================================================================
Markus Frank
committed
//--------------------------------------------------------------------------
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
// All rights reserved.
//
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
//
// \author Markus Frank
// \date 2015-11-09
//
//==========================================================================
// Framework include files
#include "DDG4/Geant4DetectorConstruction.h"
/// Namespace for the AIDA detector description toolkit
Markus Frank
committed
/// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit
Markus Frank
committed
/// Class to create Geant4 detector geometry from TGeo representation in memory
/**
* On demand (ie. when calling "Construct") the dd4hep geometry is converted
Markus Frank
committed
* to Geant4 with all volumes, assemblies, shapes, materials etc.
* The actuak work is performed by the Geant4Converter class called by this method.
*
* \author M.Frank
* \version 1.0
* \ingroup DD4HEP_SIMULATION
*/
class Geant4DetectorGeometryConstruction : public Geant4DetectorConstruction {
/// Property: Dump geometry hierarchy
Markus Frank
committed
bool m_dumpHierarchy = false;
/// Property: Flag to debug materials during conversion mechanism
Markus Frank
committed
bool m_debugMaterials = false;
/// Property: Flag to debug elements during conversion mechanism
Markus Frank
committed
bool m_debugElements = false;
/// Property: Flag to debug shapes during conversion mechanism
bool m_debugShapes = false;
/// Property: Flag to debug volumes during conversion mechanism
Markus Frank
committed
bool m_debugVolumes = false;
/// Property: Flag to debug placements during conversion mechanism
Markus Frank
committed
bool m_debugPlacements = false;
/// Property: Flag to debug regions during conversion mechanism
Markus Frank
committed
bool m_debugRegions = false;
Markus Frank
committed
/// Property: Flag to debug regions during conversion mechanism
bool m_debugSurfaces = false;
Markus Frank
committed
/// Property: Flag to dump all placements after the conversion procedure
bool m_printPlacements = false;
/// Property: Flag to dump all sensitives after the conversion procedure
bool m_printSensitives = false;
/// Property: Printout level of info object
int m_geoInfoPrintLevel;
Markus Frank
committed
/// Property: G4 GDML dump file name (default: empty. If non empty, dump)
std::string m_dumpGDML;
public:
/// Initializing constructor for DDG4
Geant4DetectorGeometryConstruction(Geant4Context* ctxt, const std::string& nam);
/// Default destructor
virtual ~Geant4DetectorGeometryConstruction();
/// Geometry construction callback. Called at "Construct()"
void constructGeo(Geant4DetectorConstructionContext* ctxt);
};
} // End namespace sim
} // End namespace dd4hep
Markus Frank
committed
// Framework include files
#include "DD4hep/InstanceCount.h"
#include "DD4hep/Printout.h"
Markus Frank
committed
#include "DDG4/Geant4HierarchyDump.h"
#include "DDG4/Geant4Converter.h"
#include "DDG4/Geant4Kernel.h"
#include "DDG4/Factories.h"
// Geant4 include files
#include "G4PVPlacement.hh"
Markus Frank
committed
#include "G4GDMLParser.hh"
Markus Frank
committed
using namespace std;
using namespace dd4hep;
using namespace dd4hep::sim;
Markus Frank
committed
DECLARE_GEANT4ACTION(Geant4DetectorGeometryConstruction)
/// Initializing constructor for other clients
Geant4DetectorGeometryConstruction::Geant4DetectorGeometryConstruction(Geant4Context* ctxt, const string& nam)
: Geant4DetectorConstruction(ctxt,nam)
{
declareProperty("DebugMaterials", m_debugMaterials);
declareProperty("DebugElements", m_debugElements);
declareProperty("DebugShapes", m_debugShapes);
declareProperty("DebugVolumes", m_debugVolumes);
declareProperty("DebugPlacements", m_debugPlacements);
declareProperty("DebugRegions", m_debugRegions);
Markus Frank
committed
declareProperty("DebugSurfaces", m_debugSurfaces);
declareProperty("PrintPlacements", m_printPlacements);
declareProperty("PrintSensitives", m_printSensitives);
declareProperty("GeoInfoPrintLevel", m_geoInfoPrintLevel = DEBUG);
declareProperty("DumpHierarchy", m_dumpHierarchy);
declareProperty("DumpGDML", m_dumpGDML="");
Markus Frank
committed
InstanceCount::increment(this);
}
/// Default destructor
Geant4DetectorGeometryConstruction::~Geant4DetectorGeometryConstruction() {
InstanceCount::decrement(this);
}
/// Geometry construction callback. Called at "Construct()"
void Geant4DetectorGeometryConstruction::constructGeo(Geant4DetectorConstructionContext* ctxt) {
Geant4Mapping& g4map = Geant4Mapping::instance();
DetElement world = ctxt->description.world();
Geant4Converter conv(ctxt->description, outputLevel());
conv.debugMaterials = m_debugMaterials;
conv.debugElements = m_debugElements;
Markus Frank
committed
conv.debugShapes = m_debugShapes;
conv.debugVolumes = m_debugVolumes;
conv.debugPlacements = m_debugPlacements;
conv.debugRegions = m_debugRegions;
Markus Frank
committed
conv.debugSurfaces = m_debugSurfaces;
ctxt->geometry = conv.create(world).detach();
ctxt->geometry->printLevel = outputLevel();
Markus Frank
committed
g4map.attach(ctxt->geometry);
G4VPhysicalVolume* w = ctxt->geometry->world();
// Create Geant4 volume manager only if not yet available
Markus Frank
committed
g4map.volumeManager();
if ( m_dumpHierarchy ) {
Markus Frank
committed
dmp.dump("",w);
}
//#ifdef GEANT4_HAS_GDML
if ( !m_dumpGDML.empty() ) {
Markus Frank
committed
G4GDMLParser parser;
parser.Write(m_dumpGDML.c_str(), w);
}
else {
const char* gdml_dmp = ::getenv("DUMP_GDML");
if ( gdml_dmp ) {
G4GDMLParser parser;
Markus Frank
committed
parser.Write(gdml_dmp, w);
Markus Frank
committed
}
Markus Frank
committed
ctxt->world = w;
}