source: trunk/source/geometry/divisions/src/G4VDivisionParameterisation.cc @ 1302

Last change on this file since 1302 was 1228, checked in by garnier, 14 years ago

update geant4.9.3 tag

File size: 6.9 KB
Line 
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: G4VDivisionParameterisation.cc,v 1.14 2008/12/03 16:41:15 arce Exp $
28// GEANT4 tag $Name: geant4-09-03 $
29//
30// class G4VDivisionParameterisation Implementation file
31//
32// 26.05.03 - P.Arce, Initial version
33// 08.04.04 - I.Hrivnacova, Implemented reflection
34// --------------------------------------------------------------------
35
36#include "G4VDivisionParameterisation.hh"
37#include "G4VSolid.hh"
38#include "G4VPhysicalVolume.hh"
39#include "G4RotationMatrix.hh"
40#include "G4ReflectedSolid.hh"
41#include "G4GeometryTolerance.hh"
42
43G4int G4VDivisionParameterisation::verbose = 5;
44
45//--------------------------------------------------------------------------
46G4VDivisionParameterisation::
47G4VDivisionParameterisation( EAxis axis, G4int nDiv,
48                             G4double step, G4double offset,
49                             DivisionType divType, G4VSolid* motherSolid )
50  : faxis(axis), fnDiv( nDiv), fwidth(step), foffset(offset),
51    fDivisionType(divType), fmotherSolid( motherSolid ), fReflectedSolid(false),
52    fDeleteSolid(false) 
53{
54#ifdef G4DIVDEBUG
55  if (verbose >= 1)
56  {
57    G4cout << " G4VDivisionParameterisation  no divisions " << fnDiv
58           << " = " << nDiv << G4endl
59           << " offset " << foffset << " = " << offset << G4endl
60           << " step " << fwidth << " = " << step << G4endl;
61  }
62#endif
63
64  theVoluFirstCopyNo = 1;
65  kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
66}
67
68//--------------------------------------------------------------------------
69G4VDivisionParameterisation::~G4VDivisionParameterisation()
70{
71  if (fDeleteSolid) delete fmotherSolid; 
72}
73
74//--------------------------------------------------------------------------
75G4VSolid* 
76G4VDivisionParameterisation::
77ComputeSolid( const G4int i, G4VPhysicalVolume* pv )
78{
79  G4VSolid* solid = G4VPVParameterisation::ComputeSolid(i, pv);
80  if (solid->GetEntityType() == "G4ReflectedSolid")
81  {
82    solid = ((G4ReflectedSolid*)solid)->GetConstituentMovedSolid();
83  }
84  return solid;
85}     
86
87//--------------------------------------------------------------------------
88void
89G4VDivisionParameterisation::
90ChangeRotMatrix( G4VPhysicalVolume *physVol, G4double rotZ ) const
91{
92  G4RotationMatrix* rm = new G4RotationMatrix();
93  rm->rotateZ( rotZ );
94  //----- set rotation
95  //----- delete first old rotation matrix
96  G4RotationMatrix* rmold = physVol->GetRotation();
97  delete rmold;
98  physVol->SetRotation(rm);
99}
100
101//--------------------------------------------------------------------------
102G4int
103G4VDivisionParameterisation::
104CalculateNDiv( G4double motherDim, G4double width, G4double offset ) const
105{
106#ifdef G4DIVDEBUG
107  G4cout << " G4VDivisionParameterisation::CalculateNDiv: "
108         << ( motherDim - offset ) / width
109         << " Motherdim: " <<  motherDim << ", Offset: " << offset
110         << ", Width: " << width << G4endl;
111#endif
112
113  return G4int( ( motherDim - offset ) / width );
114}
115
116//--------------------------------------------------------------------------
117G4double
118G4VDivisionParameterisation::
119CalculateWidth( G4double motherDim, G4int nDiv, G4double offset ) const
120{ 
121#ifdef G4DIVDEBUG
122  G4cout << " G4VDivisionParameterisation::CalculateWidth: "
123         << ( motherDim - offset ) / nDiv
124         << ", Motherdim: " << motherDim << ", Offset: " << offset
125         << ", Number of divisions: " << nDiv << G4endl;
126#endif
127
128  return ( motherDim - offset ) / nDiv;
129}
130
131//--------------------------------------------------------------------------
132void G4VDivisionParameterisation::CheckParametersValidity()
133{
134  G4double maxPar = GetMaxParameter();
135  CheckOffset( maxPar );
136  CheckNDivAndWidth( maxPar );
137}
138
139//--------------------------------------------------------------------------
140void G4VDivisionParameterisation::CheckOffset( G4double maxPar )
141{
142  if( foffset >= maxPar )
143  {
144    G4cerr << "ERROR - G4VDivisionParameterisation::CheckOffset()" << G4endl
145           << "        Division of solid " << fmotherSolid->GetName()
146           << " has too big offset = " << G4endl
147           << "        " << foffset << " > " << maxPar << " !" << G4endl;
148    G4Exception("G4VDivisionParameterisation::CheckOffset()",
149                "IllegalConstruct", FatalException,
150                "Not supported configuration.");
151  }
152}
153
154//--------------------------------------------------------------------------
155void G4VDivisionParameterisation::CheckNDivAndWidth( G4double maxPar )
156{
157  if( (fDivisionType == DivNDIVandWIDTH)
158      && (foffset + fwidth*fnDiv - maxPar > kCarTolerance ) )
159  {
160    G4cerr << "ERROR - G4VDivisionParameterisation::CheckNDivAndWidth()"
161           << G4endl
162           << "        Division of solid " << fmotherSolid->GetName()
163           << " has too big offset + width*nDiv = " << G4endl
164           << "        " << foffset + fwidth*fnDiv << " > "
165           << foffset << ". Width = "
166           << G4endl
167           << "        " << fwidth << ". nDiv = " << fnDiv << " !"
168           << G4endl;
169    G4Exception("G4VDivisionParameterisation::CheckNDivAndWidth()",
170                "IllegalConstruct", FatalException,
171                "Not supported configuration.");
172  }
173}
174
175//--------------------------------------------------------------------------
176G4double G4VDivisionParameterisation::OffsetZ() const
177{
178  // take into account reflection in the offset
179  G4double offset = foffset;
180  if (fReflectedSolid) offset = GetMaxParameter() - fwidth*fnDiv - foffset; 
181
182  return offset;
183} 
184
185 
Note: See TracBrowser for help on using the repository browser.