From 1ca5b740da151e72237e80968f0b0f4b8299431f Mon Sep 17 00:00:00 2001 From: Markus Frank <Markus.Frank@cern.ch> Date: Mon, 11 Jul 2022 15:59:33 +0200 Subject: [PATCH] Reduce number of build threads on MAC --- DDG4/plugins/Geant4GFlashActions.cpp | 366 +++++++++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 DDG4/plugins/Geant4GFlashActions.cpp diff --git a/DDG4/plugins/Geant4GFlashActions.cpp b/DDG4/plugins/Geant4GFlashActions.cpp new file mode 100644 index 000000000..2e786184f --- /dev/null +++ b/DDG4/plugins/Geant4GFlashActions.cpp @@ -0,0 +1,366 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// 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 : M.Frank +// +//========================================================================== + +#ifndef DDG4_GEANT4GFLASHACTION_H +#define DDG4_GEANT4GFLASHACTION_H + +// Framework include files +#include <DDG4/Geant4DetectorConstruction.h> + +// Geant4 include files +#include "G4FastSimulationPhysics.hh" +class GVFlashShowerParameterisation; +class GFlashParticleBounds; +class GFlashShowerModel; +class GFlashHitMaker; + +// C/C++ include files +#include <vector> + +/// Namespace for the AIDA detector description toolkit +namespace dd4hep { + + /// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit + namespace sim { + + class Geant4InputAction; + + /// Steering class for Geant4 GFlash parametrization + /** + * Steering class for Geant4 GFlash parametrization + * + * \author M.Frank + * + * \version 1.0 + * \ingroup DD4HEP_SIMULATION + */ + class Geant4GFlashShowerModel : public Geant4DetectorConstruction { + protected: + /// Define standard assignments and constructors + DDG4_DEFINE_ACTION_CONSTRUCTORS(Geant4GFlashShowerModel); + + /// Region name to which this parametrization should be applied + std::string m_regionName; + /// Name of the shower model constructor + std::string m_modelName; + std::string m_paramName; + + GFlashShowerModel* m_showerModel { nullptr }; + GVFlashShowerParameterisation* m_parametrization { nullptr }; + GFlashParticleBounds* m_particleBounds { nullptr }; + GFlashHitMaker* m_hitMaker { nullptr }; + + public: + /// Standard constructor + Geant4GFlashShowerModel(Geant4Context* context, const std::string& nam); + + /// Default destructor + virtual ~Geant4GFlashShowerModel(); + + /// Geometry construction callback. Called at "Construct()" + virtual void constructGeo(Geant4DetectorConstructionContext* ctxt); + /// Electromagnetic field construction callback. Called at "ConstructSDandField()" + virtual void constructField(Geant4DetectorConstructionContext* ctxt); + /// Sensitive detector construction callback. Called at "ConstructSDandField()" + virtual void constructSensitives(Geant4DetectorConstructionContext* ctxt); + }; + } /* End namespace sim */ +} /* End namespace dd4hep */ +#endif // DDG4_GEANT4GFLASHACTION_H + +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// 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 : M.Frank +// +//========================================================================== + +// #include <DDG4/Geant4GFlashShowerModel.h> +// Framework include files +#include <DDG4/Geant4Action.h> +#include <DDG4/Geant4Kernel.h> + +// Geant4 include files +#include "GVFlashShowerParameterisation.hh" +#include "G4FastSimulationManager.hh" +#include "GFlashShowerModel.hh" +#include "GFlashHitMaker.hh" +#include "GFlashParticleBounds.hh" + +using namespace dd4hep; +using namespace dd4hep::sim; + +/// Standard constructor +Geant4GFlashShowerModel::Geant4GFlashShowerModel(Geant4Context* ctxt, const std::string& nam) + : Geant4DetectorConstruction(ctxt, nam) +{ + declareProperty("Region", m_regionName); + declareProperty("Parametrization", m_paramName); + declareProperty("Model", m_modelName); +} + +/// Default destructor +Geant4GFlashShowerModel::~Geant4GFlashShowerModel() { + detail::deletePtr(m_showerModel); + detail::deletePtr(m_particleBounds); + detail::deletePtr(m_hitMaker); +} + +/// Geometry construction callback. Called at "Construct()" +void Geant4GFlashShowerModel::constructGeo(Geant4DetectorConstructionContext* /* ctxt */) { +} + +/// Electromagnetic field construction callback. Called at "ConstructSDandField()" +void Geant4GFlashShowerModel::constructField(Geant4DetectorConstructionContext* /* ctxt */) { +} + +/// Sensitive detector construction callback. Called at "ConstructSDandField()" +void Geant4GFlashShowerModel::constructSensitives(Geant4DetectorConstructionContext* /* ctxt */) { + auto& kernel = this->context()->kernel(); + G4Region* region = 0; + Geant4Action* action = nullptr; + if ( !this->m_parametrization && this->m_paramName.empty() ) { + except("No proper parametrization name supplied in the properties: %s",this->m_paramName.c_str()); + } + + this->m_showerModel = new GFlashShowerModel(this->name(), region); + if ( !this->m_parametrization ) { + action = kernel.globalAction(this->m_paramName, false); + if ( action ) { + this->m_parametrization = dynamic_cast<GVFlashShowerParameterisation*>(action); + if ( !this->m_parametrization ) { + except("The supplied parametrization %s was found as Geant4Action, but is no " + "GVFlashShowerParameterisation!", this->m_paramName.c_str()); + } + } + } + this->m_hitMaker = new GFlashHitMaker(); + this->m_particleBounds = new GFlashParticleBounds(); + this->m_showerModel->SetParameterisation(*this->m_parametrization); + this->m_showerModel->SetParticleBounds(*this->m_particleBounds); + this->m_showerModel->SetHitMaker(*this->m_hitMaker); +} + +#if 0 + // Get nist material manager + G4NistManager* nistManager = G4NistManager::Instance(); + G4Material* pbWO4 = nistManager->FindOrBuildMaterial("G4_PbWO4"); + // -- fast simulation models: + // ********************************************** + // * Initializing shower modell + // *********************************************** + G4cout << "Creating shower parameterization models" << G4endl; + fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); + fParameterisation = new GFlashHomoShowerParameterisation(pbWO4); + fFastShowerModel->SetParameterisation(*fParameterisation); + // Energy Cuts to kill particles: + fParticleBounds = new GFlashParticleBounds(); + fFastShowerModel->SetParticleBounds(*fParticleBounds); + // Makes the EnergieSpots + fHitMaker = new GFlashHitMaker(); + fFastShowerModel->SetHitMaker(*fHitMaker); +#endif + + +#if 0 +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +main() { + // -- Create a fast simulation physics constructor, used to augment + // -- the above physics list to allow for fast simulation: + G4FastSimulationPhysics* fastSimulationPhysics = new G4FastSimulationPhysics(); + // -- We now configure the fastSimulationPhysics object. + // -- The gflash model (GFlashShowerModel, see ExGflashDetectorConstruction.cc) + // -- is applicable to e+ and e- : we augment the physics list for these + // -- particles (by adding a G4FastSimulationManagerProcess with below's + // -- calls), this will make the fast simulation to be activated: + fastSimulationPhysics->ActivateFastSimulation("e-"); + fastSimulationPhysics->ActivateFastSimulation("e+"); + // -- Register this fastSimulationPhysics to the physicsList, + // -- when the physics list will be called by the run manager + // -- (will happen at initialization of the run manager) + // -- for physics process construction, the fast simulation + // -- configuration will be applied as well. + physicsList->RegisterPhysics( fastSimulationPhysics ); +} + +//------------------------------------------------------------------------------------------------ +void ExGflash1DetectorConstruction::ConstructSDandField() +{ + // -- sensitive detectors: + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + ExGflash1SensitiveDetector* CaloSD + = new ExGflash1SensitiveDetector("Calorimeter",this); + SDman->AddNewDetector(CaloSD); + fCrystalLog->SetSensitiveDetector(CaloSD); + + // Get nist material manager + G4NistManager* nistManager = G4NistManager::Instance(); + G4Material* pbWO4 = nistManager->FindOrBuildMaterial("G4_PbWO4"); + // -- fast simulation models: + // ********************************************** + // * Initializing shower modell + // *********************************************** + G4cout << "Creating shower parameterization models" << G4endl; + fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); + fParameterisation = new GFlashHomoShowerParameterisation(pbWO4); + fFastShowerModel->SetParameterisation(*fParameterisation); + // Energy Cuts to kill particles: + fParticleBounds = new GFlashParticleBounds(); + fFastShowerModel->SetParticleBounds(*fParticleBounds); + // Makes the EnergieSpots + fHitMaker = new GFlashHitMaker(); + fFastShowerModel->SetHitMaker(*fHitMaker); + G4cout<<"end shower parameterization."<<G4endl; + // ********************************************** +} + +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +main() { + auto detector = new ExGflash2DetectorConstruction(); + detector->RegisterParallelWorld(new ExGflash2ParallelWorld("parallelWorld")); + runManager->SetUserInitialization(detector); + + // G4cout<<"# GFlash Example: Physics "<<G4endl; + // -- Select a physics list: + G4VModularPhysicsList* physicsList = new FTFP_BERT(); + // -- Create a fast simulation physics constructor, used to augment + // -- the above physics list to allow for fast simulation: + G4FastSimulationPhysics* fastSimulationPhysics = new G4FastSimulationPhysics(); + // -- We now configure the fastSimulationPhysics object. + // -- The gflash model (GFlashShowerModel, see ExGflashDetectorConstruction.cc) + // -- is applicable to e+ and e- : we augment the physics list for these + // -- particles (by adding a G4FastSimulationManagerProcess with below's + // -- calls), this will make the fast simulation to be activated: + fastSimulationPhysics->ActivateFastSimulation("e-", "parallelWorld"); + fastSimulationPhysics->ActivateFastSimulation("e+", "parallelWorld"); + // -- Register this fastSimulationPhysics to the physicsList, + // -- when the physics list will be called by the run manager + // -- (will happen at initialization of the run manager) + // -- for physics process construction, the fast simulation + // -- configuration will be applied as well. + physicsList->RegisterPhysics( fastSimulationPhysics ); + runManager->SetUserInitialization(physicsList); + + // Action initialization: + runManager->SetUserInitialization(new ExGflashActionInitialization); +} + +//------------------------------------------------------------------------------------------------ +void ExGflash2ParallelWorld::ConstructSD() +{ + // Get nist material manager + G4NistManager* nistManager = G4NistManager::Instance(); + G4Material* pbWO4 = nistManager->FindOrBuildMaterial("G4_PbWO4"); + // -- fast simulation models: + // ********************************************** + // * Initializing shower modell + // *********************************************** + fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); + fParameterisation = new GFlashHomoShowerParameterisation(pbWO4); + fFastShowerModel->SetParameterisation(*fParameterisation); + // Energy Cuts to kill particles: + fParticleBounds = new GFlashParticleBounds(); + fFastShowerModel->SetParticleBounds(*fParticleBounds); + // Makes the EnergieSpots + fHitMaker = new GFlashHitMaker(); + fFastShowerModel->SetHitMaker(*fHitMaker); +} + +//------------------------------------------------------------------------------------------------ +void ExGflash2DetectorConstruction::ConstructSDandField() +{ + // -- sensitive detectors: + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + ExGflash2SensitiveDetector* CaloSD + = new ExGflash2SensitiveDetector("Calorimeter",this); + SDman->AddNewDetector(CaloSD); + fCrystalLog->SetSensitiveDetector(CaloSD); + + // Fast simulation implemented in ExGflash2ParallelWorld +} + + +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +main() { + auto detector = new ExGflash3DetectorConstruction(); + detector->RegisterParallelWorld(new ExGflash3ParallelWorld("parallelWorld")); + runManager->SetUserInitialization(detector); + + // G4cout<<"# GFlash Example: Physics "<<G4endl; + // -- Select a physics list: + G4VModularPhysicsList* physicsList = new FTFP_BERT(); + // -- Create a fast simulation physics constructor, used to augment + // -- the above physics list to allow for fast simulation: + G4FastSimulationPhysics* fastSimulationPhysics = new G4FastSimulationPhysics(); + // -- We now configure the fastSimulationPhysics object. + // -- The gflash model (GFlashShowerModel, see ExGflashDetectorConstruction.cc) + // -- is applicable to e+ and e- : we augment the physics list for these + // -- particles (by adding a G4FastSimulationManagerProcess with below's + // -- calls), this will make the fast simulation to be activated: + fastSimulationPhysics->ActivateFastSimulation("e-"); + fastSimulationPhysics->ActivateFastSimulation("e+"); + // -- Register this fastSimulationPhysics to the physicsList, + // -- when the physics list will be called by the run manager + // -- (will happen at initialization of the run manager) + // -- for physics process construction, the fast simulation + // -- configuration will be applied as well. + physicsList->RegisterPhysics( new G4ParallelWorldPhysics("parallelWorld") ); + physicsList->RegisterPhysics( fastSimulationPhysics ); + runManager->SetUserInitialization(physicsList); +} + +//------------------------------------------------------------------------------------------------ +void ExGflash3ParallelWorld::ConstructSD() +{ + // -- sensitive detectors: + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + ExGflash3SensitiveDetector* CaloSD + = new ExGflash3SensitiveDetector("Calorimeter",this); + SDman->AddNewDetector(CaloSD); + fCrystalLog->SetSensitiveDetector(CaloSD); +} +//------------------------------------------------------------------------------------------------ +void ExGflash3DetectorConstruction::ConstructSDandField() +{ + // SD moved to parallel world + // -- fast simulation models: + // ********************************************** + // * Initializing shower modell + // *********************************************** + fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); + fParameterisation = new GFlashHomoShowerParameterisation(fRegion->GetMaterialIterator()[0]); + fFastShowerModel->SetParameterisation(*fParameterisation); + // Energy Cuts to kill particles: + fParticleBounds = new GFlashParticleBounds(); + fFastShowerModel->SetParticleBounds(*fParticleBounds); + // Makes the EnergieSpots + fHitMaker = new GFlashHitMaker(); + // Important: use SD defined in different geometry + fHitMaker->SetNameOfWorldWithSD("parallelWorld"); + fFastShowerModel->SetHitMaker(*fHitMaker); +} +//------------------------------------------------------------------------------------------------ +#endif + -- GitLab