Newer
Older
Markus Frank
committed
//==========================================================================
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.
//
// Author : M.Frank
//
//==========================================================================
#ifndef DD4HEP_DDG4_GEANT4HITDUMPACTION_H
#define DD4HEP_DDG4_GEANT4HITDUMPACTION_H
// Framework include files
Markus Frank
committed
// Forward declarations
class G4VHitsCollection;
/// Namespace for the AIDA detector description toolkit
Markus Frank
committed
/// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit
Markus Frank
committed
// Forward declarations
class Geant4ParticleMap;
/// Class to measure the energy of escaping tracks
/** Class to measure the energy of escaping tracks of a detector using Geant 4
* Measure escaping energy....
*
* \author M.Frank
* \version 1.0
* \ingroup DD4HEP_SIMULATION
*/
class Geant4HitDumpAction : public Geant4EventAction {
public:
typedef std::vector<std::string> CollectionNames;
/// Property: collection names to be dumped
CollectionNames m_containers;
/// Dump single container of hits
void dumpCollection(G4VHitsCollection* hc);
public:
/// Standard constructor
Geant4HitDumpAction(Geant4Context* context, const std::string& nam);
/// Default destructor
virtual ~Geant4HitDumpAction();
/// Geant4EventAction interface: Begin-of-event callback
virtual void begin(const G4Event* event) override;
/// Geant4EventAction interface: End-of-event callback
virtual void end(const G4Event* event) override;
};
} // End namespace sim
} // End namespace dd4hep
Markus Frank
committed
#endif /* DD4HEP_DDG4_GEANT4HITDUMPACTION_H */
//====================================================================
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.
//
// Author : M.Frank
//
//====================================================================
// Framework include files
#include <DD4hep/InstanceCount.h>
#include <DDG4/Geant4DataDump.h>
#include <DDG4/Geant4HitCollection.h>
Markus Frank
committed
// Geant 4 includes
#include <G4HCofThisEvent.hh>
#include <G4Event.hh>
Markus Frank
committed
using namespace std;
using namespace dd4hep;
using namespace dd4hep::sim;
Markus Frank
committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/// Standard constructor
Geant4HitDumpAction::Geant4HitDumpAction(Geant4Context* ctxt, const string& nam)
: Geant4EventAction(ctxt, nam), m_containers{"*"}
{
m_needsControl = true;
declareProperty("Collections",m_containers);
InstanceCount::increment(this);
}
/// Default destructor
Geant4HitDumpAction::~Geant4HitDumpAction() {
InstanceCount::decrement(this);
}
/// Geant4EventAction interface: Begin-of-event callback
void Geant4HitDumpAction::begin(const G4Event* /* event */) {
}
/// Dump single container of hits
void Geant4HitDumpAction::dumpCollection(G4VHitsCollection* collection) {
Geant4HitCollection* coll = dynamic_cast<Geant4HitCollection*>(collection);
string nam = collection->GetName();
if ( coll ) {
Geant4DataDump::CalorimeterHits cal_hits;
Geant4DataDump::TrackerHits trk_hits;
Geant4DataDump dump(name());
size_t nhits = coll->GetSize();
for(size_t i=0; i<nhits; ++i) {
Geant4HitData* h = coll->hit(i);
Geant4Tracker::Hit* trk_hit = dynamic_cast<Geant4Tracker::Hit*>(h);
if ( 0 != trk_hit ) {
trk_hits.emplace_back(trk_hit);
Markus Frank
committed
}
Geant4Calorimeter::Hit* cal_hit = dynamic_cast<Geant4Calorimeter::Hit*>(h);
if ( 0 != cal_hit ) {
cal_hits.emplace_back(cal_hit);
Markus Frank
committed
}
}
if ( !trk_hits.empty() )
dump.print(ALWAYS,nam,&trk_hits);
if ( !cal_hits.empty() )
dump.print(ALWAYS,nam,&cal_hits);
}
}
/// Geant4EventAction interface: End-of-event callback
void Geant4HitDumpAction::end(const G4Event* event) {
G4HCofThisEvent* hce = event->GetHCofThisEvent();
if ( hce ) {
int nCol = hce->GetNumberOfCollections();
bool all = !m_containers.empty() && m_containers[0] == "*";
for (int i = 0; i < nCol; ++i) {
G4VHitsCollection* hc = hce->GetHC(i);
if ( all || find(m_containers.begin(),m_containers.end(),hc->GetName()) != m_containers.end() )
dumpCollection(hc);
}
return;
}
warning("+++ [Event:%d] The value of G4HCofThisEvent is NULL.",event->GetEventID());
}
Markus Frank
committed
DECLARE_GEANT4ACTION(Geant4HitDumpAction)