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
G3NegVolPars.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// modified by I. Hrivnacova, 13.10.99
29
30#include "globals.hh"
31#include "G3VolTable.hh"
32#include "G4VSolid.hh"
33#include "G3toG4.hh"
34#include <cmath>
35
37 G4String shape, G4String shapem)
38 // Returns true only in case the parameters *after* processing
39 // this method remain negative.
40{
41 G4bool NegPresent = FALSE;
42 // for normal single volume positioning, just substitute for the
43 // negative parameters
44 // treat only the legal cases
45 if (shapem == shape) {
46 if (shape == "BOX" || shape == "TRD1" || shape == "TRD2" ||
47 shape == "ELTU") {
48 for (G4int i=0;i<npar;i++) {
49 if (rpar[i] < 0) {
50 if (rparm != 0) rpar[i] = rparm[i];
51 if (rpar[i] < 0) NegPresent = TRUE;
52 }
53 }
54 }
55 if (shape == "TRAP") {
56 for (G4int i=0;i<11;i++) {
57 if (i != 1 && i != 2 && i != 6 && i != 10) {
58 if (rpar[i]<0) {
59 if (rparm != 0) rpar[i] = rparm[i];
60 if (rpar[i] < 0) NegPresent = TRUE;
61 }
62 }
63 }
64 }
65 if (shape == "TUBE" || shape == "TUBS" || shape == "PARA") {
66 for (G4int i=0;i<3;i++) {
67 if (rpar[i] < 0) {
68 if (rparm != 0) rpar[i] = rparm[i];
69 if (rpar[i] < 0) NegPresent = TRUE;
70 }
71 }
72 }
73 if (shape == "CONE" || shape == "CONS") {
74 for (G4int i=0;i<5;i++) {
75 if (rpar[i] < 0) {
76 if (rparm != 0) rpar[i] = rparm[i];
77 if (rpar[i] < 0) NegPresent = TRUE;
78 }
79 }
80 }
81 if (shape == "SPHE") {
82 for (G4int i=0;i<2;i++) {
83 if (rpar[i] < 0) {
84 if (rparm != 0) rpar[i] = rparm[i];
85 if (rpar[i] < 0) NegPresent = TRUE;
86 }
87 }
88 }
89 if (shape == "PGON") {
90 G4int nz = G4int(rpar[3]);
91 G4int ipl;
92 for (G4int i=0;i<nz;i++) {
93 ipl = 5 + i*3;
94 if (rpar[ipl] < 0) {
95 if (rparm != 0) rpar[ipl] = rparm[ipl];
96 if (rpar[ipl] < 0) NegPresent = TRUE;
97 }
98 if (rpar[ipl+1] < 0) {
99 if (rparm != 0) rpar[ipl] = rparm[ipl];
100 if (rpar[ipl] < 0) NegPresent = TRUE;
101 }
102 }
103 }
104 if (shape == "PCON") {
105 G4int nz = G4int(rpar[2]);
106 G4int ipl;
107 for (G4int i=0;i<nz;i++) {
108 ipl = 4 + i*3;
109 if (rpar[ipl] < 0) {
110 if (rparm != 0) rpar[ipl] = rparm[ipl];
111 if (rpar[ipl] < 0) NegPresent = TRUE;
112 }
113 if (rpar[ipl+1] < 0) {
114 // TO DO
115 // check - folowing argument might be ipl+1
116 if (rparm != 0) rpar[ipl] = rparm[ipl];
117 if (rpar[ipl] < 0) NegPresent = TRUE;
118 }
119 }
120 }
121 }
122
123 if (shape == "BOX") {
124 if (shapem == "TRD1") {
125 if (rpar[1] < 0) {
126 if (rparm != 0) rpar[1] = rparm[2];
127 if (rpar[1] < 0) NegPresent = TRUE;
128 }
129 if (rpar[2] < 0) {
130 if (rparm != 0) rpar[2] = rparm[3];
131 if (rpar[2] < 0) NegPresent = TRUE;
132 }
133 if (rpar[0] < 0) {
134 if (rparm != 0) rpar[0] = std::min(rparm[0],rparm[1]) +
135 std::abs(rparm[0]-rparm[1])*.5*rpar[2]/rparm[3];
136 if (rpar[0] < 0) NegPresent = TRUE;
137 }
138 }
139 if (shapem == "TRD2") {
140 if (rpar[2] < 0) {
141 if (rparm != 0) rpar[2] = rparm[4];
142 if (rpar[2]<0) NegPresent = TRUE;
143 }
144 if (rpar[0] < 0) {
145 if (rparm != 0) rpar[0] = std::min(rparm[0],rparm[1]) +
146 std::abs(rparm[0]-rparm[1])*.5*rpar[2]/rparm[4];
147 if (rpar[0]<0) NegPresent = TRUE;
148 }
149 if (rpar[1] < 0) {
150 if (rparm != 0) rpar[1] = std::min(rparm[2],rparm[3]) +
151 std::abs(rparm[2]-rparm[3])*.5*rpar[2]/rparm[4];
152 if (rpar[1]<0) NegPresent = TRUE;
153 }
154 }
155 if (shapem == "TRAP") {
156 if (rpar[2] < 0) {
157 if (rparm != 0) rpar[2] = rparm[0];
158 if (rpar[2] < 0) NegPresent = TRUE;
159 }
160 if (rpar[0] < 0) {
161 if (rparm != 0) {
162 G4double xlo = std::min(rparm[4],rparm[8]) +
163 std::abs(rparm[4]-rparm[8])*.5*rpar[2]/rparm[0];
164 G4double xhi = std::min(rparm[5],rparm[9]) +
165 std::abs(rparm[5]-rparm[9])*.5*rpar[2]/rparm[0];
166 rpar[0] = std::min(xlo,xhi);
167 }
168 if (rpar[0] < 0) NegPresent = TRUE;
169 }
170 if (rpar[1] < 0) {
171 if (rparm != 0) rpar[1] = std::min(rparm[3],rparm[7]) +
172 std::abs(rparm[3]-rparm[7])*.5*rpar[2]/rparm[0];
173 if (rpar[1] < 0) NegPresent = TRUE;
174 }
175 }
176 }
177 return NegPresent;
178}
179
181 G3VolTableEntry* vte,
182 G3VolTableEntry* mvte, const char routine[])
183{
184 G4bool NegPresent = FALSE;
185
186 // retrieve parameters
187
188 // the volume
189 G4String shape = vte->GetShape();
190 G4double* rpar = vte->GetRpar();
191 G4int npar = vte->GetNpar();
192 if (npar ==0) {
193 // no solid parameters are defined in vte
194 npar = *nparpt;
195 rpar = pars;
196 }
197 else {
198 // solid parameters are already defined in vte
199 // pars[], nparpt are ignored
200 // TO DO: check if g3 ignores them too or resets
201 // vte parameters according to this new ones !!
202 }
203
204 // mother
205 G4String shapem = mvte->GetShape();
206 G4double* rparm = mvte->GetRpar();
207
208 if (strcmp(routine,"GSPOS") == 0 || strcmp(routine,"GSVOLU") == 0) {
209 NegPresent = G3CalcParamsFn(rpar,npar,rparm,shape,shapem);
210 }
211 if (strcmp(routine,"GSDVN") == 0) {
212 // just set the flag. The parametrization function figures out
213 // what to do.
214 for (G4int i=0;i<npar;i++) {
215 if (rpar[i] < 0) {
216 NegPresent = TRUE;
217 }
218 }
219 }
220 return NegPresent;
221}
G4bool G3CalcParamsFn(G4double *rpar, G4int npar, G4double *rparm, G4String shape, G4String shapem)
Definition: G3NegVolPars.cc:36
G4bool G3NegVolPars(G4double pars[], G4int *nparpt, G3VolTableEntry *vte, G3VolTableEntry *mvte, const char routine[])
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4double * GetRpar()
#define TRUE
Definition: globals.hh:41
#define FALSE
Definition: globals.hh:38