Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/divisions/src/G4ReplicatedSlice.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /geometry/divisions/src/G4ReplicatedSlice.cc (Version 11.3.0) and /geometry/divisions/src/G4ReplicatedSlice.cc (Version 10.1.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // G4ReplicatedSlice implementation            << 
 27 //                                                 26 //
 28 // Author: M.Asai (SLAC), 20/04/2010 - Extende <<  27 // $Id: G4ReplicatedSlice.cc 66356 2012-12-18 09:02:32Z gcosmo $
                                                   >>  28 //
 29 // -------------------------------------------     29 // --------------------------------------------------------------------
 30                                                    30 
 31 #include "G4ReplicatedSlice.hh"                    31 #include "G4ReplicatedSlice.hh"
 32 #include "G4LogicalVolume.hh"                      32 #include "G4LogicalVolume.hh"
 33 #include "G4VSolid.hh"                             33 #include "G4VSolid.hh"
 34 #include "G4ReflectedSolid.hh"                     34 #include "G4ReflectedSolid.hh"
 35 #include "G4ParameterisationBox.hh"                35 #include "G4ParameterisationBox.hh"
 36 #include "G4ParameterisationTubs.hh"               36 #include "G4ParameterisationTubs.hh"
 37 #include "G4ParameterisationCons.hh"               37 #include "G4ParameterisationCons.hh"
 38 #include "G4ParameterisationTrd.hh"                38 #include "G4ParameterisationTrd.hh"
 39 #include "G4ParameterisationPara.hh"               39 #include "G4ParameterisationPara.hh"
 40 #include "G4ParameterisationPolycone.hh"           40 #include "G4ParameterisationPolycone.hh"
 41 #include "G4ParameterisationPolyhedra.hh"          41 #include "G4ParameterisationPolyhedra.hh"
 42                                                    42 
 43 //--------------------------------------------     43 //--------------------------------------------------------------------------
 44 G4ReplicatedSlice::G4ReplicatedSlice(const G4S     44 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
 45                                            G4L     45                                            G4LogicalVolume* pLogical,
 46                                            G4L     46                                            G4LogicalVolume* pMotherLogical,
 47                                      const EAx     47                                      const EAxis pAxis,
 48                                      const G4i     48                                      const G4int nDivs,
 49                                      const G4d     49                                      const G4double width,
 50                                      const G4d     50                                      const G4double half_gap,
 51                                      const G4d     51                                      const G4double offset )
 52   : G4PVReplica(pName, nDivs, pAxis, pLogical, <<  52   : G4VPhysicalVolume(0,G4ThreeVector(),pName,pLogical,0), fcopyNo(-1)
 53 {                                                  53 {
 54   CheckAndSetParameters(pAxis, nDivs, width, h     54   CheckAndSetParameters(pAxis, nDivs, width, half_gap, offset,
 55                         DivNDIVandWIDTH, pMoth     55                         DivNDIVandWIDTH, pMotherLogical, pLogical);
 56 }                                                  56 }
 57                                                    57 
 58 //--------------------------------------------     58 //--------------------------------------------------------------------------
 59 G4ReplicatedSlice::G4ReplicatedSlice(const G4S     59 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
 60                                            G4L     60                                            G4LogicalVolume* pLogical,
 61                                            G4L     61                                            G4LogicalVolume* pMotherLogical,
 62                                      const EAx     62                                      const EAxis pAxis,
 63                                      const G4i     63                                      const G4int nDivs,
 64                                      const G4d     64                                      const G4double half_gap,
 65                                      const G4d     65                                      const G4double offset )
 66   : G4PVReplica(pName, nDivs, pAxis, pLogical, <<  66   : G4VPhysicalVolume(0,G4ThreeVector(),pName,pLogical,0), fcopyNo(-1)
 67 {                                                  67 {
 68   CheckAndSetParameters(pAxis, nDivs, 0., half     68   CheckAndSetParameters(pAxis, nDivs, 0., half_gap, offset,
 69                         DivNDIV, pMotherLogica     69                         DivNDIV, pMotherLogical, pLogical);
 70 }                                                  70 }
 71                                                    71 
 72 //--------------------------------------------     72 //--------------------------------------------------------------------------
 73 G4ReplicatedSlice::G4ReplicatedSlice(const G4S     73 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
 74                                            G4L     74                                            G4LogicalVolume* pLogical,
 75                                            G4L     75                                            G4LogicalVolume* pMotherLogical,
 76                                      const EAx     76                                      const EAxis pAxis,
 77                                      const G4d     77                                      const G4double width,
 78                                      const G4d     78                                      const G4double half_gap,
 79                                      const G4d     79                                      const G4double offset )
 80   : G4PVReplica(pName, 0, pAxis, pLogical, pMo <<  80   : G4VPhysicalVolume(0,G4ThreeVector(),pName,pLogical,0), fcopyNo(-1)
 81 {                                                  81 {
 82   CheckAndSetParameters(pAxis, 0, width, half_     82   CheckAndSetParameters(pAxis, 0, width, half_gap, offset,
 83                         DivWIDTH, pMotherLogic     83                         DivWIDTH, pMotherLogical, pLogical);
 84 }                                                  84 }
 85                                                    85 
 86 //--------------------------------------------     86 //--------------------------------------------------------------------------
 87 G4ReplicatedSlice::G4ReplicatedSlice(const G4S     87 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
 88                                            G4L     88                                            G4LogicalVolume* pLogical,
 89                                            G4V     89                                            G4VPhysicalVolume* pMotherPhysical,
 90                                      const EAx     90                                      const EAxis pAxis,
 91                                      const G4i     91                                      const G4int nDivs,
 92                                      const G4d     92                                      const G4double width,
 93                                      const G4d     93                                      const G4double half_gap,
 94                                      const G4d     94                                      const G4double offset )
 95   : G4PVReplica(pName, nDivs, pAxis, pLogical, <<  95   : G4VPhysicalVolume(0,G4ThreeVector(),pName,pLogical,0), fcopyNo(-1)
 96                 pMotherPhysical != nullptr ? p << 
 97 {                                                  96 {
 98   if (pMotherPhysical == nullptr)              << 
 99   {                                            << 
100     std::ostringstream message;                << 
101     message << "Invalid setup." << G4endl      << 
102             << "NULL pointer specified as moth << 
103     G4Exception("G4ReplicatedSlice::G4Replicat << 
104                 FatalException, message);      << 
105     return;                                    << 
106   }                                            << 
107   CheckAndSetParameters(pAxis, nDivs, width, h     97   CheckAndSetParameters(pAxis, nDivs, width, half_gap, offset,
108       DivNDIVandWIDTH, pMotherPhysical->GetLog     98       DivNDIVandWIDTH, pMotherPhysical->GetLogicalVolume(), pLogical);
109 }                                                  99 }
110                                                   100 
111 //--------------------------------------------    101 //--------------------------------------------------------------------------
112 G4ReplicatedSlice::G4ReplicatedSlice(const G4S    102 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
113                                            G4L    103                                            G4LogicalVolume* pLogical,
114                                            G4V    104                                            G4VPhysicalVolume* pMotherPhysical,
115                                      const EAx    105                                      const EAxis pAxis,
116                                      const G4i    106                                      const G4int nDivs,
117                                      const G4d    107                                      const G4double half_gap,
118                                      const G4d    108                                      const G4double offset )
119   : G4PVReplica(pName, nDivs, pAxis, pLogical, << 109   : G4VPhysicalVolume(0,G4ThreeVector(),pName,pLogical,0), fcopyNo(-1)
120                 pMotherPhysical != nullptr ? p << 
121 {                                                 110 {
122   if (pMotherPhysical == nullptr)              << 
123   {                                            << 
124     std::ostringstream message;                << 
125     message << "Invalid setup." << G4endl      << 
126             << "NULL pointer specified as moth << 
127     G4Exception("G4ReplicatedSlice::G4Replicat << 
128                 FatalException, message);      << 
129     return;                                    << 
130   }                                            << 
131   CheckAndSetParameters(pAxis, nDivs, 0., half    111   CheckAndSetParameters(pAxis, nDivs, 0., half_gap, offset,
132       DivNDIV, pMotherPhysical->GetLogicalVolu    112       DivNDIV, pMotherPhysical->GetLogicalVolume(), pLogical);
133 }                                                 113 }
134                                                   114 
135 //--------------------------------------------    115 //--------------------------------------------------------------------------
136 G4ReplicatedSlice::G4ReplicatedSlice(const G4S    116 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
137                                            G4L    117                                            G4LogicalVolume* pLogical,
138                                            G4V    118                                            G4VPhysicalVolume* pMotherPhysical,
139                                      const EAx    119                                      const EAxis pAxis,
140                                      const G4d    120                                      const G4double width,
141                                      const G4d    121                                      const G4double half_gap,
142                                      const G4d    122                                      const G4double offset )
143   : G4PVReplica(pName, 0, pAxis, pLogical,     << 123   : G4VPhysicalVolume(0,G4ThreeVector(),pName,pLogical,0), fcopyNo(-1)
144                 pMotherPhysical != nullptr ? p << 
145 {                                                 124 {
146   if (pMotherPhysical == nullptr)              << 
147   {                                            << 
148     std::ostringstream message;                << 
149     message << "Invalid setup." << G4endl      << 
150             << "NULL pointer specified as moth << 
151     G4Exception("G4ReplicatedSlice::G4Replicat << 
152                 FatalException, message);      << 
153     return;                                    << 
154   }                                            << 
155   CheckAndSetParameters(pAxis, 0, width, half_    125   CheckAndSetParameters(pAxis, 0, width, half_gap, offset,
156       DivWIDTH, pMotherPhysical->GetLogicalVol    126       DivWIDTH, pMotherPhysical->GetLogicalVolume(), pLogical);
157 }                                                 127 }
158                                                   128 
159 //--------------------------------------------    129 //--------------------------------------------------------------------------
160 void                                              130 void
161 G4ReplicatedSlice::CheckAndSetParameters( cons    131 G4ReplicatedSlice::CheckAndSetParameters( const EAxis pAxis,
162                                           cons    132                                           const G4int nDivs,
163                                           cons    133                                           const G4double width,
164                                           cons    134                                           const G4double half_gap,
165                                           cons    135                                           const G4double offset, 
166                                                   136                                                 DivisionType divType,
167                                                   137                                                 G4LogicalVolume* pMotherLogical,
168                                           cons    138                                           const G4LogicalVolume* pLogical )
169 {                                                 139 {
170   if(pMotherLogical == nullptr)                << 140   if(!pMotherLogical)
171   {                                               141   {
172     std::ostringstream message;                   142     std::ostringstream message;
173     message << "Invalid setup." << G4endl         143     message << "Invalid setup." << G4endl
174             << "NULL pointer specified as moth    144             << "NULL pointer specified as mother! Volume: " << GetName();
175     G4Exception("G4ReplicatedSlice::CheckAndSe    145     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
176                 FatalException, message);         146                 FatalException, message);
177   }                                               147   }
178   if(pLogical == pMotherLogical)                  148   if(pLogical == pMotherLogical)
179   {                                               149   {
180     std::ostringstream message;                   150     std::ostringstream message;
181     message << "Invalid setup." << G4endl         151     message << "Invalid setup." << G4endl
182             << "Cannot place a volume inside i    152             << "Cannot place a volume inside itself! Volume: " << GetName();
183     G4Exception("G4ReplicatedSlice::CheckAndSe    153     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
184                 FatalException, message);         154                 FatalException, message);
185   }                                               155   }
186                                                   156 
187   //----- Check that mother solid is of the sa    157   //----- Check that mother solid is of the same type as
188   //      daughter solid (otherwise, the corre    158   //      daughter solid (otherwise, the corresponding
189   //      Parameterisation::ComputeDimension()    159   //      Parameterisation::ComputeDimension() will not be called)
190   //                                              160   //
191   G4String msolType = pMotherLogical->GetSolid    161   G4String msolType = pMotherLogical->GetSolid()->GetEntityType();
192   G4String dsolType = pLogical->GetSolid()->Ge    162   G4String dsolType = pLogical->GetSolid()->GetEntityType();
193   if( msolType != dsolType && ( msolType != "G    163   if( msolType != dsolType && ( msolType != "G4Trd" || dsolType != "G4Trap" ) )
194   {                                               164   {
195     std::ostringstream message;                   165     std::ostringstream message;
196     message << "Invalid setup." << G4endl         166     message << "Invalid setup." << G4endl
197             << "Incorrect solid type for divis    167             << "Incorrect solid type for division of volume: "
198             << GetName() << G4endl                168             << GetName() << G4endl
199             << "    It is: " << msolType          169             << "    It is: " << msolType
200             << ", while it should be: " << dso    170             << ", while it should be: " << dsolType;
201     G4Exception("G4ReplicatedSlice::CheckAndSe    171     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()",
202                 "GeomDiv0002", FatalException,    172                 "GeomDiv0002", FatalException, message);
203   }                                               173   }
204                                                   174 
205   pMotherLogical->AddDaughter(this);              175   pMotherLogical->AddDaughter(this);
206   SetMotherLogical(pMotherLogical);               176   SetMotherLogical(pMotherLogical);
207   SetParameterisation(pMotherLogical, pAxis, n    177   SetParameterisation(pMotherLogical, pAxis, nDivs,
208                       width, half_gap, offset,    178                       width, half_gap, offset, divType);
209                                                   179 
210   if( divType == DivWIDTH )                       180   if( divType == DivWIDTH )
211   {                                               181   {
212     fnReplicas = fparam->GetNoDiv();              182     fnReplicas = fparam->GetNoDiv();
213   }                                               183   }
214   else                                            184   else
215   {                                               185   {
216     fnReplicas = nDivs;                           186     fnReplicas = nDivs;
217   }                                               187   }
218   if (fnReplicas < 1 )                            188   if (fnReplicas < 1 )
219   {                                               189   {
220     G4Exception("G4ReplicatedSlice::CheckAndSe    190     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
221                 FatalException, "Illegal numbe    191                 FatalException, "Illegal number of replicas!");
222   }                                               192   }
223   if( divType != DivNDIV)                         193   if( divType != DivNDIV)
224   {                                               194   {
225     fwidth = fparam->GetWidth();                  195     fwidth = fparam->GetWidth();
226   }                                               196   }
227   else                                            197   else
228   {                                               198   {
229     fwidth = width;                               199     fwidth = width;
230   }                                               200   }
231   if( fwidth < 0 )                                201   if( fwidth < 0 )
232   {                                               202   {
233     G4Exception("G4ReplicatedSlice::CheckAndSe    203     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
234                 FatalException, "Width must be    204                 FatalException, "Width must be positive!");
235   }                                               205   }
236   if( fwidth < 2.*half_gap )                      206   if( fwidth < 2.*half_gap )
237   {                                               207   {
238     G4Exception("G4ReplicatedSlice::CheckAndSe    208     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
239                 FatalException, "Half_gap is t    209                 FatalException, "Half_gap is too large!");
240   }                                               210   }
241                                                   211   
242   foffset = offset;                               212   foffset = offset;
243   fdivAxis = pAxis;                               213   fdivAxis = pAxis;
244                                                   214 
245   //!!!!! axis has to be x/y/z in G4VoxelLimit    215   //!!!!! axis has to be x/y/z in G4VoxelLimits::GetMinExtent
246   //                                              216   //
247   if( pAxis == kRho || pAxis == kRadial3D || p    217   if( pAxis == kRho || pAxis == kRadial3D || pAxis == kPhi )
248   {                                               218   {
249     faxis = kZAxis;                               219     faxis = kZAxis;
250   }                                               220   }
251   else                                            221   else
252   {                                               222   {
253     faxis = pAxis;                                223     faxis = pAxis;
254   }                                               224   }
255                                                   225   
256   switch (faxis)                                  226   switch (faxis)
257   {                                               227   {
258     case kPhi:                                    228     case kPhi:
259     case kRho:                                    229     case kRho:
260     case kXAxis:                                  230     case kXAxis:
261     case kYAxis:                                  231     case kYAxis:
262     case kZAxis:                                  232     case kZAxis:
263       break;                                      233       break;
264     default:                                      234     default:
265       G4Exception("G4ReplicatedSlice::CheckAnd    235       G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
266                   FatalException, "Unknown axi    236                   FatalException, "Unknown axis of replication.");
267       break;                                      237       break;
268   }                                               238   }
269                                                   239 
270   // Create rotation matrix: for phi axis it w    240   // Create rotation matrix: for phi axis it will be changed
271   // in G4VPVParameterisation::ComputeTransfor    241   // in G4VPVParameterisation::ComputeTransformation, for others
272   // it will stay the unity                       242   // it will stay the unity
273   //                                              243   //
274   auto  pRMat = new G4RotationMatrix();        << 244   G4RotationMatrix *pRMat = new G4RotationMatrix();
275   SetRotation(pRMat);                             245   SetRotation(pRMat);
276 }                                                 246 }
277                                                   247 
278 //--------------------------------------------    248 //--------------------------------------------------------------------------
279 G4ReplicatedSlice::~G4ReplicatedSlice()           249 G4ReplicatedSlice::~G4ReplicatedSlice()
280 {                                                 250 {
281   delete GetRotation();                           251   delete GetRotation();
282 }                                                 252 }
283                                                   253 
284 //--------------------------------------------    254 //--------------------------------------------------------------------------
285 EAxis G4ReplicatedSlice::GetDivisionAxis() con    255 EAxis G4ReplicatedSlice::GetDivisionAxis() const
286 {                                                 256 {
287   return fdivAxis;                                257   return fdivAxis;
288 }                                                 258 }
289                                                   259 
290 //--------------------------------------------    260 //--------------------------------------------------------------------------
291 G4bool G4ReplicatedSlice::IsParameterised() co    261 G4bool G4ReplicatedSlice::IsParameterised() const
292 {                                                 262 { 
293   return true;                                    263   return true;
294 }                                                 264 }
295                                                   265 
296 //--------------------------------------------    266 //--------------------------------------------------------------------------
297 G4bool G4ReplicatedSlice::IsMany() const          267 G4bool G4ReplicatedSlice::IsMany() const
298 {                                                 268 {
299   return false;                                   269   return false; 
300 }                                                 270 }
301                                                   271 
302 //--------------------------------------------    272 //--------------------------------------------------------------------------
303 G4bool G4ReplicatedSlice::IsReplicated() const << 273 G4int G4ReplicatedSlice::GetCopyNo() const
304 {                                                 274 {
305   return true;                                 << 275   return fcopyNo;
306 }                                                 276 }
307                                                   277 
308 //--------------------------------------------    278 //--------------------------------------------------------------------------
309 G4int G4ReplicatedSlice::GetMultiplicity() con << 279 void  G4ReplicatedSlice::SetCopyNo(G4int newCopyNo)
310 {                                                 280 {
311   return fnReplicas;                           << 281   fcopyNo= newCopyNo;
312 }                                                 282 }
313                                                   283 
314 //--------------------------------------------    284 //--------------------------------------------------------------------------
315 G4VPVParameterisation* G4ReplicatedSlice::GetP << 285 G4bool G4ReplicatedSlice::IsReplicated() const
316 {                                                 286 {
317   return fparam;                               << 287   return true;
318 }                                                 288 }
319                                                   289 
320 //--------------------------------------------    290 //--------------------------------------------------------------------------
321 EVolume G4ReplicatedSlice::VolumeType() const  << 291 G4VPVParameterisation* G4ReplicatedSlice::GetParameterisation() const
322 {                                                 292 {
323   return kParameterised;                       << 293   return fparam;
324 }                                                 294 }
325                                                   295 
326 //--------------------------------------------    296 //--------------------------------------------------------------------------
327 void G4ReplicatedSlice::GetReplicationData(EAx    297 void G4ReplicatedSlice::GetReplicationData(EAxis& axis,
328                                            G4i    298                                            G4int& nDivs,
329                                            G4d    299                                            G4double& width,
330                                            G4d    300                                            G4double& offset,
331                                            G4b    301                                            G4bool& consuming ) const
332 {                                                 302 {
333   axis = faxis;                                << 303   axis=faxis;
334   nDivs = fnReplicas;                          << 304   nDivs=fnReplicas;
335   width = fwidth;                              << 305   width=fwidth;
336   offset = foffset;                            << 306   offset=foffset;
337   consuming = false;                           << 307   consuming=false;
338 }                                                 308 }
339                                                   309 
340                                                   310 
341 //--------------------------------------------    311 //--------------------------------------------------------------------------
342 void G4ReplicatedSlice::SetParameterisation( G    312 void G4ReplicatedSlice::SetParameterisation( G4LogicalVolume* motherLogical,
343                                        const E    313                                        const EAxis axis,
344                                        const G    314                                        const G4int nDivs,
345                                        const G    315                                        const G4double width,
346                                        const G    316                                        const G4double half_gap,
347                                        const G    317                                        const G4double offset,
348                                              D    318                                              DivisionType divType )
349 {                                                 319 {
350   G4VSolid* mSolid = motherLogical->GetSolid()    320   G4VSolid* mSolid = motherLogical->GetSolid();
351   G4String mSolidType = mSolid->GetEntityType(    321   G4String mSolidType = mSolid->GetEntityType();
352   fparam = nullptr;                            << 
353                                                   322 
354   // If the solid is a reflected one, update t    323   // If the solid is a reflected one, update type to its
355   // real constituent solid.                      324   // real constituent solid.
356   //                                              325   // 
357   if (mSolidType == "G4ReflectedSolid")           326   if (mSolidType == "G4ReflectedSolid")
358   {                                               327   {
359       mSolidType = ((G4ReflectedSolid*)mSolid)    328       mSolidType = ((G4ReflectedSolid*)mSolid)->GetConstituentMovedSolid()
360                  ->GetEntityType();               329                  ->GetEntityType(); 
361   }                                               330   }    
362                                                   331 
363   // Parameterisation type depend of mother so    332   // Parameterisation type depend of mother solid type and axis of division
364   //                                              333   //
365   if( mSolidType == "G4Box" )                     334   if( mSolidType == "G4Box" )
366   {                                               335   {
367     switch( axis )                                336     switch( axis )
368     {                                             337     {
369       case kXAxis:                                338       case kXAxis:
370         fparam = new G4ParameterisationBoxX( a    339         fparam = new G4ParameterisationBoxX( axis, nDivs, width,
371                                              o    340                                              offset, mSolid, divType );
372         break;                                    341         break;
373       case kYAxis:                                342       case kYAxis:
374         fparam = new G4ParameterisationBoxY( a    343         fparam = new G4ParameterisationBoxY( axis, nDivs, width,
375                                              o    344                                              offset, mSolid, divType );
376         break;                                    345         break;
377       case kZAxis:                                346       case kZAxis:
378         fparam = new G4ParameterisationBoxZ( a    347         fparam = new G4ParameterisationBoxZ( axis, nDivs, width,
379                                              o    348                                              offset, mSolid, divType );
380         break;                                    349         break;
381       default:                                    350       default:
382         ErrorInAxis( axis, mSolid );              351         ErrorInAxis( axis, mSolid );
383         break;                                    352         break;
384     }                                             353     }
385   }                                               354   }
386   else if( mSolidType == "G4Tubs" )               355   else if( mSolidType == "G4Tubs" )
387   {                                               356   {
388     switch( axis )                                357     switch( axis )
389     {                                             358     {
390       case kRho:                                  359       case kRho:
391         fparam = new G4ParameterisationTubsRho    360         fparam = new G4ParameterisationTubsRho( axis, nDivs, width,
392                                                   361                                                 offset, mSolid, divType );
393         break;                                    362         break;
394       case kPhi:                                  363       case kPhi:
395         fparam = new G4ParameterisationTubsPhi    364         fparam = new G4ParameterisationTubsPhi( axis, nDivs, width,
396                                                   365                                                 offset, mSolid, divType );
397         break;                                    366         break;
398       case kZAxis:                                367       case kZAxis:
399         fparam = new G4ParameterisationTubsZ(     368         fparam = new G4ParameterisationTubsZ( axis, nDivs, width,
400                                                   369                                               offset, mSolid, divType );
401         break;                                    370         break;
402       default:                                    371       default:
403         ErrorInAxis( axis, mSolid );              372         ErrorInAxis( axis, mSolid );
404         break;                                    373         break;
405     }                                             374     }
406   }                                               375   }
407   else if( mSolidType == "G4Cons" )               376   else if( mSolidType == "G4Cons" )
408   {                                               377   {
409     switch( axis )                                378     switch( axis )
410     {                                             379     {
411       case kRho:                                  380       case kRho:
412         fparam = new G4ParameterisationConsRho    381         fparam = new G4ParameterisationConsRho( axis, nDivs, width,
413                                                   382                                                 offset, mSolid, divType );
414         break;                                    383         break;
415       case kPhi:                                  384       case kPhi:
416         fparam = new G4ParameterisationConsPhi    385         fparam = new G4ParameterisationConsPhi( axis, nDivs, width,
417                                                   386                                                 offset, mSolid, divType );
418         break;                                    387         break;
419       case kZAxis:                                388       case kZAxis:
420         fparam = new G4ParameterisationConsZ(     389         fparam = new G4ParameterisationConsZ( axis, nDivs, width,
421                                                   390                                               offset, mSolid, divType );
422         break;                                    391         break;
423       default:                                    392       default:
424         ErrorInAxis( axis, mSolid );              393         ErrorInAxis( axis, mSolid );
425         break;                                    394         break;
426     }                                             395     }
427   }                                               396   }
428   else if( mSolidType == "G4Trd" )                397   else if( mSolidType == "G4Trd" )
429   {                                               398   { 
430     switch( axis )                                399     switch( axis )
431     {                                             400     {
432       case kXAxis:                                401       case kXAxis:
433         fparam = new G4ParameterisationTrdX( a    402         fparam = new G4ParameterisationTrdX( axis, nDivs, width,
434                                              o    403                                              offset, mSolid, divType );
435         break;                                    404         break;
436       case kYAxis:                                405       case kYAxis:
437         fparam = new G4ParameterisationTrdY( a    406         fparam = new G4ParameterisationTrdY( axis, nDivs, width,
438                                              o    407                                              offset, mSolid, divType );
439         break;                                    408         break;
440       case kZAxis:                                409       case kZAxis:
441         fparam = new G4ParameterisationTrdZ( a    410         fparam = new G4ParameterisationTrdZ( axis, nDivs, width,
442                                              o    411                                              offset, mSolid, divType );
443         break;                                    412         break;
444       default:                                    413       default:
445         ErrorInAxis( axis, mSolid );              414         ErrorInAxis( axis, mSolid );
446         break;                                    415         break;
447     }                                             416     }
448   }                                               417   }
449   else if( mSolidType == "G4Para" )               418   else if( mSolidType == "G4Para" )
450   {                                               419   { 
451     switch( axis )                                420     switch( axis )
452     {                                             421     {
453       case kXAxis:                                422       case kXAxis:
454         fparam = new G4ParameterisationParaX(     423         fparam = new G4ParameterisationParaX( axis, nDivs, width,
455                                              o    424                                              offset, mSolid, divType );
456         break;                                    425         break;
457       case kYAxis:                                426       case kYAxis:
458         fparam = new G4ParameterisationParaY(     427         fparam = new G4ParameterisationParaY( axis, nDivs, width,
459                                              o    428                                              offset, mSolid, divType );
460         break;                                    429         break;
461       case kZAxis:                                430       case kZAxis:
462         fparam = new G4ParameterisationParaZ(     431         fparam = new G4ParameterisationParaZ( axis, nDivs, width,
463                                              o    432                                              offset, mSolid, divType );
464         break;                                    433         break;
465       default:                                    434       default:
466         ErrorInAxis( axis, mSolid );              435         ErrorInAxis( axis, mSolid );
467         break;                                    436         break;
468     }                                             437     }
469   }                                               438   }
470 //  else if( mSolidType == "G4Trap" )             439 //  else if( mSolidType == "G4Trap" )
471 //  {                                             440 //  {
472 //  }                                             441 //  }
473 //  else if( mSolidType == "G4Polycone" )         442 //  else if( mSolidType == "G4Polycone" )
474 //  {                                             443 //  {
475 //    switch( axis )                              444 //    switch( axis )
476 //    {                                           445 //    {
477 //      case kRho:                                446 //      case kRho:
478 //        fparam = new G4ParameterisationPolyc    447 //        fparam = new G4ParameterisationPolyconeRho( axis, nDivs, width,
479 //                                                448 //                                                    offset, mSolid, divType );
480 //        break;                                  449 //        break;
481 //      case kPhi:                                450 //      case kPhi:
482 //        fparam = new G4ParameterisationPolyc    451 //        fparam = new G4ParameterisationPolyconePhi( axis, nDivs, width,
483 //                                                452 //                                                    offset, mSolid, divType );
484 //        break;                                  453 //        break;
485 //      case kZAxis:                              454 //      case kZAxis:
486 //        fparam = new G4ParameterisationPolyc    455 //        fparam = new G4ParameterisationPolyconeZ( axis, nDivs, width,
487 //                                                456 //                                                  offset, mSolid, divType );
488 //        break;                                  457 //        break;
489 //      default:                                  458 //      default:
490 //        ErrorInAxis( axis, mSolid );            459 //        ErrorInAxis( axis, mSolid );
491 //      break;                                    460 //      break;
492 //    }                                           461 //    }
493 //  }                                             462 //  }
494 //  else if( mSolidType == "G4Polyhedra" )        463 //  else if( mSolidType == "G4Polyhedra" )
495 //  {                                             464 //  {
496 //    switch( axis )                              465 //    switch( axis )
497 //    {                                           466 //    {
498 //      case kRho:                                467 //      case kRho:
499 //        fparam = new G4ParameterisationPolyh    468 //        fparam = new G4ParameterisationPolyhedraRho( axis, nDivs, width,
500 //                                                469 //                                                    offset, mSolid, divType );
501 //        break;                                  470 //        break;
502 //      case kPhi:                                471 //      case kPhi:
503 //        fparam = new G4ParameterisationPolyh    472 //        fparam = new G4ParameterisationPolyhedraPhi( axis, nDivs, width,
504 //                                                473 //                                                    offset, mSolid, divType );
505 //        break;                                  474 //        break;
506 //      case kZAxis:                              475 //      case kZAxis:
507 //        fparam = new G4ParameterisationPolyh    476 //        fparam = new G4ParameterisationPolyhedraZ( axis, nDivs, width,
508 //                                                477 //                                                  offset, mSolid, divType );
509 //        break;                                  478 //        break;
510 //      default:                                  479 //      default:
511 //        ErrorInAxis( axis, mSolid );            480 //        ErrorInAxis( axis, mSolid );
512 //      break;                                    481 //      break;
513 //    }                                           482 //    }
514 //  }                                             483 //  }
515   else                                            484   else
516   {                                               485   {
517     std::ostringstream message;                   486     std::ostringstream message;
518     message << "Solid type not supported: " <<    487     message << "Solid type not supported: " << mSolidType << "." << G4endl
519             << "Divisions for " << mSolidType     488             << "Divisions for " << mSolidType << " not implemented.";
520     G4Exception("G4ReplicatedSlice::SetParamet    489     G4Exception("G4ReplicatedSlice::SetParameterisation()", "GeomDiv0001",
521                 FatalException, message);         490                 FatalException, message);
522   }                                               491   }
523                                                   492 
524   fparam->SetHalfGap(half_gap);                   493   fparam->SetHalfGap(half_gap);
525 }                                                 494 }
526                                                   495 
527 //--------------------------------------------    496 //--------------------------------------------------------------------------
528 void G4ReplicatedSlice::ErrorInAxis( EAxis axi    497 void G4ReplicatedSlice::ErrorInAxis( EAxis axis, G4VSolid* solid )
529 {                                                 498 {
530   G4String error = "Trying to divide solid " +    499   G4String error = "Trying to divide solid " + solid->GetName()
531                  + " of type " + solid->GetEnt    500                  + " of type " + solid->GetEntityType() + " along axis ";
532   switch( axis )                                  501   switch( axis )
533   {                                               502   {
534     case kXAxis:                                  503     case kXAxis:
535       error += "X.";                              504       error += "X.";
536       break;                                      505       break;
537     case kYAxis:                                  506     case kYAxis:
538       error += "Y.";                              507       error += "Y.";
539       break;                                      508       break;
540     case kZAxis:                                  509     case kZAxis:
541       error += "Z.";                              510       error += "Z.";
542       break;                                      511       break;
543     case kRho:                                    512     case kRho:
544       error += "Rho.";                            513       error += "Rho.";
545       break;                                      514       break;
546     case kRadial3D:                               515     case kRadial3D:
547       error += "Radial3D.";                       516       error += "Radial3D.";
548       break;                                      517       break;
549     case kPhi:                                    518     case kPhi:
550       error += "Phi.";                            519       error += "Phi.";
551       break;                                      520       break;
552     default:                                      521     default:
553       break;                                      522       break;
554   }                                               523   }
555   G4Exception("G4ReplicatedSlice::ErrorInAxis(    524   G4Exception("G4ReplicatedSlice::ErrorInAxis()", "GeomDiv0002",
556               FatalException, error);             525               FatalException, error);
557 }                                                 526 }
558                                                   527 
559 // The next methods are for specialised repeat    528 // The next methods are for specialised repeated volumes 
560 // (replicas, parameterised vol.) which are co << 529 //     (replicas, parameterised vol.) which are completely regular.
561 // Currently this is not applicable to divisio    530 // Currently this is not applicable to divisions  ( J.A. Nov 2005 )
562                                                << 
563 // -------------------------------------------    531 // ----------------------------------------------------------------------
564 // IsRegularStructure()                        << 532 // IsRegularRepeatedStructure()
565 //                                                533 //
566 G4bool G4ReplicatedSlice::IsRegularStructure()    534 G4bool G4ReplicatedSlice::IsRegularStructure() const
567 {                                                 535 {
568   return false;                                   536   return false;
569 }                                                 537 }           
570                                                   538 
571 // -------------------------------------------    539 // ----------------------------------------------------------------------
572 // GetRegularStructureId()                     << 540 // IsRegularRepeatedStructure()
573 //                                                541 //
574 G4int G4ReplicatedSlice::GetRegularStructureId    542 G4int G4ReplicatedSlice::GetRegularStructureId() const
575 {                                                 543 {
576   return 0;                                       544   return 0;  
577 }                                                 545 }           
578                                                   546