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.7.p3)


  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                26 // G4ReplicatedSlice implementation
 27 //                                                 27 //
 28 // Author: M.Asai (SLAC), 20/04/2010 - Extende     28 // Author: M.Asai (SLAC), 20/04/2010 - Extended from G4PVDivision
 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   : G4PVReplica(pName, nDivs, pAxis, pLogical, pMotherLogical)
 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   : G4PVReplica(pName, nDivs, pAxis, pLogical, pMotherLogical)
 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   : G4PVReplica(pName, 0, pAxis, pLogical, pMotherLogical)
 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   : G4PVReplica(pName, nDivs, pAxis, pLogical,
 96                 pMotherPhysical != nullptr ? p <<  96                 pMotherPhysical ? pMotherPhysical->GetLogicalVolume() : nullptr)
 97 {                                                  97 {
 98   if (pMotherPhysical == nullptr)                  98   if (pMotherPhysical == nullptr)
 99   {                                                99   {
100     std::ostringstream message;                   100     std::ostringstream message;
101     message << "Invalid setup." << G4endl         101     message << "Invalid setup." << G4endl
102             << "NULL pointer specified as moth    102             << "NULL pointer specified as mother for volume: " << pName;
103     G4Exception("G4ReplicatedSlice::G4Replicat    103     G4Exception("G4ReplicatedSlice::G4ReplicatedSlice()", "GeomDiv0002",
104                 FatalException, message);         104                 FatalException, message);
105     return;                                       105     return;
106   }                                               106   }
107   CheckAndSetParameters(pAxis, nDivs, width, h    107   CheckAndSetParameters(pAxis, nDivs, width, half_gap, offset,
108       DivNDIVandWIDTH, pMotherPhysical->GetLog    108       DivNDIVandWIDTH, pMotherPhysical->GetLogicalVolume(), pLogical);
109 }                                                 109 }
110                                                   110 
111 //--------------------------------------------    111 //--------------------------------------------------------------------------
112 G4ReplicatedSlice::G4ReplicatedSlice(const G4S    112 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
113                                            G4L    113                                            G4LogicalVolume* pLogical,
114                                            G4V    114                                            G4VPhysicalVolume* pMotherPhysical,
115                                      const EAx    115                                      const EAxis pAxis,
116                                      const G4i    116                                      const G4int nDivs,
117                                      const G4d    117                                      const G4double half_gap,
118                                      const G4d    118                                      const G4double offset )
119   : G4PVReplica(pName, nDivs, pAxis, pLogical,    119   : G4PVReplica(pName, nDivs, pAxis, pLogical,
120                 pMotherPhysical != nullptr ? p << 120                 pMotherPhysical ? pMotherPhysical->GetLogicalVolume() : nullptr)
121 {                                                 121 {
122   if (pMotherPhysical == nullptr)                 122   if (pMotherPhysical == nullptr)
123   {                                               123   {
124     std::ostringstream message;                   124     std::ostringstream message;
125     message << "Invalid setup." << G4endl         125     message << "Invalid setup." << G4endl
126             << "NULL pointer specified as moth    126             << "NULL pointer specified as mother for volume: " << pName;
127     G4Exception("G4ReplicatedSlice::G4Replicat    127     G4Exception("G4ReplicatedSlice::G4ReplicatedSlice()", "GeomDiv0002",
128                 FatalException, message);         128                 FatalException, message);
129     return;                                       129     return;
130   }                                               130   }
131   CheckAndSetParameters(pAxis, nDivs, 0., half    131   CheckAndSetParameters(pAxis, nDivs, 0., half_gap, offset,
132       DivNDIV, pMotherPhysical->GetLogicalVolu    132       DivNDIV, pMotherPhysical->GetLogicalVolume(), pLogical);
133 }                                                 133 }
134                                                   134 
135 //--------------------------------------------    135 //--------------------------------------------------------------------------
136 G4ReplicatedSlice::G4ReplicatedSlice(const G4S    136 G4ReplicatedSlice::G4ReplicatedSlice(const G4String& pName,
137                                            G4L    137                                            G4LogicalVolume* pLogical,
138                                            G4V    138                                            G4VPhysicalVolume* pMotherPhysical,
139                                      const EAx    139                                      const EAxis pAxis,
140                                      const G4d    140                                      const G4double width,
141                                      const G4d    141                                      const G4double half_gap,
142                                      const G4d    142                                      const G4double offset )
143   : G4PVReplica(pName, 0, pAxis, pLogical,        143   : G4PVReplica(pName, 0, pAxis, pLogical,
144                 pMotherPhysical != nullptr ? p << 144                 pMotherPhysical ? pMotherPhysical->GetLogicalVolume() : nullptr)
145 {                                                 145 {
146   if (pMotherPhysical == nullptr)                 146   if (pMotherPhysical == nullptr)
147   {                                               147   {
148     std::ostringstream message;                   148     std::ostringstream message;
149     message << "Invalid setup." << G4endl         149     message << "Invalid setup." << G4endl
150             << "NULL pointer specified as moth    150             << "NULL pointer specified as mother for volume: " << pName;
151     G4Exception("G4ReplicatedSlice::G4Replicat    151     G4Exception("G4ReplicatedSlice::G4ReplicatedSlice()", "GeomDiv0002",
152                 FatalException, message);         152                 FatalException, message);
153     return;                                       153     return;
154   }                                               154   }
155   CheckAndSetParameters(pAxis, 0, width, half_    155   CheckAndSetParameters(pAxis, 0, width, half_gap, offset,
156       DivWIDTH, pMotherPhysical->GetLogicalVol    156       DivWIDTH, pMotherPhysical->GetLogicalVolume(), pLogical);
157 }                                                 157 }
158                                                   158 
159 //--------------------------------------------    159 //--------------------------------------------------------------------------
160 void                                              160 void
161 G4ReplicatedSlice::CheckAndSetParameters( cons    161 G4ReplicatedSlice::CheckAndSetParameters( const EAxis pAxis,
162                                           cons    162                                           const G4int nDivs,
163                                           cons    163                                           const G4double width,
164                                           cons    164                                           const G4double half_gap,
165                                           cons    165                                           const G4double offset, 
166                                                   166                                                 DivisionType divType,
167                                                   167                                                 G4LogicalVolume* pMotherLogical,
168                                           cons    168                                           const G4LogicalVolume* pLogical )
169 {                                                 169 {
170   if(pMotherLogical == nullptr)                   170   if(pMotherLogical == nullptr)
171   {                                               171   {
172     std::ostringstream message;                   172     std::ostringstream message;
173     message << "Invalid setup." << G4endl         173     message << "Invalid setup." << G4endl
174             << "NULL pointer specified as moth    174             << "NULL pointer specified as mother! Volume: " << GetName();
175     G4Exception("G4ReplicatedSlice::CheckAndSe    175     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
176                 FatalException, message);         176                 FatalException, message);
177   }                                               177   }
178   if(pLogical == pMotherLogical)                  178   if(pLogical == pMotherLogical)
179   {                                               179   {
180     std::ostringstream message;                   180     std::ostringstream message;
181     message << "Invalid setup." << G4endl         181     message << "Invalid setup." << G4endl
182             << "Cannot place a volume inside i    182             << "Cannot place a volume inside itself! Volume: " << GetName();
183     G4Exception("G4ReplicatedSlice::CheckAndSe    183     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
184                 FatalException, message);         184                 FatalException, message);
185   }                                               185   }
186                                                   186 
187   //----- Check that mother solid is of the sa    187   //----- Check that mother solid is of the same type as
188   //      daughter solid (otherwise, the corre    188   //      daughter solid (otherwise, the corresponding
189   //      Parameterisation::ComputeDimension()    189   //      Parameterisation::ComputeDimension() will not be called)
190   //                                              190   //
191   G4String msolType = pMotherLogical->GetSolid    191   G4String msolType = pMotherLogical->GetSolid()->GetEntityType();
192   G4String dsolType = pLogical->GetSolid()->Ge    192   G4String dsolType = pLogical->GetSolid()->GetEntityType();
193   if( msolType != dsolType && ( msolType != "G    193   if( msolType != dsolType && ( msolType != "G4Trd" || dsolType != "G4Trap" ) )
194   {                                               194   {
195     std::ostringstream message;                   195     std::ostringstream message;
196     message << "Invalid setup." << G4endl         196     message << "Invalid setup." << G4endl
197             << "Incorrect solid type for divis    197             << "Incorrect solid type for division of volume: "
198             << GetName() << G4endl                198             << GetName() << G4endl
199             << "    It is: " << msolType          199             << "    It is: " << msolType
200             << ", while it should be: " << dso    200             << ", while it should be: " << dsolType;
201     G4Exception("G4ReplicatedSlice::CheckAndSe    201     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()",
202                 "GeomDiv0002", FatalException,    202                 "GeomDiv0002", FatalException, message);
203   }                                               203   }
204                                                   204 
205   pMotherLogical->AddDaughter(this);              205   pMotherLogical->AddDaughter(this);
206   SetMotherLogical(pMotherLogical);               206   SetMotherLogical(pMotherLogical);
207   SetParameterisation(pMotherLogical, pAxis, n    207   SetParameterisation(pMotherLogical, pAxis, nDivs,
208                       width, half_gap, offset,    208                       width, half_gap, offset, divType);
209                                                   209 
210   if( divType == DivWIDTH )                       210   if( divType == DivWIDTH )
211   {                                               211   {
212     fnReplicas = fparam->GetNoDiv();              212     fnReplicas = fparam->GetNoDiv();
213   }                                               213   }
214   else                                            214   else
215   {                                               215   {
216     fnReplicas = nDivs;                           216     fnReplicas = nDivs;
217   }                                               217   }
218   if (fnReplicas < 1 )                            218   if (fnReplicas < 1 )
219   {                                               219   {
220     G4Exception("G4ReplicatedSlice::CheckAndSe    220     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
221                 FatalException, "Illegal numbe    221                 FatalException, "Illegal number of replicas!");
222   }                                               222   }
223   if( divType != DivNDIV)                         223   if( divType != DivNDIV)
224   {                                               224   {
225     fwidth = fparam->GetWidth();                  225     fwidth = fparam->GetWidth();
226   }                                               226   }
227   else                                            227   else
228   {                                               228   {
229     fwidth = width;                               229     fwidth = width;
230   }                                               230   }
231   if( fwidth < 0 )                                231   if( fwidth < 0 )
232   {                                               232   {
233     G4Exception("G4ReplicatedSlice::CheckAndSe    233     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
234                 FatalException, "Width must be    234                 FatalException, "Width must be positive!");
235   }                                               235   }
236   if( fwidth < 2.*half_gap )                      236   if( fwidth < 2.*half_gap )
237   {                                               237   {
238     G4Exception("G4ReplicatedSlice::CheckAndSe    238     G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
239                 FatalException, "Half_gap is t    239                 FatalException, "Half_gap is too large!");
240   }                                               240   }
241                                                   241   
242   foffset = offset;                               242   foffset = offset;
243   fdivAxis = pAxis;                               243   fdivAxis = pAxis;
244                                                   244 
245   //!!!!! axis has to be x/y/z in G4VoxelLimit    245   //!!!!! axis has to be x/y/z in G4VoxelLimits::GetMinExtent
246   //                                              246   //
247   if( pAxis == kRho || pAxis == kRadial3D || p    247   if( pAxis == kRho || pAxis == kRadial3D || pAxis == kPhi )
248   {                                               248   {
249     faxis = kZAxis;                               249     faxis = kZAxis;
250   }                                               250   }
251   else                                            251   else
252   {                                               252   {
253     faxis = pAxis;                                253     faxis = pAxis;
254   }                                               254   }
255                                                   255   
256   switch (faxis)                                  256   switch (faxis)
257   {                                               257   {
258     case kPhi:                                    258     case kPhi:
259     case kRho:                                    259     case kRho:
260     case kXAxis:                                  260     case kXAxis:
261     case kYAxis:                                  261     case kYAxis:
262     case kZAxis:                                  262     case kZAxis:
263       break;                                      263       break;
264     default:                                      264     default:
265       G4Exception("G4ReplicatedSlice::CheckAnd    265       G4Exception("G4ReplicatedSlice::CheckAndSetParameters()", "GeomDiv0002",
266                   FatalException, "Unknown axi    266                   FatalException, "Unknown axis of replication.");
267       break;                                      267       break;
268   }                                               268   }
269                                                   269 
270   // Create rotation matrix: for phi axis it w    270   // Create rotation matrix: for phi axis it will be changed
271   // in G4VPVParameterisation::ComputeTransfor    271   // in G4VPVParameterisation::ComputeTransformation, for others
272   // it will stay the unity                       272   // it will stay the unity
273   //                                              273   //
274   auto  pRMat = new G4RotationMatrix();        << 274   G4RotationMatrix* pRMat = new G4RotationMatrix();
275   SetRotation(pRMat);                             275   SetRotation(pRMat);
276 }                                                 276 }
277                                                   277 
278 //--------------------------------------------    278 //--------------------------------------------------------------------------
279 G4ReplicatedSlice::~G4ReplicatedSlice()           279 G4ReplicatedSlice::~G4ReplicatedSlice()
280 {                                                 280 {
281   delete GetRotation();                           281   delete GetRotation();
282 }                                                 282 }
283                                                   283 
284 //--------------------------------------------    284 //--------------------------------------------------------------------------
285 EAxis G4ReplicatedSlice::GetDivisionAxis() con    285 EAxis G4ReplicatedSlice::GetDivisionAxis() const
286 {                                                 286 {
287   return fdivAxis;                                287   return fdivAxis;
288 }                                                 288 }
289                                                   289 
290 //--------------------------------------------    290 //--------------------------------------------------------------------------
291 G4bool G4ReplicatedSlice::IsParameterised() co    291 G4bool G4ReplicatedSlice::IsParameterised() const
292 {                                                 292 { 
293   return true;                                    293   return true;
294 }                                                 294 }
295                                                   295 
296 //--------------------------------------------    296 //--------------------------------------------------------------------------
297 G4bool G4ReplicatedSlice::IsMany() const          297 G4bool G4ReplicatedSlice::IsMany() const
298 {                                                 298 {
299   return false;                                   299   return false; 
300 }                                                 300 }
301                                                   301 
302 //--------------------------------------------    302 //--------------------------------------------------------------------------
303 G4bool G4ReplicatedSlice::IsReplicated() const    303 G4bool G4ReplicatedSlice::IsReplicated() const
304 {                                                 304 {
305   return true;                                    305   return true;
306 }                                                 306 }
307                                                   307 
308 //--------------------------------------------    308 //--------------------------------------------------------------------------
309 G4int G4ReplicatedSlice::GetMultiplicity() con    309 G4int G4ReplicatedSlice::GetMultiplicity() const
310 {                                                 310 {
311   return fnReplicas;                              311   return fnReplicas;
312 }                                                 312 }
313                                                   313 
314 //--------------------------------------------    314 //--------------------------------------------------------------------------
315 G4VPVParameterisation* G4ReplicatedSlice::GetP    315 G4VPVParameterisation* G4ReplicatedSlice::GetParameterisation() const
316 {                                                 316 {
317   return fparam;                                  317   return fparam;
318 }                                                 318 }
319                                                   319 
320 //--------------------------------------------    320 //--------------------------------------------------------------------------
321 EVolume G4ReplicatedSlice::VolumeType() const     321 EVolume G4ReplicatedSlice::VolumeType() const 
322 {                                                 322 {
323   return kParameterised;                          323   return kParameterised;
324 }                                                 324 }
325                                                   325 
326 //--------------------------------------------    326 //--------------------------------------------------------------------------
327 void G4ReplicatedSlice::GetReplicationData(EAx    327 void G4ReplicatedSlice::GetReplicationData(EAxis& axis,
328                                            G4i    328                                            G4int& nDivs,
329                                            G4d    329                                            G4double& width,
330                                            G4d    330                                            G4double& offset,
331                                            G4b    331                                            G4bool& consuming ) const
332 {                                                 332 {
333   axis = faxis;                                   333   axis = faxis;
334   nDivs = fnReplicas;                             334   nDivs = fnReplicas;
335   width = fwidth;                                 335   width = fwidth;
336   offset = foffset;                               336   offset = foffset;
337   consuming = false;                              337   consuming = false;
338 }                                                 338 }
339                                                   339 
340                                                   340 
341 //--------------------------------------------    341 //--------------------------------------------------------------------------
342 void G4ReplicatedSlice::SetParameterisation( G    342 void G4ReplicatedSlice::SetParameterisation( G4LogicalVolume* motherLogical,
343                                        const E    343                                        const EAxis axis,
344                                        const G    344                                        const G4int nDivs,
345                                        const G    345                                        const G4double width,
346                                        const G    346                                        const G4double half_gap,
347                                        const G    347                                        const G4double offset,
348                                              D    348                                              DivisionType divType )
349 {                                                 349 {
350   G4VSolid* mSolid = motherLogical->GetSolid()    350   G4VSolid* mSolid = motherLogical->GetSolid();
351   G4String mSolidType = mSolid->GetEntityType(    351   G4String mSolidType = mSolid->GetEntityType();
352   fparam = nullptr;                               352   fparam = nullptr;
353                                                   353 
354   // If the solid is a reflected one, update t    354   // If the solid is a reflected one, update type to its
355   // real constituent solid.                      355   // real constituent solid.
356   //                                              356   // 
357   if (mSolidType == "G4ReflectedSolid")           357   if (mSolidType == "G4ReflectedSolid")
358   {                                               358   {
359       mSolidType = ((G4ReflectedSolid*)mSolid)    359       mSolidType = ((G4ReflectedSolid*)mSolid)->GetConstituentMovedSolid()
360                  ->GetEntityType();               360                  ->GetEntityType(); 
361   }                                               361   }    
362                                                   362 
363   // Parameterisation type depend of mother so    363   // Parameterisation type depend of mother solid type and axis of division
364   //                                              364   //
365   if( mSolidType == "G4Box" )                     365   if( mSolidType == "G4Box" )
366   {                                               366   {
367     switch( axis )                                367     switch( axis )
368     {                                             368     {
369       case kXAxis:                                369       case kXAxis:
370         fparam = new G4ParameterisationBoxX( a    370         fparam = new G4ParameterisationBoxX( axis, nDivs, width,
371                                              o    371                                              offset, mSolid, divType );
372         break;                                    372         break;
373       case kYAxis:                                373       case kYAxis:
374         fparam = new G4ParameterisationBoxY( a    374         fparam = new G4ParameterisationBoxY( axis, nDivs, width,
375                                              o    375                                              offset, mSolid, divType );
376         break;                                    376         break;
377       case kZAxis:                                377       case kZAxis:
378         fparam = new G4ParameterisationBoxZ( a    378         fparam = new G4ParameterisationBoxZ( axis, nDivs, width,
379                                              o    379                                              offset, mSolid, divType );
380         break;                                    380         break;
381       default:                                    381       default:
382         ErrorInAxis( axis, mSolid );              382         ErrorInAxis( axis, mSolid );
383         break;                                    383         break;
384     }                                             384     }
385   }                                               385   }
386   else if( mSolidType == "G4Tubs" )               386   else if( mSolidType == "G4Tubs" )
387   {                                               387   {
388     switch( axis )                                388     switch( axis )
389     {                                             389     {
390       case kRho:                                  390       case kRho:
391         fparam = new G4ParameterisationTubsRho    391         fparam = new G4ParameterisationTubsRho( axis, nDivs, width,
392                                                   392                                                 offset, mSolid, divType );
393         break;                                    393         break;
394       case kPhi:                                  394       case kPhi:
395         fparam = new G4ParameterisationTubsPhi    395         fparam = new G4ParameterisationTubsPhi( axis, nDivs, width,
396                                                   396                                                 offset, mSolid, divType );
397         break;                                    397         break;
398       case kZAxis:                                398       case kZAxis:
399         fparam = new G4ParameterisationTubsZ(     399         fparam = new G4ParameterisationTubsZ( axis, nDivs, width,
400                                                   400                                               offset, mSolid, divType );
401         break;                                    401         break;
402       default:                                    402       default:
403         ErrorInAxis( axis, mSolid );              403         ErrorInAxis( axis, mSolid );
404         break;                                    404         break;
405     }                                             405     }
406   }                                               406   }
407   else if( mSolidType == "G4Cons" )               407   else if( mSolidType == "G4Cons" )
408   {                                               408   {
409     switch( axis )                                409     switch( axis )
410     {                                             410     {
411       case kRho:                                  411       case kRho:
412         fparam = new G4ParameterisationConsRho    412         fparam = new G4ParameterisationConsRho( axis, nDivs, width,
413                                                   413                                                 offset, mSolid, divType );
414         break;                                    414         break;
415       case kPhi:                                  415       case kPhi:
416         fparam = new G4ParameterisationConsPhi    416         fparam = new G4ParameterisationConsPhi( axis, nDivs, width,
417                                                   417                                                 offset, mSolid, divType );
418         break;                                    418         break;
419       case kZAxis:                                419       case kZAxis:
420         fparam = new G4ParameterisationConsZ(     420         fparam = new G4ParameterisationConsZ( axis, nDivs, width,
421                                                   421                                               offset, mSolid, divType );
422         break;                                    422         break;
423       default:                                    423       default:
424         ErrorInAxis( axis, mSolid );              424         ErrorInAxis( axis, mSolid );
425         break;                                    425         break;
426     }                                             426     }
427   }                                               427   }
428   else if( mSolidType == "G4Trd" )                428   else if( mSolidType == "G4Trd" )
429   {                                               429   { 
430     switch( axis )                                430     switch( axis )
431     {                                             431     {
432       case kXAxis:                                432       case kXAxis:
433         fparam = new G4ParameterisationTrdX( a    433         fparam = new G4ParameterisationTrdX( axis, nDivs, width,
434                                              o    434                                              offset, mSolid, divType );
435         break;                                    435         break;
436       case kYAxis:                                436       case kYAxis:
437         fparam = new G4ParameterisationTrdY( a    437         fparam = new G4ParameterisationTrdY( axis, nDivs, width,
438                                              o    438                                              offset, mSolid, divType );
439         break;                                    439         break;
440       case kZAxis:                                440       case kZAxis:
441         fparam = new G4ParameterisationTrdZ( a    441         fparam = new G4ParameterisationTrdZ( axis, nDivs, width,
442                                              o    442                                              offset, mSolid, divType );
443         break;                                    443         break;
444       default:                                    444       default:
445         ErrorInAxis( axis, mSolid );              445         ErrorInAxis( axis, mSolid );
446         break;                                    446         break;
447     }                                             447     }
448   }                                               448   }
449   else if( mSolidType == "G4Para" )               449   else if( mSolidType == "G4Para" )
450   {                                               450   { 
451     switch( axis )                                451     switch( axis )
452     {                                             452     {
453       case kXAxis:                                453       case kXAxis:
454         fparam = new G4ParameterisationParaX(     454         fparam = new G4ParameterisationParaX( axis, nDivs, width,
455                                              o    455                                              offset, mSolid, divType );
456         break;                                    456         break;
457       case kYAxis:                                457       case kYAxis:
458         fparam = new G4ParameterisationParaY(     458         fparam = new G4ParameterisationParaY( axis, nDivs, width,
459                                              o    459                                              offset, mSolid, divType );
460         break;                                    460         break;
461       case kZAxis:                                461       case kZAxis:
462         fparam = new G4ParameterisationParaZ(     462         fparam = new G4ParameterisationParaZ( axis, nDivs, width,
463                                              o    463                                              offset, mSolid, divType );
464         break;                                    464         break;
465       default:                                    465       default:
466         ErrorInAxis( axis, mSolid );              466         ErrorInAxis( axis, mSolid );
467         break;                                    467         break;
468     }                                             468     }
469   }                                               469   }
470 //  else if( mSolidType == "G4Trap" )             470 //  else if( mSolidType == "G4Trap" )
471 //  {                                             471 //  {
472 //  }                                             472 //  }
473 //  else if( mSolidType == "G4Polycone" )         473 //  else if( mSolidType == "G4Polycone" )
474 //  {                                             474 //  {
475 //    switch( axis )                              475 //    switch( axis )
476 //    {                                           476 //    {
477 //      case kRho:                                477 //      case kRho:
478 //        fparam = new G4ParameterisationPolyc    478 //        fparam = new G4ParameterisationPolyconeRho( axis, nDivs, width,
479 //                                                479 //                                                    offset, mSolid, divType );
480 //        break;                                  480 //        break;
481 //      case kPhi:                                481 //      case kPhi:
482 //        fparam = new G4ParameterisationPolyc    482 //        fparam = new G4ParameterisationPolyconePhi( axis, nDivs, width,
483 //                                                483 //                                                    offset, mSolid, divType );
484 //        break;                                  484 //        break;
485 //      case kZAxis:                              485 //      case kZAxis:
486 //        fparam = new G4ParameterisationPolyc    486 //        fparam = new G4ParameterisationPolyconeZ( axis, nDivs, width,
487 //                                                487 //                                                  offset, mSolid, divType );
488 //        break;                                  488 //        break;
489 //      default:                                  489 //      default:
490 //        ErrorInAxis( axis, mSolid );            490 //        ErrorInAxis( axis, mSolid );
491 //      break;                                    491 //      break;
492 //    }                                           492 //    }
493 //  }                                             493 //  }
494 //  else if( mSolidType == "G4Polyhedra" )        494 //  else if( mSolidType == "G4Polyhedra" )
495 //  {                                             495 //  {
496 //    switch( axis )                              496 //    switch( axis )
497 //    {                                           497 //    {
498 //      case kRho:                                498 //      case kRho:
499 //        fparam = new G4ParameterisationPolyh    499 //        fparam = new G4ParameterisationPolyhedraRho( axis, nDivs, width,
500 //                                                500 //                                                    offset, mSolid, divType );
501 //        break;                                  501 //        break;
502 //      case kPhi:                                502 //      case kPhi:
503 //        fparam = new G4ParameterisationPolyh    503 //        fparam = new G4ParameterisationPolyhedraPhi( axis, nDivs, width,
504 //                                                504 //                                                    offset, mSolid, divType );
505 //        break;                                  505 //        break;
506 //      case kZAxis:                              506 //      case kZAxis:
507 //        fparam = new G4ParameterisationPolyh    507 //        fparam = new G4ParameterisationPolyhedraZ( axis, nDivs, width,
508 //                                                508 //                                                  offset, mSolid, divType );
509 //        break;                                  509 //        break;
510 //      default:                                  510 //      default:
511 //        ErrorInAxis( axis, mSolid );            511 //        ErrorInAxis( axis, mSolid );
512 //      break;                                    512 //      break;
513 //    }                                           513 //    }
514 //  }                                             514 //  }
515   else                                            515   else
516   {                                               516   {
517     std::ostringstream message;                   517     std::ostringstream message;
518     message << "Solid type not supported: " <<    518     message << "Solid type not supported: " << mSolidType << "." << G4endl
519             << "Divisions for " << mSolidType     519             << "Divisions for " << mSolidType << " not implemented.";
520     G4Exception("G4ReplicatedSlice::SetParamet    520     G4Exception("G4ReplicatedSlice::SetParameterisation()", "GeomDiv0001",
521                 FatalException, message);         521                 FatalException, message);
522   }                                               522   }
523                                                   523 
524   fparam->SetHalfGap(half_gap);                   524   fparam->SetHalfGap(half_gap);
525 }                                                 525 }
526                                                   526 
527 //--------------------------------------------    527 //--------------------------------------------------------------------------
528 void G4ReplicatedSlice::ErrorInAxis( EAxis axi    528 void G4ReplicatedSlice::ErrorInAxis( EAxis axis, G4VSolid* solid )
529 {                                                 529 {
530   G4String error = "Trying to divide solid " +    530   G4String error = "Trying to divide solid " + solid->GetName()
531                  + " of type " + solid->GetEnt    531                  + " of type " + solid->GetEntityType() + " along axis ";
532   switch( axis )                                  532   switch( axis )
533   {                                               533   {
534     case kXAxis:                                  534     case kXAxis:
535       error += "X.";                              535       error += "X.";
536       break;                                      536       break;
537     case kYAxis:                                  537     case kYAxis:
538       error += "Y.";                              538       error += "Y.";
539       break;                                      539       break;
540     case kZAxis:                                  540     case kZAxis:
541       error += "Z.";                              541       error += "Z.";
542       break;                                      542       break;
543     case kRho:                                    543     case kRho:
544       error += "Rho.";                            544       error += "Rho.";
545       break;                                      545       break;
546     case kRadial3D:                               546     case kRadial3D:
547       error += "Radial3D.";                       547       error += "Radial3D.";
548       break;                                      548       break;
549     case kPhi:                                    549     case kPhi:
550       error += "Phi.";                            550       error += "Phi.";
551       break;                                      551       break;
552     default:                                      552     default:
553       break;                                      553       break;
554   }                                               554   }
555   G4Exception("G4ReplicatedSlice::ErrorInAxis(    555   G4Exception("G4ReplicatedSlice::ErrorInAxis()", "GeomDiv0002",
556               FatalException, error);             556               FatalException, error);
557 }                                                 557 }
558                                                   558 
559 // The next methods are for specialised repeat    559 // The next methods are for specialised repeated volumes 
560 // (replicas, parameterised vol.) which are co    560 // (replicas, parameterised vol.) which are completely regular.
561 // Currently this is not applicable to divisio    561 // Currently this is not applicable to divisions  ( J.A. Nov 2005 )
562                                                   562 
563 // -------------------------------------------    563 // ----------------------------------------------------------------------
564 // IsRegularStructure()                           564 // IsRegularStructure()
565 //                                                565 //
566 G4bool G4ReplicatedSlice::IsRegularStructure()    566 G4bool G4ReplicatedSlice::IsRegularStructure() const
567 {                                                 567 {
568   return false;                                   568   return false;
569 }                                                 569 }           
570                                                   570 
571 // -------------------------------------------    571 // ----------------------------------------------------------------------
572 // GetRegularStructureId()                        572 // GetRegularStructureId()
573 //                                                573 //
574 G4int G4ReplicatedSlice::GetRegularStructureId    574 G4int G4ReplicatedSlice::GetRegularStructureId() const
575 {                                                 575 {
576   return 0;                                       576   return 0;  
577 }                                                 577 }           
578                                                   578