diff --git a/DDCore/src/DetectorData.cpp b/DDCore/src/DetectorData.cpp
index 3aa011587986a17f75b83c4d324416138d3f3a0a..8d299f9adef7089df7f02904f1f0fb9da17fc385 100644
--- a/DDCore/src/DetectorData.cpp
+++ b/DDCore/src/DetectorData.cpp
@@ -270,38 +270,40 @@ void DetectorData::clearData() {
/// Adopt all data from source structure
void DetectorData::adoptData(DetectorData& source, bool clr) {
- m_inhibitConstants = source.m_inhibitConstants;
+ m_inhibitConstants = source.m_inhibitConstants;
m_extensions.move(source.m_extensions);
- m_manager = source.m_manager;
- m_readouts = source.m_readouts;
- m_idDict = source.m_idDict;
- m_limits = source.m_limits;
- m_regions = source.m_regions;
- m_detectors = source.m_detectors;
- m_sensitive = source.m_sensitive;
- m_display = source.m_display;
- m_fields = source.m_fields;
- m_define = source.m_define;
+ m_manager = source.m_manager;
+ m_readouts = source.m_readouts;
+ m_idDict = source.m_idDict;
+ m_limits = source.m_limits;
+ m_regions = source.m_regions;
+ m_detectors = source.m_detectors;
+ m_sensitive = source.m_sensitive;
+ m_display = source.m_display;
+ m_fields = source.m_fields;
+ m_define = source.m_define;
- m_detectorParents = source.m_detectorParents;
- m_world = source.m_world;
- m_trackers = source.m_trackers;
- m_worldVol = source.m_worldVol;
- m_trackingVol = source.m_trackingVol;
- m_parallelWorldVol = source.m_parallelWorldVol;
- m_materialAir = source.m_materialAir;
- m_materialVacuum = source.m_materialVacuum;
- m_invisibleVis = source.m_invisibleVis;
- m_field = source.m_field;
- m_header = source.m_header;
- m_properties = source.m_properties;
- //m_extensions = source.m_extensions;
- m_volManager = source.m_volManager;
+ m_detectorParents = source.m_detectorParents;
+ m_world = source.m_world;
+ World w = m_world;
+ w->description = dynamic_cast<Detector*>(this);
+ m_trackers = source.m_trackers;
+ m_worldVol = source.m_worldVol;
+ m_trackingVol = source.m_trackingVol;
+ m_parallelWorldVol = source.m_parallelWorldVol;
+ m_materialAir = source.m_materialAir;
+ m_materialVacuum = source.m_materialVacuum;
+ m_invisibleVis = source.m_invisibleVis;
+ m_field = source.m_field;
+ m_header = source.m_header;
+ m_properties = source.m_properties;
+ //m_extensions = source.m_extensions;
+ m_volManager = source.m_volManager;
// Update world element
m_world.setPlacement(m_manager->GetTopNode());
// Need to update some global stuff
if ( gGeoManager != m_manager ) delete gGeoManager;
- gGeoManager = m_manager;
+ gGeoManager = m_manager;
if ( clr ) source.clearData();
}
diff --git a/DDG4/include/DDG4/Geant4PhysicsList.h b/DDG4/include/DDG4/Geant4PhysicsList.h
index 8b865a91d441775450fe4e81719b76ccde2e348c..91aea5d47577a59542a239ebe2c454adf5a8875e 100644
--- a/DDG4/include/DDG4/Geant4PhysicsList.h
+++ b/DDG4/include/DDG4/Geant4PhysicsList.h
@@ -101,8 +101,9 @@ namespace dd4hep {
typedef std::vector<PhysicsConstructor> PhysicsConstructors;
PhysicsProcesses m_processes;
- ParticleConstructors m_particles;
PhysicsConstructors m_physics;
+ ParticleConstructors m_particles;
+ ParticleConstructors m_particlegroups;
public:
/// Standard constructor with initailization parameters
@@ -133,6 +134,14 @@ namespace dd4hep {
const ParticleConstructors& particles() const {
return m_particles;
}
+ /// Access all physics particlegroups
+ ParticleConstructors& particlegroups() {
+ return m_particlegroups;
+ }
+ /// Access all physics particlegroups
+ const ParticleConstructors& particlegroups() const {
+ return m_particlegroups;
+ }
/// Access all physics constructors
PhysicsConstructors& physics() {
return m_physics;
@@ -144,6 +153,8 @@ namespace dd4hep {
/// Add physics particle constructor by name
void addParticleConstructor(const std::string& part_name);
+ /// Add physics particle group constructor by name (Leptons, Bosons, Mesons, etc.)
+ void addParticleGroup(const std::string& part_name);
/// Add particle process by name with arguments
void addParticleProcess(const std::string& part_name, const std::string& proc_name,
int ordAtRestDoIt,int ordAlongSteptDoIt,int ordPostStepDoIt);
diff --git a/DDG4/src/Geant4PhysicsList.cpp b/DDG4/src/Geant4PhysicsList.cpp
index 47bd6ccfdcd80f7c37e44e4246d9bb885cbbb524..c07fa6a3d9ab2ddd8dcf937cfc6e9d8bf001bf9d 100644
--- a/DDG4/src/Geant4PhysicsList.cpp
+++ b/DDG4/src/Geant4PhysicsList.cpp
@@ -128,6 +128,11 @@ void Geant4PhysicsList::addParticleConstructor(const std::string& part_name) {
particles().push_back(part_name);
}
+/// Add physics particle constructor by name
+void Geant4PhysicsList::addParticleGroup(const std::string& part_name) {
+ particlegroups().push_back(part_name);
+}
+
/// Add particle process by name with arguments
void Geant4PhysicsList::addParticleProcess(const std::string& part_name,
const std::string& proc_name,
@@ -215,8 +220,17 @@ void Geant4PhysicsList::constructParticles(G4VUserPhysicsList* physics_pointer)
if (!result || *result != 1L) {
except("Failed to create particle type '%s' result=%d", ctor.c_str(), result);
}
+ info("Constructed Geant4 particle %s [using signature long (*)()]",ctor.c_str());
+ }
+ }
+ /// Now define all particles
+ for (ParticleConstructors::const_iterator i = m_particlegroups.begin(); i != m_particlegroups.end(); ++i) {
+ const ParticleConstructors::value_type& ctor = *i;
+ /// Check if we have here a particle group constructor
+ long* result = (long*) PluginService::Create<long>(ctor);
+ if (!result || *result != 1L) {
+ except("Failed to create particle type '%s' result=%d", ctor.c_str(), result);
}
- info("Constructed Geant4 particle %s [using signature long (*)()]",ctor.c_str());
}
}
diff --git a/examples/CLICSiD/scripts/CLICSid.py b/examples/CLICSiD/scripts/CLICSid.py
index a7d8ee7a6fd58f26b07bd710d88d635065e4d31d..eae570acc42bfc29a8978b2ce032fab790744a30 100644
--- a/examples/CLICSiD/scripts/CLICSid.py
+++ b/examples/CLICSiD/scripts/CLICSid.py
@@ -37,9 +37,9 @@ class CLICSid:
phys = self.geant4.setupPhysics(model)
ph = DDG4.PhysicsList(self.kernel,'Geant4PhysicsList/Myphysics')
# Add bosons to the model (redundant if already implemented by the model)
- ph.addParticleConstructor('G4BosonConstructor')
+ ph.addParticleGroup('G4BosonConstructor')
# Add leptons to the model (redundant if already implemented by the model)
- ph.addParticleConstructor('G4LeptonConstructor')
+ ph.addParticleGroup('G4LeptonConstructor')
# Add multiple scattering in the material
ph.addParticleProcess('e[+-]','G4eMultipleScattering',-1,1,1)
# Add optical physics (RICH dets etc)