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 // class G4VPhysicalVolume Implementation 26 // class G4VPhysicalVolume Implementation 27 // 27 // 28 // 15.01.13, G.Cosmo, A.Dotti: Modified for th 28 // 15.01.13, G.Cosmo, A.Dotti: Modified for thread-safety for MT 29 // 28.08.96, P.Kent: Replaced transform by rot 29 // 28.08.96, P.Kent: Replaced transform by rotmat + vector 30 // 25.07.96, P.Kent: Modified interface for ne 30 // 25.07.96, P.Kent: Modified interface for new `Replica' capable geometry 31 // 24.07.95, P.Kent: First non-stub version 31 // 24.07.95, P.Kent: First non-stub version 32 // ------------------------------------------- 32 // -------------------------------------------------------------------- 33 33 34 #include "G4VPhysicalVolume.hh" 34 #include "G4VPhysicalVolume.hh" 35 35 36 #include "G4PhysicalVolumeStore.hh" 36 #include "G4PhysicalVolumeStore.hh" 37 #include "G4LogicalVolume.hh" 37 #include "G4LogicalVolume.hh" 38 38 39 // This new field helps to use the class G4PVM 39 // This new field helps to use the class G4PVManager 40 // 40 // 41 G4PVManager G4VPhysicalVolume::subInstanceMana 41 G4PVManager G4VPhysicalVolume::subInstanceManager; 42 42 43 // These macros change the references to field 43 // These macros change the references to fields that are now encapsulated 44 // in the class G4PVData. 44 // in the class G4PVData. 45 // 45 // 46 #define G4MT_rot ((subInstanceManager.offset[i 46 #define G4MT_rot ((subInstanceManager.offset[instanceID]).frot) 47 #define G4MT_tx ((subInstanceManager.offset[in 47 #define G4MT_tx ((subInstanceManager.offset[instanceID]).tx) 48 #define G4MT_ty ((subInstanceManager.offset[in 48 #define G4MT_ty ((subInstanceManager.offset[instanceID]).ty) 49 #define G4MT_tz ((subInstanceManager.offset[in 49 #define G4MT_tz ((subInstanceManager.offset[instanceID]).tz) 50 #define G4MT_pvdata (subInstanceManager.offset 50 #define G4MT_pvdata (subInstanceManager.offset[instanceID]) 51 51 52 // Constructor: init parameters and register i 52 // Constructor: init parameters and register in Store 53 // 53 // 54 G4VPhysicalVolume::G4VPhysicalVolume( G4Rotati 54 G4VPhysicalVolume::G4VPhysicalVolume( G4RotationMatrix* pRot, 55 const G4ThreeV 55 const G4ThreeVector& tlate, 56 const G4String 56 const G4String& pName, 57 G4Logica 57 G4LogicalVolume* pLogical, 58 G4VPhysi 58 G4VPhysicalVolume* ) 59 : flogical(pLogical), fname(pName) 59 : flogical(pLogical), fname(pName) 60 { 60 { 61 instanceID = subInstanceManager.CreateSubIns 61 instanceID = subInstanceManager.CreateSubInstance(); 62 62 63 this->SetRotation( pRot ); // G4MT_rot 63 this->SetRotation( pRot ); // G4MT_rot = pRot; 64 this->SetTranslation( tlate ); // G4MT_tra 64 this->SetTranslation( tlate ); // G4MT_trans = tlate; 65 65 66 // Initialize 'Shadow' data structure - for 66 // Initialize 'Shadow' data structure - for use by object persistency 67 pvdata = new G4PVData(); 67 pvdata = new G4PVData(); 68 pvdata->frot = pRot; 68 pvdata->frot = pRot; 69 pvdata->tx = tlate.x(); 69 pvdata->tx = tlate.x(); 70 pvdata->ty = tlate.y(); 70 pvdata->ty = tlate.y(); 71 pvdata->tz = tlate.z(); 71 pvdata->tz = tlate.z(); 72 72 73 G4PhysicalVolumeStore::Register(this); 73 G4PhysicalVolumeStore::Register(this); 74 } 74 } 75 75 76 // Fake default constructor - sets only member 76 // Fake default constructor - sets only member data and allocates memory 77 // for usage restri 77 // for usage restricted to object persistency. 78 // 78 // 79 G4VPhysicalVolume::G4VPhysicalVolume( __void__ 79 G4VPhysicalVolume::G4VPhysicalVolume( __void__& ) 80 : fname("") 80 : fname("") 81 { 81 { 82 // Register to store 82 // Register to store 83 // 83 // 84 instanceID = subInstanceManager.CreateSubIns 84 instanceID = subInstanceManager.CreateSubInstance(); 85 85 86 G4PhysicalVolumeStore::Register(this); 86 G4PhysicalVolumeStore::Register(this); 87 } 87 } 88 88 89 // Destructor - remove from Store 89 // Destructor - remove from Store 90 // 90 // 91 G4VPhysicalVolume::~G4VPhysicalVolume() 91 G4VPhysicalVolume::~G4VPhysicalVolume() 92 { 92 { 93 delete pvdata; 93 delete pvdata; 94 G4PhysicalVolumeStore::DeRegister(this); 94 G4PhysicalVolumeStore::DeRegister(this); 95 } 95 } 96 96 97 // Set volume name and notify store of the cha 97 // Set volume name and notify store of the change 98 // 98 // 99 void G4VPhysicalVolume::SetName(const G4String 99 void G4VPhysicalVolume::SetName(const G4String& pName) 100 { 100 { 101 fname = pName; 101 fname = pName; 102 G4PhysicalVolumeStore::GetInstance()->SetMap 102 G4PhysicalVolumeStore::GetInstance()->SetMapValid(false); 103 } 103 } 104 104 105 // This method is similar to the constructor. 105 // This method is similar to the constructor. It is used by each worker 106 // thread to achieve the same effect as that o 106 // thread to achieve the same effect as that of the master thread exept 107 // to register the new created instance. This 107 // to register the new created instance. This method is invoked explicitly. 108 // It does not create a new G4VPhysicalVolume 108 // It does not create a new G4VPhysicalVolume instance. 109 // It only assign the value for the fields enc 109 // It only assign the value for the fields encapsulated by the class G4PVData. 110 // 110 // 111 void G4VPhysicalVolume:: 111 void G4VPhysicalVolume:: 112 InitialiseWorker( G4VPhysicalVolume* /*pMaster 112 InitialiseWorker( G4VPhysicalVolume* /*pMasterObject*/, 113 G4RotationMatrix *pRot, 113 G4RotationMatrix *pRot, 114 const G4ThreeVector &tlate) 114 const G4ThreeVector &tlate) 115 { 115 { 116 subInstanceManager.SlaveCopySubInstanceArray 116 subInstanceManager.SlaveCopySubInstanceArray(); 117 117 118 this->SetRotation( pRot ); // G4MT_rot 118 this->SetRotation( pRot ); // G4MT_rot = pRot; 119 this->SetTranslation( tlate ); // G4MT_tran 119 this->SetTranslation( tlate ); // G4MT_trans = tlate; 120 // G4PhysicalVolumeStore::Register(this); 120 // G4PhysicalVolumeStore::Register(this); 121 } 121 } 122 122 123 // Release memory allocated for offset 123 // Release memory allocated for offset 124 // 124 // 125 void G4VPhysicalVolume::Clean() 125 void G4VPhysicalVolume::Clean() 126 { 126 { 127 subInstanceManager.FreeSlave(); 127 subInstanceManager.FreeSlave(); 128 } 128 } 129 129 130 // This method is similar to the destructor. I 130 // This method is similar to the destructor. It is used by each worker 131 // thread to achieve the partial effect as tha 131 // thread to achieve the partial effect as that of the master thread. 132 // For G4VPhysicalVolume instances, nothing mo 132 // For G4VPhysicalVolume instances, nothing more to do here. 133 // 133 // 134 void G4VPhysicalVolume::TerminateWorker( G4VPh 134 void G4VPhysicalVolume::TerminateWorker( G4VPhysicalVolume* /*pMasterObject*/) 135 { 135 { 136 } 136 } 137 137 138 // Returns the private data instance manager. 138 // Returns the private data instance manager. 139 // 139 // 140 const G4PVManager& G4VPhysicalVolume::GetSubIn 140 const G4PVManager& G4VPhysicalVolume::GetSubInstanceManager() 141 { 141 { 142 return subInstanceManager; 142 return subInstanceManager; 143 } 143 } 144 144 145 G4int G4VPhysicalVolume::GetMultiplicity() con 145 G4int G4VPhysicalVolume::GetMultiplicity() const 146 { 146 { 147 return 1; 147 return 1; 148 } 148 } 149 149 150 const G4ThreeVector G4VPhysicalVolume::GetTran 150 const G4ThreeVector G4VPhysicalVolume::GetTranslation() const 151 { 151 { 152 return G4ThreeVector(G4MT_tx, G4MT_ty, G4MT_ 152 return G4ThreeVector(G4MT_tx, G4MT_ty, G4MT_tz); 153 } 153 } 154 154 155 void G4VPhysicalVolume::SetTranslation(const G 155 void G4VPhysicalVolume::SetTranslation(const G4ThreeVector &vec) 156 { 156 { 157 G4MT_tx=vec.x(); G4MT_ty=vec.y(); G4MT_tz=ve 157 G4MT_tx=vec.x(); G4MT_ty=vec.y(); G4MT_tz=vec.z(); 158 } 158 } 159 159 160 const G4RotationMatrix* G4VPhysicalVolume::Get 160 const G4RotationMatrix* G4VPhysicalVolume::GetRotation() const 161 { 161 { 162 return G4MT_rot; 162 return G4MT_rot; 163 } 163 } 164 164 165 G4RotationMatrix* G4VPhysicalVolume::GetRotati 165 G4RotationMatrix* G4VPhysicalVolume::GetRotation() 166 { 166 { 167 return G4MT_rot; 167 return G4MT_rot; 168 } 168 } 169 169 170 void G4VPhysicalVolume::SetRotation(G4Rotation 170 void G4VPhysicalVolume::SetRotation(G4RotationMatrix *pRot) 171 { 171 { 172 G4MT_rot = pRot; 172 G4MT_rot = pRot; 173 } 173 } 174 174 175 G4RotationMatrix* G4VPhysicalVolume::GetObject 175 G4RotationMatrix* G4VPhysicalVolume::GetObjectRotation() const 176 { 176 { 177 static G4RotationMatrix aRotM; 177 static G4RotationMatrix aRotM; 178 static G4RotationMatrix IdentityRM; 178 static G4RotationMatrix IdentityRM; 179 179 180 G4RotationMatrix* retval = &IdentityRM; 180 G4RotationMatrix* retval = &IdentityRM; 181 181 182 // Insure against frot being a null pointer 182 // Insure against frot being a null pointer 183 if(this->GetRotation() != nullptr) << 183 if(this->GetRotation()) 184 { 184 { 185 aRotM = GetRotation()->inverse(); 185 aRotM = GetRotation()->inverse(); 186 retval= &aRotM; 186 retval= &aRotM; 187 } 187 } 188 return retval; 188 return retval; 189 } 189 } 190 190 191 G4RotationMatrix G4VPhysicalVolume::GetObjectR 191 G4RotationMatrix G4VPhysicalVolume::GetObjectRotationValue() const 192 { 192 { 193 G4RotationMatrix aRotM; // Initialised to 193 G4RotationMatrix aRotM; // Initialised to identity 194 194 195 // Insure against G4MT_rot being a null poin 195 // Insure against G4MT_rot being a null pointer 196 if(G4MT_rot) 196 if(G4MT_rot) 197 { 197 { 198 aRotM = G4MT_rot->inverse(); 198 aRotM = G4MT_rot->inverse(); 199 } 199 } 200 return aRotM; 200 return aRotM; 201 } 201 } 202 202 203 G4ThreeVector G4VPhysicalVolume::GetObjectTra 203 G4ThreeVector G4VPhysicalVolume::GetObjectTranslation() const 204 { 204 { 205 return {G4MT_tx, G4MT_ty, G4MT_tz}; << 205 return G4ThreeVector(G4MT_tx, G4MT_ty, G4MT_tz); 206 } 206 } 207 207 208 const G4RotationMatrix* G4VPhysicalVolume::Get 208 const G4RotationMatrix* G4VPhysicalVolume::GetFrameRotation() const 209 { 209 { 210 return G4MT_rot; 210 return G4MT_rot; 211 } 211 } 212 212 213 G4ThreeVector G4VPhysicalVolume::GetFrameTran 213 G4ThreeVector G4VPhysicalVolume::GetFrameTranslation() const 214 { 214 { 215 return -G4ThreeVector(G4MT_tx, G4MT_ty, G4MT 215 return -G4ThreeVector(G4MT_tx, G4MT_ty, G4MT_tz); 216 } 216 } 217 217 218 // Only implemented for placed and parameteris 218 // Only implemented for placed and parameterised volumes. 219 // Not required for replicas. 219 // Not required for replicas. 220 // 220 // 221 G4bool G4VPhysicalVolume::CheckOverlaps(G4int, 221 G4bool G4VPhysicalVolume::CheckOverlaps(G4int, G4double, G4bool, G4int) 222 { 222 { 223 return false; 223 return false; 224 } 224 } 225 225