ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4VDivisionParameterisation.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4VDivisionParameterisation.cc
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 // G4VDivisionParameterisation implementation
27 //
28 // 26.05.03 - P.Arce, Initial version
29 // 08.04.04 - I.Hrivnacova, Implemented reflection
30 // 21.04.10 - M.Asai, Added gaps
31 // --------------------------------------------------------------------
32 
34 #include "G4VSolid.hh"
35 #include "G4VPhysicalVolume.hh"
36 #include "G4RotationMatrix.hh"
37 #include "G4ReflectedSolid.hh"
38 #include "G4GeometryTolerance.hh"
39 #include "G4AutoDelete.hh"
40 
43 
44 //--------------------------------------------------------------------------
48  DivisionType divType, G4VSolid* motherSolid )
49  : faxis(axis), fnDiv( nDiv), fwidth(step), foffset(offset),
50  fDivisionType(divType), fmotherSolid( motherSolid )
51 {
52 #ifdef G4DIVDEBUG
53  if (verbose >= 1)
54  {
55  G4cout << " G4VDivisionParameterisation no divisions " << fnDiv
56  << " = " << nDiv << G4endl
57  << " offset " << foffset << " = " << offset << G4endl
58  << " step " << fwidth << " = " << step << G4endl;
59  }
60 #endif
62 }
63 
64 //--------------------------------------------------------------------------
66 {
67  if (fDeleteSolid) { delete fmotherSolid; }
68 }
69 
70 //--------------------------------------------------------------------------
71 G4VSolid*
74 {
76  if (solid->GetEntityType() == "G4ReflectedSolid")
77  {
78  solid = ((G4ReflectedSolid*)solid)->GetConstituentMovedSolid();
79  }
80  return solid;
81 }
82 
83 //--------------------------------------------------------------------------
84 void
87 {
88  if (fRot == nullptr)
89  {
90  fRot = new G4RotationMatrix();
92  }
93  fRot->rotateZ( rotZ );
94  physVol->SetRotation(fRot);
95 }
96 
97 //--------------------------------------------------------------------------
98 G4int
100 CalculateNDiv( G4double motherDim, G4double width, G4double offset ) const
101 {
102 #ifdef G4DIVDEBUG
103  G4cout << " G4VDivisionParameterisation::CalculateNDiv: "
104  << ( motherDim - offset ) / width
105  << " Motherdim: " << motherDim << ", Offset: " << offset
106  << ", Width: " << width << G4endl;
107 #endif
108 
109  return G4int( ( motherDim - offset ) / width );
110 }
111 
112 //--------------------------------------------------------------------------
113 G4double
115 CalculateWidth( G4double motherDim, G4int nDiv, G4double offset ) const
116 {
117 #ifdef G4DIVDEBUG
118  G4cout << " G4VDivisionParameterisation::CalculateWidth: "
119  << ( motherDim - offset ) / nDiv
120  << ", Motherdim: " << motherDim << ", Offset: " << offset
121  << ", Number of divisions: " << nDiv << G4endl;
122 #endif
123 
124  return ( motherDim - offset ) / nDiv;
125 }
126 
127 //--------------------------------------------------------------------------
129 {
130  G4double maxPar = GetMaxParameter();
131  CheckOffset( maxPar );
132  CheckNDivAndWidth( maxPar );
133 }
134 
135 //--------------------------------------------------------------------------
137 {
138  if( foffset >= maxPar )
139  {
140  std::ostringstream message;
141  message << "Configuration not supported." << G4endl
142  << "Division of solid " << fmotherSolid->GetName()
143  << " has too big offset = " << G4endl
144  << " " << foffset << " > " << maxPar << " !";
145  G4Exception("G4VDivisionParameterisation::CheckOffset()",
146  "GeomDiv0001", FatalException, message);
147  }
148 }
149 
150 //--------------------------------------------------------------------------
152 {
154  && (foffset + fwidth*fnDiv - maxPar > kCarTolerance ) )
155  {
156  std::ostringstream message;
157  message << "Configuration not supported." << G4endl
158  << "Division of solid " << fmotherSolid->GetName()
159  << " has too big offset + width*nDiv = " << G4endl
160  << " " << foffset + fwidth*fnDiv << " > "
161  << foffset << ". Width = "
162  << G4endl
163  << " " << fwidth << ". nDiv = " << fnDiv << " !";
164  G4Exception("G4VDivisionParameterisation::CheckNDivAndWidth()",
165  "GeomDiv0001", FatalException, message);
166  }
167 }
168 
169 //--------------------------------------------------------------------------
171 {
172  // take into account reflection in the offset
173 
175  if (fReflectedSolid)
176  {
177  offset = GetMaxParameter() - fwidth*fnDiv - foffset;
178  }
179 
180  return offset;
181 }
182 
183