Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4tgrVolumeDivision.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// G4tgrVolumeDivision implementation
27//
28// Author: P.Arce, CIEMAT (November 2007)
29// --------------------------------------------------------------------
30
32
33#include "G4SystemOfUnits.hh"
34#include "G4tgrUtils.hh"
35#include "G4tgrVolumeMgr.hh"
36#include "G4tgrPlace.hh"
37#include "G4tgrFileReader.hh"
38#include "G4tgrPlaceDivRep.hh"
39#include "G4tgrMessenger.hh"
40
41// --------------------------------------------------------------------
43{
44}
45
46// --------------------------------------------------------------------
47G4tgrVolumeDivision::G4tgrVolumeDivision(const std::vector<G4String>& wl)
48{
49 // wl: NAME PARENT MATERIAL AXIS STEP/NDIV OFFSET
50
52 "G4tgrVolumeDivision::G4tgrVolumeDivision");
54 "G4tgrVolumeDivision::G4tgrVolumeDivision");
55
56 theType = "VOLDivision";
57
58 // :DIV NAME PARENT MATERIAL AXIS STEP/NDIV OFFSET
59
60 //---------- set name
62
63 //---------- set the pointer to the parent DU
64 G4String parentName = G4tgrUtils::GetString(wl[2]);
65 G4tgrVolumeMgr::GetInstance()->FindVolume(parentName, 1); // check existance
66
67 //---------- initialize G4tgrPlace
68 thePlaceDiv = new G4tgrPlaceDivRep();
69 thePlaceDiv->SetParentName(parentName);
70 thePlaceDiv->SetType("PlaceDivision");
71 thePlaceDiv->SetVolume(this);
72
73 //---------- set material name
75
76 //----- set axis of replica
77 thePlaceDiv->SetAxis(thePlaceDiv->BuildAxis(G4tgrUtils::GetString(wl[4])));
78
79 //------ register parent - child
80 G4tgrVolumeMgr::GetInstance()->RegisterParentChild(parentName, thePlaceDiv);
81#ifdef G4VERBOSE
83 {
84 G4cout << " G4tgrVolumeDivision::G4tgrVolumeDivision() -"
85 << " Replica register parent - child " << G4endl;
86 }
87#endif
88
89 //---------- set if division is given by number of divisions of by width
90 G4String wl0 = wl[0];
91 for(G4int ii = 0; ii < (G4int)wl0.length(); ++ii)
92 {
93 wl0[ii] = (char)std::toupper(wl0[ii]);
94 }
95
96 if(wl0 == ":DIV_NDIV")
97 {
98 thePlaceDiv->SetDivType(DivByNdiv);
99 thePlaceDiv->SetNDiv(G4tgrUtils::GetInt(wl[5]));
100 if(wl.size() == 7)
101 {
102 thePlaceDiv->SetOffset(G4tgrUtils::GetDouble(wl[6]) * mm);
103 }
104 }
105 else if(wl0 == ":DIV_WIDTH")
106 {
107 thePlaceDiv->SetDivType(DivByWidth);
108 thePlaceDiv->SetWidth(G4tgrUtils::GetDouble(wl[5]) * mm);
109 if(wl.size() == 7)
110 {
111 thePlaceDiv->SetOffset(G4tgrUtils::GetDouble(wl[6]) * mm);
112 }
113 }
114 else if(wl0 == ":DIV_NDIV_WIDTH")
115 {
116 thePlaceDiv->SetDivType(DivByNdivAndWidth);
117 thePlaceDiv->SetNDiv(G4tgrUtils::GetInt(wl[5]));
118 thePlaceDiv->SetWidth(G4tgrUtils::GetDouble(wl[6]) * mm);
119 if(wl.size() == 8)
120 {
121 thePlaceDiv->SetOffset(G4tgrUtils::GetDouble(wl[7]) * mm);
122 }
123 }
124 else
125 {
126 G4String ErrMessage = "Division type not supported, sorry... " + wl[0];
127 G4Exception("G4tgrVolumeDivision::G4tgrVolumeDivision()", "NotImplemented",
128 FatalException, ErrMessage);
129 }
130
131 theVisibility = 1;
132 theRGBColour = new G4double[3];
133 for(std::size_t ii = 0; ii < 3; ++ii)
134 {
135 theRGBColour[ii] = -1.;
136 }
137
138#ifdef G4VERBOSE
140 {
141 G4cout << " Created " << *this << G4endl;
142 }
143#endif
144
145 theSolid = nullptr;
146}
147
148// --------------------------------------------------------------------
149std::ostream& operator<<(std::ostream& os, const G4tgrVolumeDivision& obj)
150{
151 os << "G4tgrVolumeDivision= " << obj.theName
152 << " Placement= " << *(obj.thePlaceDiv) << G4endl;
153
154 return os;
155}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
@ DivByNdiv
@ DivByWidth
@ DivByNdivAndWidth
@ WLSIZE_GE
Definition: G4tgrUtils.hh:51
@ WLSIZE_LE
Definition: G4tgrUtils.hh:49
std::ostream & operator<<(std::ostream &os, const G4tgrVolumeDivision &obj)
static G4int GetVerboseLevel()
void SetDivType(G4DivType typ)
void SetParentName(const G4String &parentName)
void SetAxis(EAxis axis)
void SetNDiv(G4int ndiv)
void SetWidth(G4double width)
void SetOffset(G4double offset)
EAxis BuildAxis(const G4String &axisName)
void SetType(const G4String &typ)
Definition: G4tgrPlace.hh:57
void SetVolume(G4tgrVolume *vol)
Definition: G4tgrPlace.hh:56
static G4String GetString(const G4String &str)
Definition: G4tgrUtils.cc:173
static void CheckWLsize(const std::vector< G4String > &wl, unsigned int nWCheck, WLSIZEtype st, const G4String &methodName)
Definition: G4tgrUtils.cc:490
static G4int GetInt(const G4String &str)
Definition: G4tgrUtils.cc:447
static G4double GetDouble(const G4String &str, G4double unitval=1.)
Definition: G4tgrUtils.cc:198
G4tgrVolumeDivision(const std::vector< G4String > &wl)
G4tgrVolume * FindVolume(const G4String &volname, G4bool exists=false)
void RegisterParentChild(const G4String &parentName, const G4tgrPlace *pl)
static G4tgrVolumeMgr * GetInstance()
G4String theMaterialName
Definition: G4tgrVolume.hh:106
G4String theType
Definition: G4tgrVolume.hh:104
G4String theName
Definition: G4tgrVolume.hh:102
G4tgrSolid * theSolid
Definition: G4tgrVolume.hh:108
G4bool theVisibility
Definition: G4tgrVolume.hh:113
G4double * theRGBColour
Definition: G4tgrVolume.hh:114