Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4TrajectoryDrawByAttribute.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27//
28// Jane Tinslay August 2006
29//
31#include "G4AttDef.hh"
32#include "G4AttFilterUtils.hh"
33#include "G4AttUtils.hh"
34#include "G4AttValue.hh"
36#include "G4VAttValueFilter.hh"
37#include "G4VisTrajContext.hh"
38#include "G4VTrajectory.hh"
39#include <assert.h>
40
42 :G4VTrajectoryModel(name, context)
43 ,fAttName("")
44 ,fFirst(true)
45 ,fWarnedMissingAttribute(false)
46 ,filter(0)
47{}
48
50{
51 ContextMap::iterator iter = fContextMap.begin();
52
53 while (iter != fContextMap.end()) {
54 delete iter->second;
55 iter++;
56 }
57
58 delete filter;
59}
60
61void
63 const G4int&,
64 const G4bool& visible) const
65{
66 Draw(object, visible);
67}
68
69void
71 const G4bool& visible) const
72{
73 // Return if attribute name has not been set. Just print one warning
74 if (fAttName.isNull()) {
75
76 if (!fWarnedMissingAttribute) {
78 ed<<"Null attribute name";
79 G4Exception("G4TrajectoryDrawByAttribute::Draw",
80 "modeling0116",
81 JustWarning, ed);
82 fWarnedMissingAttribute = true;
83 }
84
85 return;
86 }
87
88 // Basically cache data loaded filter for efficiency
89 if (fFirst) {
90
91 fFirst = false;
92
93 // Get attribute definition
94 G4AttDef attDef;
95
96 // Expect definition to exist
97 if (!G4AttUtils::ExtractAttDef(object, fAttName, attDef)) {
98 static G4bool warnedUnableToExtract = false;
99 if (!warnedUnableToExtract) {
101 ed <<"Unable to extract attribute definition named "<<fAttName;
103 ("G4TrajectoryDrawByAttribute::Draw",
104 "modeling0117", JustWarning, ed, "Invalid attribute name");
105 G4cout << "Available attributes:\n"
106 << object.GetAttDefs();
107 warnedUnableToExtract = true;
108 }
109 return;
110 }
111
112 // Get new G4AttValue filter
113 filter = G4AttFilterUtils::GetNewFilter(attDef);
114 assert (0 != filter);
115
116 // Load both interval and single valued data. Single valued data should
117 // override interval data.
118 ContextMap::const_iterator iter = fContextMap.begin();
119
120 while (iter != fContextMap.end()) {
121 if (iter->first.second == G4TrajectoryDrawByAttribute::Interval) {
122 filter->LoadIntervalElement(iter->first.first);
123 }
124 else if (iter->first.second == G4TrajectoryDrawByAttribute::SingleValue) {
125 filter->LoadSingleValueElement(iter->first.first);
126 }
127 iter++;
128 }
129 }
130
131 // Get attribute value
132 G4AttValue attVal;
133
134 // Expect value to exist
135 if (!G4AttUtils::ExtractAttValue(object, fAttName, attVal)) {
136 static G4bool warnedUnableToExtract = false;
137 if (!warnedUnableToExtract) {
139 ed <<"Unable to extract attribute value named "<<fAttName;
141 ("G4TrajectoryDrawByAttribute::Draw",
142 "modeling0118", JustWarning, ed, "Invalid attribute name");
143 G4cout << "Available attributes:\n"
144 << object.GetAttDefs();
145 warnedUnableToExtract = true;
146 }
147 return;
148 }
149
150 G4VisTrajContext myContext(GetContext());
151 G4String key;
152
153 // If attribute value passes filter, get corresponding interval/single value
154 // key loaded into G4AttValue filter.
155 if (filter->GetValidElement(attVal, key)) {
156
157 // Extract context corresponding to valid key.
158 // Single value match should have overriden interval match.
159 ContextMap::const_iterator iter = fContextMap.begin();
160
161 G4bool gotContext(false);
162
163 while (!gotContext && (iter != fContextMap.end())) {
164 if (iter->first.first == key) {
165 myContext = *(iter->second);
166 gotContext = true;
167 }
168 iter++;
169 }
170
171 assert (gotContext);
172 }
173
174 myContext.SetVisible(visible);
175
176 if (GetVerbose()) {
177 G4cout<<"G4TrajectoryDrawByAttribute drawer named "<<Name();
178 G4cout<<", drawing style selected according to value of attribute "<<fAttName;
179 G4cout<<" : "<<attVal.GetValue()<<". Selected context:"<<G4endl;
180 myContext.Print(G4cout);
181 }
182
183 // Draw the trajectory
185}
186
187void
188G4TrajectoryDrawByAttribute::Print(std::ostream& ostr) const
189{
190 ostr<<"G4TrajectoryDrawByAttribute, dumping configuration for model named "<< Name() <<":"<<std::endl;;
191
192 ostr<<"Default configuration:"<<G4endl;
193 GetContext().Print(ostr);
194
195 ostr<<"\nAttribute name "<<fAttName<<std::endl;
196 ostr<<"\nKey<->Context map dump:"<<std::endl;
197
198 ContextMap::const_iterator iter = fContextMap.begin();
199
200 while (iter != fContextMap.end()) {
201 ostr<<"Context for key "<<iter->first.first<<":"<<std::endl;
202 iter->second->Print(ostr);
203
204 iter++;
205 }
206}
207
208void
210{
211 fAttName = name;
212}
213
214void
216{
217 // Takes ownership of context
218 std::pair<G4String, Config> myPair(name, G4TrajectoryDrawByAttribute::Interval);
219
220 ContextMap::iterator iter = fContextMap.find(myPair);
221
222 if (iter != fContextMap.end()) {
224 ed <<"Interval "<< name <<" already exists";
226 ("G4TrajectoryDrawByAttribute::AddIntervalContext",
227 "modeling0119", FatalErrorInArgument, ed, "Invalid interval");
228 }
229
230 fContextMap[myPair] = context;
231}
232
233void
235{
236 // Takes ownership of context
237 std::pair<G4String, Config> myPair(name, G4TrajectoryDrawByAttribute::SingleValue);
238
239 ContextMap::iterator iter = fContextMap.find(myPair);
240
241 if (iter != fContextMap.end()) {
243 ed <<"Single value "<< name <<" already exists";
245 ("G4TrajectoryDrawByAttribute::AddSingleValueContext",
246 "modeling0120", FatalErrorInArgument, ed, "Invalid value");
247 }
248
249 fContextMap[myPair] = context;
250}
@ JustWarning
@ FatalErrorInArgument
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
const G4String & GetValue() const
Definition: G4AttValue.hh:64
G4bool isNull() const
void AddValueContext(const G4String &name, G4VisTrajContext *context)
void AddIntervalContext(const G4String &name, G4VisTrajContext *context)
void Set(const G4String &attribute)
virtual void Print(std::ostream &ostr) const
virtual void Draw(const G4VTrajectory &trajectory, const G4int &i_mode=0, const G4bool &visible=true) const
G4TrajectoryDrawByAttribute(const G4String &name="Unspecified", G4VisTrajContext *context=0)
virtual void LoadIntervalElement(const G4String &)=0
virtual G4bool GetValidElement(const G4AttValue &, G4String &) const =0
virtual void LoadSingleValueElement(const G4String &)=0
G4String Name() const
const G4VisTrajContext & GetContext() const
G4bool GetVerbose() const
void SetVisible(const G4bool &visible)
void Print(std::ostream &ostr) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
G4VAttValueFilter * GetNewFilter(const G4AttDef &def)
G4bool ExtractAttDef(const T &object, const G4String &name, G4AttDef &def)
Definition: G4AttUtils.hh:62
G4bool ExtractAttValue(const T &object, const G4String &name, G4AttValue &attVal)
Definition: G4AttUtils.hh:76
void DrawLineAndPoints(const G4VTrajectory &traj, const G4VisTrajContext &, const G4int &i_mode)