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