Geant4-11
G4GPSModel.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// John Allison 26th April 2017.
30// Model for a representation of the General Paricle Source.
31
32#include "G4GPSModel.hh"
33
34#include "G4VGraphicsScene.hh"
36#include "G4VisAttributes.hh"
39#include "G4Transform3D.hh"
40#include "G4Point3D.hh"
41#include "G4Circle.hh"
42#include "G4Tubs.hh"
43#include "G4Box.hh"
44#include "G4EllipticalTube.hh"
45#include "G4Orb.hh"
46#include "G4Ellipsoid.hh"
47#include "G4Para.hh"
48
49#include <sstream>
50
52: fColour(colour)
53{
54 fType = "G4GPSModel";
55 std::ostringstream oss;
56 oss << "G4GPSModel for General Particle Source " << fColour;
57 fGlobalTag = oss.str();
59}
60
62
64{
65return "";
66}
67
69{
70 return "G4GPSModel " + GetCurrentTag ();
71}
72
74// The main task of a model is to describe itself to the graphics scene
75// handler (a object which inherits G4VSceneHandler, which inherits
76// G4VGraphicsScene).
77{
79 // Note: As far as I can see, if this is the first time Instance has been
80 // called, it will, nevertheless, instantiate a default source, Type:"Point",
81 // Shaep: "NULL", which will be drawn as a small circle at the origin of
82 // coordinates whether you have set up GPS or not. Sorry, can't think of a
83 // way to avoid that. Mostly, of course, you will only invoke this function,
84 // if you have - or are about to - set up GPS, in which case all will be well.
85 if (!pGPSData) return;
86
87 G4int nSources = pGPSData->GetSourceVectorSize();
88 for (G4int iSource = 0; iSource < nSources; ++iSource) {
89
90 const G4SingleParticleSource* pCurrentSingleSource = pGPSData->GetCurrentSource(iSource);
91 if (!pCurrentSingleSource) return;
92
93 const G4SPSPosDistribution* pSPSPosDistribution = pCurrentSingleSource->GetPosDist();
94 if (!pSPSPosDistribution) return;
95
96 G4String Type = pSPSPosDistribution->GetPosDisType();
97 G4String Shape = pSPSPosDistribution->GetPosDisShape();
98 // Type can be: Point, Plane, Surface or Volume
99 // Shape can be: Square, Circle, Ellipse, Rectangle,
100 // Sphere, Ellipsoid, Cylinder, Parallelepiped
101// G4cout
102// << "G4GPSModel::DescribeYourselfTo"
103// << ": PosDisType: " << Type
104// << ", Shape: " << Shape
105// << G4endl;
106
107 const G4double& halfx = pSPSPosDistribution->GetHalfX();
108 const G4double& halfy = pSPSPosDistribution->GetHalfY();
109 const G4double& halfz = pSPSPosDistribution->GetHalfZ();
110 const G4double& Radius = pSPSPosDistribution->GetRadius();
111 const G4double& Radius0 = pSPSPosDistribution->GetRadius0();
112 const G4double& ParAlpha = pSPSPosDistribution->GetParAlpha();
113 const G4double& ParTheta = pSPSPosDistribution->GetParTheta();
114 const G4double& ParPhi = pSPSPosDistribution->GetParPhi();
115
116 const G4ThreeVector& Rotx = pSPSPosDistribution->GetRotx();
117 const G4ThreeVector& Roty = pSPSPosDistribution->GetRoty();
118 const G4ThreeVector& Rotz = pSPSPosDistribution->GetRotz();
119
120 const G4ThreeVector& position = pSPSPosDistribution->GetCentreCoords();
123
125 G4double smallHalfThickness = 10.*surfaceTolerance;
126
127 G4VisAttributes gpsAtts;
128 gpsAtts.SetColour(fColour);
129 gpsAtts.SetForceSolid();
130
131 if (Type == "Point") {
132
133 G4Circle circle;
134 circle.SetPosition(position);
135 circle.SetScreenDiameter(10.);
136 circle.SetVisAttributes(gpsAtts);
137 sceneHandler.BeginPrimitives(transform);
138 sceneHandler.AddPrimitive(circle);
139 sceneHandler.EndPrimitives();
140
141 } else if (Type == "Plane") {
142
143 // Code based on G4SPSPosDistribution::GeneratePointsInPlane.
144 sceneHandler.PreAddSolid(transform,gpsAtts);
145 if (Shape == "Circle") {
146 sceneHandler.AddSolid
147 (G4Tubs("GPS_Circle",0.,Radius,smallHalfThickness,0.,twopi));
148 } else if (Shape == "Annulus") {
149 sceneHandler.AddSolid
150 (G4Tubs("GPS_Annulus",Radius0,Radius,smallHalfThickness,0.,twopi));
151 } else if (Shape == "Ellipse") {
152 sceneHandler.AddSolid
153 (G4EllipticalTube("GPS_Ellipse",halfx,halfy,smallHalfThickness));
154 } else if (Shape == "Square") {
155 sceneHandler.AddSolid
156 (G4Box("GPS_Ellipse",halfx,halfx,smallHalfThickness));
157 } else if (Shape == "Rectangle") {
158 sceneHandler.AddSolid
159 (G4Box("GPS_Rectangle",halfx,halfy,smallHalfThickness));
160 }
161 sceneHandler.PostAddSolid();
162
163 } else if (Type == "Surface" || Type == "Volume") {
164
165 // Code based on G4SPSPosDistribution::GeneratePointsOnSurface.
166 // and G4SPSPosDistribution::GeneratePointsInVolume.
167 sceneHandler.PreAddSolid(transform,gpsAtts);
168 if (Shape == "Sphere") {
169 sceneHandler.AddSolid
170 (G4Orb("GPS_Sphere",Radius));
171 } else if (Shape == "Ellipsoid") {
172 sceneHandler.AddSolid
173 (G4Ellipsoid("GPS_Ellipsoid",halfx,halfy,halfz));
174 } else if (Shape == "Cylinder") {
175 sceneHandler.AddSolid
176 (G4Tubs("GPS_Cylinder",0.,Radius, halfz, 0., twopi));
177 } else if (Shape == "Para") {
178 sceneHandler.AddSolid
179 (G4Para("GPS_Para",halfx,halfy,halfz,ParAlpha,ParTheta,ParPhi));
180 }
181 sceneHandler.PostAddSolid();
182
183 }
184 }
185}
static constexpr double twopi
Definition: G4SIunits.hh:56
HepGeom::Translate3D G4Translate3D
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
Definition: G4Box.hh:56
G4String GetCurrentDescription() const
Definition: G4GPSModel.cc:68
G4GPSModel(const G4Colour &colour=G4Colour(1., 0., 0., 0.3))
Definition: G4GPSModel.cc:51
void DescribeYourselfTo(G4VGraphicsScene &)
Definition: G4GPSModel.cc:73
virtual ~G4GPSModel()
Definition: G4GPSModel.cc:61
G4Colour fColour
Definition: G4GPSModel.hh:67
G4String GetCurrentTag() const
Definition: G4GPSModel.cc:63
G4SingleParticleSource * GetCurrentSource(G4int idx)
static G4GeneralParticleSourceData * Instance()
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
Definition: G4Orb.hh:56
Definition: G4Para.hh:79
const G4ThreeVector & GetCentreCoords() const
G4double GetParAlpha() const
const G4String & GetPosDisType() const
const G4ThreeVector & GetRotx() const
const G4ThreeVector & GetRotz() const
const G4String & GetPosDisShape() const
G4double GetParTheta() const
const G4ThreeVector & GetRoty() const
G4SPSPosDistribution * GetPosDist() const
Definition: G4Tubs.hh:75
virtual void BeginPrimitives(const G4Transform3D &objectTransformation=G4Transform3D())=0
virtual void PostAddSolid()=0
virtual void AddPrimitive(const G4Polyline &)=0
virtual void AddSolid(const G4Box &)=0
virtual void EndPrimitives()=0
virtual void PreAddSolid(const G4Transform3D &objectTransformation, const G4VisAttributes &visAttribs)=0
void SetPosition(const G4Point3D &)
void SetScreenDiameter(G4double)
G4String fGlobalDescription
Definition: G4VModel.hh:100
G4String fType
Definition: G4VModel.hh:98
G4String fGlobalTag
Definition: G4VModel.hh:99
void SetColour(const G4Colour &)
void SetForceSolid(G4bool=true)
void SetVisAttributes(const G4VisAttributes *)
Definition: G4Visible.cc:96
DLL_API const Hep3Vector HepZHat
Definition: ThreeVector.h:419
DLL_API const Hep3Vector HepXHat
DLL_API const Hep3Vector HepYHat
Definition: ThreeVector.h:419
G4bool transform(G4String &input, const G4String &type)