Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VScoringMesh.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//
28// ---------------------------------------------------------------------
29// Modifications
30// 17-Apr-2012 T.Aso SetSize() and SetNumberOfSegments() is not allowed
31// to call twice in same geometrical mesh. Add warning
32// message to notify.
33//
34// ---------------------------------------------------------------------
35
36#include "G4VScoringMesh.hh"
37#include "G4THitsMap.hh"
38#include "G4SystemOfUnits.hh"
39#include "G4VPhysicalVolume.hh"
41#include "G4VPrimitiveScorer.hh"
42#include "G4VSDFilter.hh"
43#include "G4SDManager.hh"
44
46 : fWorldName(wName)
47 , fCurrentPS(nullptr)
48 , fConstructed(false)
49 , fActive(true)
50 , fShape(MeshShape::undefined)
51 , fRotationMatrix(nullptr)
52 , fMFD(new G4MultiFunctionalDetector(wName))
53 , verboseLevel(0)
54 , sizeIsSet(false)
55 , nMeshIsSet(false)
56 , fDrawUnit("")
57 , fDrawUnitValue(1.)
58 , fMeshElementLogical(nullptr)
59 , fParallelWorldProcess(nullptr)
60 , fGeometryHasBeenDestroyed(false)
61 , copyNumberLevel(0)
62 , layeredMassFlg(false)
63{
65
66 fSize[0] = fSize[1] = fSize[2] = 0.;
67 fAngle[0] = 0.0;
68 fAngle[1] = CLHEP::twopi * rad;
69 fNSegment[0] = fNSegment[1] = fNSegment[2] = 1;
71}
72
74{
75 if(verboseLevel > 9)
76 G4cout << "G4VScoringMesh::ResetScore() is called." << G4endl;
77 for(const auto& mp : fMap)
78 {
79 if(verboseLevel > 9)
80 G4cout << "G4VScoringMesh::ResetScore()" << mp.first << G4endl;
81 mp.second->clear();
82 }
83}
84
86{
87 if(!sizeIsSet)
88 {
89 sizeIsSet = true;
90 for(G4int i = 0; i < 3; ++i)
91 {
92 fSize[i] = size[i];
93 }
94 }
95 else
96 {
97 G4String message = " Mesh size has already been set and it cannot be changed.\n";
98 message += " This method is ignored.";
99 G4Exception("G4VScoringMesh::SetSize()",
100 "DigiHitsUtilsScoreVScoringMesh000", JustWarning, message);
101 }
102}
103
105{
106 if(sizeIsSet)
107 return G4ThreeVector(fSize[0], fSize[1], fSize[2]);
108 return G4ThreeVector(0., 0., 0.);
109}
110
111void G4VScoringMesh::SetAngles(G4double startAngle, G4double spanAngle)
112{
113 fAngle[0] = startAngle;
114 fAngle[1] = spanAngle;
115}
116
118{
120 G4ThreeVector(centerPosition[0], centerPosition[1], centerPosition[2]);
121}
122
124{
127 {
128 for(G4int i = 0; i < 3; ++i)
129 fNSegment[i] = nSegment[i];
130 nMeshIsSet = true;
131 }
132 else
133 {
134 G4String message = " Number of bins has already been set and it cannot be changed.\n";
135 message += " This method is ignored.";
136 G4Exception("G4VScoringMesh::SetNumberOfSegments()",
137 "DigiHitsUtilsScoreVScoringMesh000", JustWarning, message);
138 }
139}
140
142{
143 for(G4int i = 0; i < 3; ++i)
144 nSegment[i] = fNSegment[i];
145}
146
148{
149 if(fRotationMatrix == nullptr)
151 fRotationMatrix->rotateX(delta);
152}
153
155{
156 if(fRotationMatrix == nullptr)
158 fRotationMatrix->rotateY(delta);
159}
160
162{
163 if(fRotationMatrix == nullptr)
165 fRotationMatrix->rotateZ(delta);
166}
167
169{
170 if(!ReadyForQuantity())
171 {
172 G4cerr << "ERROR : G4VScoringMesh::SetPrimitiveScorer() : "
173 << prs->GetName()
174 << " does not yet have mesh size or number of bins. Set them first."
175 << G4endl << "This Method is ignored." << G4endl;
176 return;
177 }
178 if(verboseLevel > 0)
179 G4cout << "G4VScoringMesh::SetPrimitiveScorer() : " << prs->GetName()
180 << " is registered."
181 << " 3D size: (" << fNSegment[0] << ", " << fNSegment[1] << ", "
182 << fNSegment[2] << ")" << G4endl;
183
184 prs->SetNijk(fNSegment[0], fNSegment[1], fNSegment[2]);
185 fCurrentPS = prs;
187 auto map =
189 fMap[prs->GetName()] = map;
190}
191
193{
194 if(fCurrentPS == nullptr)
195 {
196 G4cerr << "ERROR : G4VScoringMesh::SetSDFilter() : a quantity must be "
197 "defined first. This method is ignored."
198 << G4endl;
199 return;
200 }
201 if(verboseLevel > 0)
202 G4cout << "G4VScoringMesh::SetFilter() : " << filter->GetName()
203 << " is set to " << fCurrentPS->GetName() << G4endl;
204
205 G4VSDFilter* oldFilter = fCurrentPS->GetFilter();
206 if(oldFilter != nullptr)
207 {
208 G4cout << "WARNING : G4VScoringMesh::SetFilter() : " << oldFilter->GetName()
209 << " is overwritten by " << filter->GetName() << G4endl;
210 }
211 fCurrentPS->SetFilter(filter);
212}
213
215{
217 if(fCurrentPS == nullptr)
218 {
219 G4cerr << "ERROR : G4VScoringMesh::SetCurrentPrimitiveScorer() : The "
220 "primitive scorer <"
221 << name << "> does not found." << G4endl;
222 }
223}
224
226{
227 const auto itr = fMap.find(psname);
228 return itr != fMap.cend();
229}
230
232{
233 const auto itr = fMap.find(psname);
234 if(itr == fMap.cend())
235 {
236 return G4String("");
237 }
238
239 return GetPrimitiveScorer(psname)->GetUnit();
240}
241
243{
244 G4String unit = "";
245 if(fCurrentPS == nullptr)
246 {
247 G4String msg = "ERROR : G4VScoringMesh::GetCurrentPSUnit() : ";
248 msg += " Current primitive scorer is null.";
249 G4cerr << msg << G4endl;
250 }
251 else
252 {
253 unit = fCurrentPS->GetUnit();
254 }
255 return unit;
256}
257
259{
260 if(fCurrentPS == nullptr)
261 {
262 G4String msg = "ERROR : G4VScoringMesh::GetCurrentPSUnit() : ";
263 msg += " Current primitive scorer is null.";
264 G4cerr << msg << G4endl;
265 }
266 else
267 {
268 fCurrentPS->SetUnit(unit);
269 }
270}
271
273{
274 const auto itr = fMap.find(psname);
275 if(itr == fMap.cend())
276 {
277 return 1.;
278 }
279
280 return GetPrimitiveScorer(psname)->GetUnitValue();
281}
282
284{
285 for(G4int i = 0; i < 3; ++i)
286 divisionAxisNames[i] = fDivisionAxisNames[i];
287}
288
290{
291 if(fMFD == nullptr)
292 return nullptr;
293
295 for(G4int i = 0; i < nps; ++i)
296 {
298 if(name == prs->GetName())
299 return prs;
300 }
301
302 return nullptr;
303}
304
306{
307 G4cout << " # of segments: (" << fNSegment[0] << ", " << fNSegment[1] << ", "
308 << fNSegment[2] << ")" << G4endl;
309 G4cout << " displacement: (" << fCenterPosition.x() / cm << ", "
310 << fCenterPosition.y() / cm << ", " << fCenterPosition.z() / cm
311 << ") [cm]" << G4endl;
312 if(fRotationMatrix != nullptr)
313 {
314 G4cout << " rotation matrix: " << fRotationMatrix->xx() << " "
315 << fRotationMatrix->xy() << " " << fRotationMatrix->xz() << G4endl
316 << " " << fRotationMatrix->yx() << " "
317 << fRotationMatrix->yy() << " " << fRotationMatrix->yz() << G4endl
318 << " " << fRotationMatrix->zx() << " "
319 << fRotationMatrix->zy() << " " << fRotationMatrix->zz() << G4endl;
320 }
321
322 G4cout << " registered primitve scorers : " << G4endl;
325 for(G4int i = 0; i < nps; ++i)
326 {
327 prs = fMFD->GetPrimitive(i);
328 G4cout << " " << i << " " << prs->GetName();
329 if(prs->GetFilter() != nullptr)
330 G4cout << " with " << prs->GetFilter()->GetName();
331 G4cout << G4endl;
332 }
333}
334
336{
337 G4cout << "scoring mesh name: " << fWorldName << G4endl;
338 G4cout << "# of G4THitsMap : " << fMap.size() << G4endl;
339 for(const auto& mp : fMap)
340 {
341 G4cout << "[" << mp.first << "]" << G4endl;
342 mp.second->PrintAllHits();
343 }
344 G4cout << G4endl;
345}
346
348 G4VScoreColorMap* colorMap, G4int axflg)
349{
350 fDrawPSName = psName;
351 const auto fMapItr = fMap.find(psName);
352 if(fMapItr != fMap.cend())
353 {
354 fDrawUnit = GetPSUnit(psName);
356 Draw(fMapItr->second, colorMap, axflg);
357 }
358 else
359 {
360 G4cerr << "Scorer <" << psName << "> is not defined. Method ignored."
361 << G4endl;
362 }
363}
364
365void G4VScoringMesh::DrawMesh(const G4String& psName, G4int idxPlane,
366 G4int iColumn, G4VScoreColorMap* colorMap)
367{
368 fDrawPSName = psName;
369 const auto fMapItr = fMap.find(psName);
370 if(fMapItr != fMap.cend())
371 {
372 fDrawUnit = GetPSUnit(psName);
374 DrawColumn(fMapItr->second, colorMap, idxPlane, iColumn);
375 }
376 else
377 {
378 G4cerr << "Scorer <" << psName << "> is not defined. Method ignored."
379 << G4endl;
380 }
381}
382
384{
385 G4String psName = map->GetName();
386 const auto fMapItr = fMap.find(psName);
387 *(fMapItr->second) += *map;
388
389 if(verboseLevel > 9)
390 {
391 G4cout << G4endl;
392 G4cout << "G4VScoringMesh::Accumulate()" << G4endl;
393 G4cout << " PS name : " << psName << G4endl;
394 if(fMapItr == fMap.cend())
395 {
396 G4cout << " " << psName << " was not found." << G4endl;
397 }
398 else
399 {
400 G4cout << " map size : " << map->GetSize() << G4endl;
401 map->PrintAllHits();
402 }
403 G4cout << G4endl;
404 }
405}
406
408{
409 G4String psName = map->GetName();
410 const auto fMapItr = fMap.find(psName);
411 *(fMapItr->second) += *map;
412
413 if(verboseLevel > 9)
414 {
415 G4cout << G4endl;
416 G4cout << "G4VScoringMesh::Accumulate()" << G4endl;
417 G4cout << " PS name : " << psName << G4endl;
418 if(fMapItr == fMap.cend())
419 {
420 G4cout << " " << psName << " was not found." << G4endl;
421 }
422 else
423 {
424 G4cout << " map size : " << map->GetSize() << G4endl;
425 map->PrintAllHits();
426 }
427 G4cout << G4endl;
428 }
429}
430
432{
433 if(fConstructed)
434 {
436 {
437 SetupGeometry(fWorldPhys);
439 }
440 if(verboseLevel > 0)
441 G4cout << fWorldName << " --- All quantities are reset." << G4endl;
442 ResetScore();
443 }
444 else
445 {
446 fConstructed = true;
447 SetupGeometry(fWorldPhys);
448 }
449}
450
452{
453 if(fConstructed)
454 {
456 {
459 }
460
461 if(verboseLevel > 0)
462 G4cout << fWorldPhys->GetName() << " --- All quantities are reset."
463 << G4endl;
464 ResetScore();
465 }
466 else
467 {
468 fConstructed = true;
470 }
471}
472
474{
475 const MeshScoreMap scMap = scMesh->GetScoreMap();
476
477 auto fMapItr = fMap.cbegin();
478 auto mapItr = scMap.cbegin();
479 for(; fMapItr != fMap.cend(); ++fMapItr)
480 {
481 if(verboseLevel > 9)
482 G4cout << "G4VScoringMesh::Merge()" << fMapItr->first << G4endl;
483 *(fMapItr->second) += *(mapItr->second);
484 ++mapItr;
485 }
486}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
CLHEP::HepRotation G4RotationMatrix
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
double z() const
double x() const
double y() const
double zz() const
double yz() const
double zx() const
double yx() const
double zy() const
double xx() const
HepRotation & rotateX(double delta)
Definition Rotation.cc:61
HepRotation & rotateZ(double delta)
Definition Rotation.cc:87
double yy() const
double xz() const
HepRotation & rotateY(double delta)
Definition Rotation.cc:74
double xy() const
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)
G4bool RegisterPrimitive(G4VPrimitiveScorer *)
G4VPrimitiveScorer * GetPrimitive(G4int id) const
static G4SDManager * GetSDMpointer()
void AddNewDetector(G4VSensitiveDetector *aSD)
const G4String & GetName() const
void SetUnit(const G4String &unit)
G4VSDFilter * GetFilter() const
void SetNijk(G4int i, G4int j, G4int k)
void SetFilter(G4VSDFilter *f)
G4String GetName() const
const G4String & GetUnit() const
G4double GetUnitValue() const
G4String GetName() const
void SetFilter(G4VSDFilter *filter)
G4bool ReadyForQuantity() const
G4RotationMatrix * fRotationMatrix
G4ThreeVector GetSize() const
virtual void SetupGeometry(G4VPhysicalVolume *fWorldPhys)=0
virtual void List() const
G4double fDrawUnitValue
virtual void WorkerConstruct(G4VPhysicalVolume *fWorldPhys)
G4bool fGeometryHasBeenDestroyed
MeshScoreMap fMap
void RotateY(G4double delta)
void GetNumberOfSegments(G4int nSegment[3])
G4double GetPSUnitValue(const G4String &psname)
G4String GetPSUnit(const G4String &psname)
void SetAngles(G4double, G4double)
void SetCurrentPSUnit(const G4String &unit)
G4MultiFunctionalDetector * fMFD
void SetCurrentPrimitiveScorer(const G4String &name)
G4String fDivisionAxisNames[3]
G4LogicalVolume * fMeshElementLogical
void SetPrimitiveScorer(G4VPrimitiveScorer *ps)
std::map< G4String, RunScore * > MeshScoreMap
G4VPrimitiveScorer * fCurrentPS
G4double fAngle[2]
G4String GetCurrentPSUnit()
void GetDivisionAxisNames(G4String divisionAxisNames[3])
void DrawMesh(const G4String &psName, G4VScoreColorMap *colorMap, G4int axflg=111)
void Accumulate(G4THitsMap< G4double > *map)
void SetNumberOfSegments(G4int nSegment[3])
G4double fSize[3]
G4VScoringMesh(const G4String &wName)
MeshScoreMap GetScoreMap() const
void Merge(const G4VScoringMesh *scMesh)
virtual void Draw(RunScore *map, G4VScoreColorMap *colorMap, G4int axflg=111)=0
void SetCenterPosition(G4double centerPosition[3])
void RotateX(G4double delta)
virtual void Construct(G4VPhysicalVolume *fWorldPhys)
void SetSize(G4double size[3])
virtual void DrawColumn(RunScore *map, G4VScoreColorMap *colorMap, G4int idxProj, G4int idxColumn)=0
G4bool FindPrimitiveScorer(const G4String &psname)
void RotateZ(G4double delta)
G4VPrimitiveScorer * GetPrimitiveScorer(const G4String &name)
G4ThreeVector fCenterPosition