Geant4-11
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//
27// Jane Tinslay August 2006
28//
30#include "G4AttDef.hh"
31#include "G4AttFilterUtils.hh"
32#include "G4AttUtils.hh"
33#include "G4AttValue.hh"
35#include "G4VAttValueFilter.hh"
36#include "G4VisTrajContext.hh"
37#include "G4VTrajectory.hh"
38#include <assert.h>
39
42 ,fAttName("")
43 ,fFirst(true)
44 ,fWarnedMissingAttribute(false)
45 ,filter(0)
46{}
47
49{
50 ContextMap::iterator iter = fContextMap.begin();
51
52 while (iter != fContextMap.end()) {
53 delete iter->second;
54 iter++;
55 }
56
57 delete filter;
58}
59
60void
62 const G4bool& /*visible*/) const
63{
64 // Return if attribute name has not been set. Just print one warning
65 if (fAttName.empty()) {
66
69 ed<<"Null attribute name";
70 G4Exception("G4TrajectoryDrawByAttribute::Draw",
71 "modeling0116",
72 JustWarning, ed);
74 }
75
76 return;
77 }
78
79 // Basically cache data loaded filter for efficiency
80 if (fFirst) {
81
82 fFirst = false;
83
84 // Get attribute definition
85 G4AttDef attDef;
86
87 // Expect definition to exist
88 if (!G4AttUtils::ExtractAttDef(object, fAttName, attDef)) {
89 static G4bool warnedUnableToExtract = false;
90 if (!warnedUnableToExtract) {
92 ed <<"Unable to extract attribute definition named "<<fAttName;
94 ("G4TrajectoryDrawByAttribute::Draw",
95 "modeling0117", JustWarning, ed, ". Invalid attribute name");
96 G4cout << "Available attributes:\n"
97 << *object.GetAttDefs();
98 warnedUnableToExtract = true;
99 }
100 return;
101 }
102
103 // Get new G4AttValue filter
105 assert (0 != filter);
106
107 // Load both interval and single valued data. Single valued data should
108 // override interval data.
109 ContextMap::const_iterator iter = fContextMap.begin();
110
111 while (iter != fContextMap.end()) {
112 if (iter->first.second == G4TrajectoryDrawByAttribute::Interval) {
113 filter->LoadIntervalElement(iter->first.first);
114 }
115 else if (iter->first.second == G4TrajectoryDrawByAttribute::SingleValue) {
116 filter->LoadSingleValueElement(iter->first.first);
117 }
118 iter++;
119 }
120 }
121
122 // Get attribute value
123 G4AttValue attVal;
124
125 // Expect value to exist
126 if (!G4AttUtils::ExtractAttValue(object, fAttName, attVal)) {
127 static G4bool warnedUnableToExtract = false;
128 if (!warnedUnableToExtract) {
130 ed <<"Unable to extract attribute value named "<<fAttName;
132 ("G4TrajectoryDrawByAttribute::Draw",
133 "modeling0118", JustWarning, ed, ". Invalid attribute name");
134 G4cout << "Available attributes:\n"
135 << *object.GetAttDefs();
136 warnedUnableToExtract = true;
137 }
138 return;
139 }
140
141 G4VisTrajContext myContext(GetContext());
142 G4String key;
143
144 // If attribute value passes filter, get corresponding interval/single value
145 // key loaded into G4AttValue filter.
146 if (filter->GetValidElement(attVal, key)) {
147
148 // Extract context corresponding to valid key.
149 // Single value match should have overriden interval match.
150 ContextMap::const_iterator iter = fContextMap.begin();
151
152 G4bool gotContext(false);
153
154 while (!gotContext && (iter != fContextMap.end())) {
155 if (iter->first.first == key) {
156 myContext = *(iter->second);
157 gotContext = true;
158 }
159 iter++;
160 }
161
162 assert (gotContext);
163 }
164
165 if (GetVerbose()) {
166 G4cout<<"G4TrajectoryDrawByAttribute drawer named "<<Name();
167 G4cout<<", drawing style selected according to value of attribute "<<fAttName;
168 G4cout<<" : "<<attVal.GetValue()<<". Selected context:"<<G4endl;
169 myContext.Print(G4cout);
170 }
171
172 // Draw the trajectory
174}
175
176void
177G4TrajectoryDrawByAttribute::Print(std::ostream& ostr) const
178{
179 ostr<<"G4TrajectoryDrawByAttribute, dumping configuration for model named "<< Name() <<":"<<std::endl;;
180
181 ostr<<"Default configuration:"<<G4endl;
182 GetContext().Print(ostr);
183
184 ostr<<"\nAttribute name "<<fAttName<<std::endl;
185 ostr<<"\nKey<->Context map dump:"<<std::endl;
186
187 ContextMap::const_iterator iter = fContextMap.begin();
188
189 while (iter != fContextMap.end()) {
190 ostr<<"Context for key "<<iter->first.first<<":"<<std::endl;
191 iter->second->Print(ostr);
192
193 iter++;
194 }
195}
196
197void
199{
200 fAttName = name;
201}
202
203void
205{
206 // Takes ownership of context
207 std::pair<G4String, Config> myPair(name, G4TrajectoryDrawByAttribute::Interval);
208
209 ContextMap::iterator iter = fContextMap.find(myPair);
210
211 if (iter != fContextMap.end()) {
213 ed <<"Interval "<< name <<" already exists";
215 ("G4TrajectoryDrawByAttribute::AddIntervalContext",
216 "modeling0119", FatalErrorInArgument, ed, ". Invalid interval");
217 }
218
219 fContextMap[myPair] = context;
220}
221
222void
224{
225 // Takes ownership of context
226 std::pair<G4String, Config> myPair(name, G4TrajectoryDrawByAttribute::SingleValue);
227
228 ContextMap::iterator iter = fContextMap.find(myPair);
229
230 if (iter != fContextMap.end()) {
232 ed <<"Single value "<< name <<" already exists";
234 ("G4TrajectoryDrawByAttribute::AddSingleValueContext",
235 "modeling0120", FatalErrorInArgument, ed, ". Invalid value");
236 }
237
238 fContextMap[myPair] = context;
239}
@ JustWarning
@ FatalErrorInArgument
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
bool G4bool
Definition: G4Types.hh:86
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
const G4String & GetValue() const
Definition: G4AttValue.hh:63
void AddValueContext(const G4String &name, G4VisTrajContext *context)
void AddIntervalContext(const G4String &name, G4VisTrajContext *context)
virtual void Draw(const G4VTrajectory &trajectory, const G4bool &visible=true) const
void Set(const G4String &attribute)
virtual void Print(std::ostream &ostr) 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 Print(std::ostream &ostr) const
G4VAttValueFilter * GetNewFilter(const G4AttDef &def)
G4bool ExtractAttDef(const T &object, const G4String &name, G4AttDef &def)
Definition: G4AttUtils.hh:61
G4bool ExtractAttValue(const T &object, const G4String &name, G4AttValue &attVal)
Definition: G4AttUtils.hh:75
const char * name(G4int ptype)
void DrawLineAndPoints(const G4VTrajectory &traj, const G4VisTrajContext &)
context
Definition: g4zmq.py:11