Skip to content
Snippets Groups Projects
Geant4EscapeCounter.cpp 4.79 KiB
Newer Older
//==========================================================================
Markus Frank's avatar
Markus Frank committed
//  AIDA Detector description implementation 
//--------------------------------------------------------------------------
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
#ifndef DD4HEP_DDG4_GEANT4ESCAPECOUNTER_H
#define DD4HEP_DDG4_GEANT4ESCAPECOUNTER_H

#include <DD4hep/DetElement.h>
#include <DDG4/Geant4SensDetAction.h>
#include <DDG4/Geant4SteppingAction.h>
/// Namespace for the AIDA detector description toolkit
Markus Frank's avatar
Markus Frank committed
namespace dd4hep {
  /// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit
Markus Frank's avatar
Markus Frank committed
  namespace sim {
    /// Class to measure the energy of escaping tracks
    /** Class to measure the energy of escaping tracks of a detector using Geant 4
Markus Frank's avatar
Markus Frank committed
     * Measure escaping energy....
     *
     *  \author  M.Frank
     *  \version 1.0
     *  \ingroup DD4HEP_SIMULATION
Markus Frank's avatar
Markus Frank committed
     */
    class Geant4EscapeCounter : /* virtual public Geant4SteppingAction, virtual */ public Geant4Sensitive {
      /// Collection identifiers
      size_t m_collectionID;
Markus Frank's avatar
Markus Frank committed
      std::vector<std::string> m_detectorNames;
Markus Frank's avatar
Markus Frank committed
    public:
      /// Standard constructor
Markus Frank's avatar
Markus Frank committed
      Geant4EscapeCounter(Geant4Context* ctxt, const std::string& name, DetElement det, Detector& description);
Markus Frank's avatar
Markus Frank committed
      /// Default destructor
      virtual ~Geant4EscapeCounter();
      /// G4VSensitiveDetector interface: Method for generating hit(s) using the information of G4Step object.
      virtual bool process(const G4Step* step, G4TouchableHistory* history)  override;
Markus Frank's avatar
Markus Frank committed
  }    // End namespace sim
}      // End namespace dd4hep
Markus Frank's avatar
Markus Frank committed

#endif /* DD4HEP_DDG4_GEANT4ESCAPECOUNTER_H */

//====================================================================
Markus Frank's avatar
Markus Frank committed
//  AIDA Detector description implementation 
Markus Frank's avatar
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.
Markus Frank's avatar
Markus Frank committed
//
Markus Frank's avatar
Markus Frank committed
//
//====================================================================
// Framework include files
#include <DD4hep/Printout.h>
#include <DD4hep/InstanceCount.h>
#include <DDG4/Geant4TouchableHandler.h>
#include <DDG4/Geant4TrackHandler.h>
#include <DDG4/Geant4StepHandler.h>
#include <DDG4/Geant4Mapping.h>
#include <DDG4/Geant4Data.h>
#include <CLHEP/Units/SystemOfUnits.h>
#include <G4VProcess.hh>
Markus Frank's avatar
Markus Frank committed
using namespace dd4hep::sim;
Markus Frank's avatar
Markus Frank committed

/// Standard constructor
Geant4EscapeCounter::Geant4EscapeCounter(Geant4Context* ctxt, const std::string& nam, DetElement det, Detector& description_ref)
Markus Frank's avatar
Markus Frank committed
  : Geant4Sensitive(ctxt, nam, det, description_ref)
Markus Frank's avatar
Markus Frank committed
{
  std::string coll_name = name()+"Hits";
Markus Frank's avatar
Markus Frank committed
  m_needsControl = true;
  declareProperty("Shells",m_detectorNames);
  m_collectionID = defineCollection<SimpleTracker::Hit>(coll_name);
  InstanceCount::increment(this);
}

/// Default destructor
Geant4EscapeCounter::~Geant4EscapeCounter() {
  InstanceCount::decrement(this);
}

/// G4VSensitiveDetector interface: Method for generating hit(s) using the information of G4Step object.
bool Geant4EscapeCounter::process(const G4Step* step, G4TouchableHistory* /* history */)   {
Markus Frank's avatar
Markus Frank committed
  Geant4StepHandler  h(step);
Markus Frank's avatar
Markus Frank committed
  Geant4TrackHandler th(h.track);
  Geant4TouchableHandler handler(step);
  std::string hdlr_path  = handler.path();
Markus Frank's avatar
Markus Frank committed
  Position prePos     = h.prePos();
Markus Frank's avatar
Markus Frank committed
  Geant4HitCollection* coll = collection(m_collectionID);
  SimpleTracker::Hit*  hit = new SimpleTracker::Hit();
  hit->g4ID          = th.id();
  hit->energyDeposit = h.deposit();
Markus Frank's avatar
Markus Frank committed
  hit->cellID        = volumeID(step);
  hit->energyDeposit = th.energy();
  hit->position      = prePos;
  hit->momentum      = h.trkMom();
Markus Frank's avatar
Markus Frank committed
  hit->length        = (h.postPos()-prePos).R();
  hit->truth.trackID = th.id();
  hit->truth.deposit = h.deposit();
  hit->truth.pdgID   = th.pdgID();
  hit->truth.deposit = h.deposit();
  hit->truth.time    = th.time();
  hit->truth.length  = hit->length;
  hit->truth.x       = hit->position.x();
  hit->truth.y       = hit->position.y();
  hit->truth.z       = hit->position.z();
Markus Frank's avatar
Markus Frank committed
  coll->add(hit);
  mark(h.track);
  print("+++ Track:%4d  %8.2f MeV [%s] %s Geant4 path:%s",
        h.trkID(),h.trkEnergy()/CLHEP::MeV,th.name().c_str(),
        th.creatorName().c_str(),hdlr_path.c_str());
Markus Frank's avatar
Markus Frank committed
  // Kill track, so that it does no longer participate in the propagation
  step->GetTrack()->SetTrackStatus(fStopAndKill);
Markus Frank's avatar
Markus Frank committed
  return true;
}

#include <DDG4/Factories.h>
Markus Frank's avatar
Markus Frank committed
DECLARE_GEANT4SENSITIVE(Geant4EscapeCounter)