Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// $Id: Geant4Converter.cpp 603 2013-06-13 21:15:14Z markus.frank $
//====================================================================
// AIDA Detector description implementation for LCD
//--------------------------------------------------------------------
//
// Author : M.Frank
//
//====================================================================
// Framework include files
#include "DD4hep/InstanceCount.h"
#include "DDG4/Geant4TrackingPostAction.h"
#include "DDG4/Geant4TrackHandler.h"
// Geant4 include files
#include "G4TrackingManager.hh"
#include <algorithm>
using namespace std;
using namespace DD4hep::Simulation;
struct FindString {
const std::string& m_name;
FindString(const std::string& n) : m_name(n) {}
bool operator()(const std::string& n) const { return m_name == n; }
//template <class T> bool operator==(const std::pair<std::string,T>& cmp) const
//{ return cmp.first == m_name; }
//template <class T> bool operator==(const std::pair<T,std::string>& cmp) const
//{ return cmp.second == m_name; }
};
/// Standard constructor
Geant4TrackingPostAction::Geant4TrackingPostAction(Geant4Context* context, const std::string& name)
: Geant4TrackingAction(context,name)
{
InstanceCount::increment(this);
declareProperty("IgnoredProcesses",m_ignoredProcs);
declareProperty("RequiredProcesses",m_requiredProcs);
}
/// Default destructor
Geant4TrackingPostAction::~Geant4TrackingPostAction() {
InstanceCount::decrement(this);
}
/// Begin-of-tracking callback
void Geant4TrackingPostAction::begin(const G4Track* track) {
// Is the track valid? Is tracking manager valid?
// Does trajectory already exist?
if( 0 == track || 0 == trackMgr() || 0 != trackMgr()->GimmeTrajectory() )
return;
trackMgr()->SetStoreTrajectory(true);
// create GaussTrajectory and inform Tracking Manager
G4VTrajectory* tr = m_context->createTrajectory(track);
trackMgr()->SetTrajectory(tr);
}
/// End-of-tracking callback
void Geant4TrackingPostAction::end(const G4Track* tr) {
if ( 0 == tr )
return;
else if ( 0 == trackMgr() )
return;
Geant4TrackHandler track(tr);
//Geant4TrackInformation* info = track.info<Geant4TrackInformation>();
const string& proc = track.creatorProcess()->GetProcessName();
StringV::const_iterator trIt = find_if(m_ignoredProcs.begin(),m_ignoredProcs.end(),FindString(proc));
if ( trIt != m_ignoredProcs.end() ) {
warning("Particles created by processes of type %s are not kept!",(*trIt).c_str());
return;
}
trIt = find_if(m_requiredProcs.begin(),m_requiredProcs.end(),FindString(proc));
if ( trIt != m_requiredProcs.end() ) {
saveTrack(track);
return;
}
if ( m_storeMarkedTracks ) {
}
}
void Geant4TrackingPostAction::saveTrack(const G4Track* track) {
if ( 0 != track ) {
}
}