Geant4 Cross Reference |
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