Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PartialPhantomParameterisation.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// $Id$
28//
29//
30// class G4PartialPhantomParameterisation implementation
31//
32// May 2007 Pedro Arce (CIEMAT), first version
33//
34// --------------------------------------------------------------------
35
37
38#include "globals.hh"
39#include "G4Material.hh"
40#include "G4VSolid.hh"
41#include "G4VPhysicalVolume.hh"
42#include "G4LogicalVolume.hh"
45
46#include <list>
47
48//------------------------------------------------------------------
51{
52}
53
54
55//------------------------------------------------------------------
57{
58}
59
60//------------------------------------------------------------------
62ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol ) const
63{
64 // Voxels cannot be rotated, return translation
65 //
66 G4ThreeVector trans = GetTranslation( copyNo );
67 physVol->SetTranslation( trans );
68}
69
70
71//------------------------------------------------------------------
73GetTranslation(const G4int copyNo ) const
74{
75 CheckCopyNo( copyNo );
76
77 size_t nx;
78 size_t ny;
79 size_t nz;
80 ComputeVoxelIndices( copyNo, nx, ny, nz );
81
84 (2*nz+1)*fVoxelHalfZ - fContainerWallZ);
85 return trans;
86}
87
88
89//------------------------------------------------------------------
91ComputeMaterial(const G4int copyNo, G4VPhysicalVolume *, const G4VTouchable *)
92{
93 CheckCopyNo( copyNo );
94 size_t matIndex = GetMaterialIndex(copyNo);
95
96 return fMaterials[ matIndex ];
97}
98
99
100//------------------------------------------------------------------
102GetMaterialIndex( size_t copyNo ) const
103{
104 CheckCopyNo( copyNo );
105
106 if( !fMaterialIndices ) { return 0; }
107
108 return *(fMaterialIndices+copyNo);
109}
110
111
112//------------------------------------------------------------------
114GetMaterialIndex( size_t nx, size_t ny, size_t nz ) const
115{
116 size_t copyNo = nx + fNoVoxelX*ny + fNoVoxelXY*nz;
117 return GetMaterialIndex( copyNo );
118}
119
120
121//------------------------------------------------------------------
123GetMaterial( size_t nx, size_t ny, size_t nz) const
124{
125 return fMaterials[GetMaterialIndex(nx,ny,nz)];
126}
127
128
129//------------------------------------------------------------------
131GetMaterial( size_t copyNo ) const
132{
133 return fMaterials[GetMaterialIndex(copyNo)];
134}
135
136
137//------------------------------------------------------------------
138void G4PartialPhantomParameterisation::
139ComputeVoxelIndices(const G4int copyNo, size_t& nx,
140 size_t& ny, size_t& nz ) const
141{
142 CheckCopyNo( copyNo );
143
144 std::multimap<G4int,G4int>::const_iterator ite =
145 fFilledIDs.lower_bound(size_t(copyNo));
146 G4int dist = std::distance( fFilledIDs.begin(), ite );
147 nz = size_t(dist/fNoVoxelY);
148 ny = size_t( dist%fNoVoxelY );
149
150 G4int ifmin = (*ite).second;
151 G4int nvoxXprev;
152 if( dist != 0 ) {
153 ite--;
154 nvoxXprev = (*ite).first;
155 } else {
156 nvoxXprev = -1;
157 }
158
159 nx = ifmin+copyNo-nvoxXprev-1;
160}
161
162
163//------------------------------------------------------------------
165GetReplicaNo( const G4ThreeVector& localPoint, const G4ThreeVector& localDir )
166{
167 // Check the voxel numbers corresponding to localPoint
168 // When a particle is on a surface, it may be between -kCarTolerance and
169 // +kCartolerance. By a simple distance as:
170 // G4int nx = G4int( (localPoint.x()+)/fVoxelHalfX/2.);
171 // those between -kCartolerance and 0 will be placed on voxel N-1 and those
172 // between 0 and kCarTolerance on voxel N.
173 // To avoid precision problems place the tracks that are on the surface on
174 // voxel N-1 if they have negative direction and on voxel N if they have
175 // positive direction.
176 // Add +kCarTolerance so that they are first placed on voxel N, and then
177 // if the direction is negative substract 1
178
179 G4double fx = (localPoint.x()+fContainerWallX+kCarTolerance)/(fVoxelHalfX*2.);
180 G4int nx = G4int(fx);
181
182 G4double fy = (localPoint.y()+fContainerWallY+kCarTolerance)/(fVoxelHalfY*2.);
183 G4int ny = G4int(fy);
184
185 G4double fz = (localPoint.z()+fContainerWallZ+kCarTolerance)/(fVoxelHalfZ*2.);
186 G4int nz = G4int(fz);
187
188 // If it is on the surface side, check the direction: if direction is
189 // negative place it on the previous voxel (if direction is positive it is
190 // already in the next voxel...).
191 // Correct also cases where n = -1 or n = fNoVoxel. It is always traced to be
192 // due to multiple scattering: track is entering a voxel but multiple
193 // scattering changes the angle towards outside
194 //
195 if( fx - nx < kCarTolerance/fVoxelHalfX )
196 {
197 if( localDir.x() < 0 )
198 {
199 if( nx != 0 )
200 {
201 nx -= 1;
202 }
203 }
204 else
205 {
206 if( nx == G4int(fNoVoxelX) )
207 {
208 nx -= 1;
209 }
210 }
211 }
212 if( fy - ny < kCarTolerance/fVoxelHalfY )
213 {
214 if( localDir.y() < 0 )
215 {
216 if( ny != 0 )
217 {
218 ny -= 1;
219 }
220 }
221 else
222 {
223 if( ny == G4int(fNoVoxelY) )
224 {
225 ny -= 1;
226 }
227 }
228 }
229 if( fz - nz < kCarTolerance/fVoxelHalfZ )
230 {
231 if( localDir.z() < 0 )
232 {
233 if( nz != 0 )
234 {
235 nz -= 1;
236 }
237 }
238 else
239 {
240 if( nz == G4int(fNoVoxelZ) )
241 {
242 nz -= 1;
243 }
244 }
245 }
246
247 // Check if there are still errors
248 //
249 G4bool isOK = true;
250 if( nx < 0 )
251 {
252 nx = 0;
253 isOK = false;
254 }
255 else if( nx >= G4int(fNoVoxelX) )
256 {
257 nx = fNoVoxelX-1;
258 isOK = false;
259 }
260 if( ny < 0 )
261 {
262 ny = 0;
263 isOK = false;
264 }
265 else if( ny >= G4int(fNoVoxelY) )
266 {
267 ny = fNoVoxelY-1;
268 isOK = false;
269 }
270 if( nz < 0 )
271 {
272 nz = 0;
273 isOK = false;
274 }
275 else if( nz >= G4int(fNoVoxelZ) )
276 {
277 nz = fNoVoxelZ-1;
278 isOK = false;
279 }
280 if( !isOK )
281 {
282 std::ostringstream message;
283 message << "Corrected the copy number! It was negative or too big."
284 << G4endl
285 << " LocalPoint: " << localPoint << G4endl
286 << " LocalDir: " << localDir << G4endl
287 << " Voxel container size: " << fContainerWallX
288 << " " << fContainerWallY << " " << fContainerWallZ << G4endl
289 << " LocalPoint - wall: "
290 << localPoint.x()-fContainerWallX << " "
291 << localPoint.y()-fContainerWallY << " "
292 << localPoint.z()-fContainerWallZ;
293 G4Exception("G4PartialPhantomParameterisation::GetReplicaNo()",
294 "GeomNav1002", JustWarning, message);
295 }
296
297 G4int nyz = nz*fNoVoxelY+ny;
298 std::multimap<G4int,G4int>::iterator ite = fFilledIDs.begin();
299/*
300 for( ite = fFilledIDs.begin(); ite != fFilledIDs.end(); ite++ )
301 {
302 G4cout << " G4PartialPhantomParameterisation::GetReplicaNo filled "
303 << (*ite).first << " , " << (*ite).second << std::endl;
304 }
305*/
306 ite = fFilledIDs.begin();
307
308 advance(ite,nyz);
309 std::multimap<G4int,G4int>::iterator iteant = ite; iteant--;
310 G4int copyNo = (*iteant).first + 1 + ( nx - (*ite).second );
311/*
312 G4cout << " G4PartialPhantomParameterisation::GetReplicaNo getting copyNo "
313 << copyNo << " nyz " << nyz << " (*iteant).first "
314 << (*iteant).first << " (*ite).second " << (*ite).second << G4endl;
315
316 G4cout << " G4PartialPhantomParameterisation::GetReplicaNo " << copyNo
317 << " nx " << nx << " ny " << ny << " nz " << nz
318 << " localPoint " << localPoint << " localDir " << localDir << G4endl;
319*/
320 return copyNo;
321}
322
323
324//------------------------------------------------------------------
325void G4PartialPhantomParameterisation::CheckCopyNo( const G4int copyNo ) const
326{
327 if( copyNo < 0 || copyNo >= G4int(fNoVoxel) )
328 {
329 std::ostringstream message;
330 message << "Copy number is negative or too big!" << G4endl
331 << " Copy number: " << copyNo << G4endl
332 << " Total number of voxels: " << fNoVoxel;
333 G4Exception("G4PartialPhantomParameterisation::CheckCopyNo()",
334 "GeomNav0002", FatalErrorInArgument, message);
335 }
336}
337
338
339//------------------------------------------------------------------
341{
345}
@ JustWarning
@ FatalErrorInArgument
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
double z() const
double x() const
double y() const
void ComputeTransformation(const G4int, G4VPhysicalVolume *) const
G4Material * ComputeMaterial(const G4int repNo, G4VPhysicalVolume *currentVol, const G4VTouchable *parentTouch=0)
size_t GetMaterialIndex(size_t nx, size_t ny, size_t nz) const
G4int GetReplicaNo(const G4ThreeVector &localPoint, const G4ThreeVector &localDir)
G4ThreeVector GetTranslation(const G4int copyNo) const
G4Material * GetMaterial(size_t nx, size_t ny, size_t nz) const
std::vector< G4Material * > fMaterials
void SetTranslation(const G4ThreeVector &v)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41