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

// Framework include files
#include "DDG4/Geant4StepHandler.h"
#include "DDSegmentation/Segmentation.h"
#include "DD4hep/DD4hepUnits.h"
#include "CLHEP/Units/SystemOfUnits.h"

// Geant4 include files
#include "G4Version.hh"

Markus Frank's avatar
Markus Frank committed
namespace units = dd4hep;
using namespace dd4hep;
using namespace dd4hep::sim;
/// Returns the step status in form of a string
Markus Frank's avatar
Markus Frank committed
const char* Geant4StepHandler::stepStatus(G4StepStatus status) {
  switch (status) {
  case fWorldBoundary:
    return "WorldBoundary";
Markus Frank's avatar
Markus Frank committed
    // Step defined by a geometry boundary
  case fGeomBoundary:
    return "GeomBoundary";
Markus Frank's avatar
Markus Frank committed
    // Step defined by a PreStepDoItVector
  case fAtRestDoItProc:
    return "AtRestDoItProc";
Markus Frank's avatar
Markus Frank committed
    // Step defined by a AlongStepDoItVector
  case fAlongStepDoItProc:
    return "AlongStepDoItProc";
Markus Frank's avatar
Markus Frank committed
    // Step defined by a PostStepDoItVector
  case fPostStepDoItProc:
    return "PostStepDoItProc";
Markus Frank's avatar
Markus Frank committed
    // Step defined by the user Step limit in the logical volume
  case fUserDefinedLimit:
    return "UserDefinedLimit";
    // Step defined by an exclusively forced PostStepDoIt process
  case fExclusivelyForcedProc:
    return "ExclusivelyForcedProc";
Markus Frank's avatar
Markus Frank committed
    // Step not defined yet
  case fUndefined:
  default:
    return "Undefined";
/// Returns the pre-step status in form of a string
const char* Geant4StepHandler::preStepStatus() const {
Markus Frank's avatar
Markus Frank committed
  return stepStatus(pre ? pre->GetStepStatus() : fUndefined);
}

/// Returns the post-step status in form of a string
Markus Frank's avatar
Markus Frank committed
const char* Geant4StepHandler::postStepStatus() const {
  return stepStatus(post ? post->GetStepStatus() : fUndefined);
}
/// Apply BirksLaw
double Geant4StepHandler::birkAttenuation() const    {
#if G4VERSION_NUMBER >= 1001
  static G4EmSaturation s_emSaturation(1);
  s_emSaturation.SetVerbose(1);
#if G4VERSION_NUMBER >= 1030
  static bool s_initialised = false;
  if(not s_initialised) {
      s_emSaturation.InitialiseG4Saturation();
      s_initialised = true;
  }
ebrianne's avatar
ebrianne committed
#endif
  double energyDeposition = step->GetTotalEnergyDeposit();
  double length = step->GetStepLength();
  double niel   = step->GetNonIonizingEnergyDeposit();
  const G4Track* trk = step->GetTrack();
  const G4ParticleDefinition* particle = trk->GetDefinition();
  const G4MaterialCutsCouple* couple = trk->GetMaterialCutsCouple();
  double engyVis = s_emSaturation.VisibleEnergyDeposition(particle,
                                                          couple,
                                                          length,
                                                          energyDeposition,
                                                          niel);
  return engyVis;
}