ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4TrajectoryDrawByAttribute.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4TrajectoryDrawByAttribute.cc
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 
41  :G4VTrajectoryModel(name, context)
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 
60 void
62  const G4bool& /*visible*/) const
63 {
64  // Return if attribute name has not been set. Just print one warning
65  if (fAttName.isNull()) {
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 
176 void
177 G4TrajectoryDrawByAttribute::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 
197 void
199 {
200  fAttName = name;
201 }
202 
203 void
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 
222 void
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 }