-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathC4TrackInfo.h
More file actions
142 lines (115 loc) · 3.74 KB
/
C4TrackInfo.h
File metadata and controls
142 lines (115 loc) · 3.74 KB
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
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#pragma once
/**
C4TrackInfo.h (from opticks/sysrap/STrackInfo.h)
===================================================
Required methods for T::
std::string desc() const ;
T T::Placeholder() ;
T T::Fabricate(int id) ;
**/
#include <string>
#include "G4Track.hh"
#include "G4VUserTrackInformation.hh"
template<typename T>
struct C4TrackInfo : public G4VUserTrackInformation
{
T label ;
C4TrackInfo(const T& label);
std::string desc() const ;
static C4TrackInfo<T>* GetTrackInfo(const G4Track* track);
static C4TrackInfo<T>* GetTrackInfo_dynamic(const G4Track* track);
static bool Exists(const G4Track* track);
static T Get( const G4Track* track); // by value
static T* GetRef(const G4Track* track); // by reference, allowing inplace changes
static std::string Desc(const G4Track* track);
static void Set(G4Track* track, const T& label );
};
template<typename T>
inline C4TrackInfo<T>::C4TrackInfo(const T& _label )
:
G4VUserTrackInformation("C4TrackInfo"),
label(_label)
{
}
template<typename T>
inline std::string C4TrackInfo<T>::desc() const
{
std::stringstream ss ;
ss << *pType << " " << label.desc() ;
std::string str = ss.str();
return str ;
}
/**
C4TrackInfo::GetTrackInfo
--------------------------
With U4PhotonInfo the ancestor of STrackInfo was using dynamic_cast
without issue. After moving to the templated STrackInfo the
dynamic cast always giving nullptr. So switched to static_cast.
**/
template<typename T>
inline C4TrackInfo<T>* C4TrackInfo<T>::GetTrackInfo(const G4Track* track) // static, label by value
{
G4VUserTrackInformation* ui = track->GetUserInformation() ;
C4TrackInfo<T>* trackinfo = ui ? static_cast<C4TrackInfo<T>*>(ui) : nullptr ;
return trackinfo ;
}
template<typename T>
inline C4TrackInfo<T>* C4TrackInfo<T>::GetTrackInfo_dynamic(const G4Track* track) // static, label by value
{
G4VUserTrackInformation* ui = track->GetUserInformation() ;
C4TrackInfo<T>* trackinfo = ui ? dynamic_cast<C4TrackInfo<T>*>(ui) : nullptr ;
return trackinfo ;
}
template<typename T>
inline bool C4TrackInfo<T>::Exists(const G4Track* track) // static
{
C4TrackInfo<T>* trackinfo = GetTrackInfo(track);
return trackinfo != nullptr ;
}
template<typename T>
inline T C4TrackInfo<T>::Get(const G4Track* track) // static, label by value
{
C4TrackInfo<T>* trackinfo = GetTrackInfo(track);
return trackinfo ? trackinfo->label : T::Placeholder() ;
}
template<typename T>
inline T* C4TrackInfo<T>::GetRef(const G4Track* track) // static, label reference
{
C4TrackInfo<T>* trackinfo = GetTrackInfo(track);
return trackinfo ? &(trackinfo->label) : nullptr ;
}
template<typename T>
inline std::string C4TrackInfo<T>::Desc(const G4Track* track)
{
G4VUserTrackInformation* ui = track->GetUserInformation() ;
C4TrackInfo<T>* trackinfo = GetTrackInfo(track);
C4TrackInfo<T>* trackinfo_dyn = GetTrackInfo_dynamic(track);
std::stringstream ss ;
ss << "C4TrackInfo::Desc"
<< std::endl
<< " track " << track
<< " track.GetUserInformation " << ui
<< std::endl
<< " trackinfo " << trackinfo
<< " trackinfo_dyn " << trackinfo_dyn
<< std::endl
<< " trackinfo.desc " << ( trackinfo ? trackinfo->desc() : "-" )
<< std::endl
<< " trackinfo_dyn.desc " << ( trackinfo_dyn ? trackinfo_dyn->desc() : "-" )
;
std::string str = ss.str();
return str ;
}
template<typename T>
inline void C4TrackInfo<T>::Set(G4Track* track, const T& _label ) // static
{
T* label = GetRef(track);
if(label == nullptr)
{
track->SetUserInformation(new C4TrackInfo<T>(_label));
}
else
{
*label = _label ;
}
}