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 // G4tgrVolume implementation 26 // G4tgrVolume implementation 27 // 27 // 28 // Author: P.Arce, CIEMAT (November 2007) 28 // Author: P.Arce, CIEMAT (November 2007) 29 // ------------------------------------------- 29 // -------------------------------------------------------------------- 30 30 31 #include "G4tgrVolume.hh" 31 #include "G4tgrVolume.hh" 32 #include "G4tgrUtils.hh" 32 #include "G4tgrUtils.hh" 33 #include "G4tgrSolid.hh" 33 #include "G4tgrSolid.hh" 34 #include "G4tgrVolumeMgr.hh" 34 #include "G4tgrVolumeMgr.hh" 35 #include "G4tgrPlace.hh" 35 #include "G4tgrPlace.hh" 36 #include "G4tgrPlaceSimple.hh" 36 #include "G4tgrPlaceSimple.hh" 37 #include "G4tgrPlaceDivRep.hh" 37 #include "G4tgrPlaceDivRep.hh" 38 #include "G4tgrPlaceParameterisation.hh" 38 #include "G4tgrPlaceParameterisation.hh" 39 #include "G4tgrFileReader.hh" 39 #include "G4tgrFileReader.hh" 40 #include "G4tgrMessenger.hh" 40 #include "G4tgrMessenger.hh" 41 #include "G4UIcommand.hh" 41 #include "G4UIcommand.hh" 42 42 43 // ------------------------------------------- 43 // -------------------------------------------------------------------- 44 G4tgrVolume::G4tgrVolume() 44 G4tgrVolume::G4tgrVolume() 45 { 45 { 46 } 46 } 47 47 48 // ------------------------------------------- 48 // -------------------------------------------------------------------- 49 G4tgrVolume::~G4tgrVolume() 49 G4tgrVolume::~G4tgrVolume() 50 { 50 { 51 delete[] theRGBColour; 51 delete[] theRGBColour; 52 } 52 } 53 53 54 // ------------------------------------------- 54 // -------------------------------------------------------------------- 55 G4tgrVolume::G4tgrVolume(const std::vector<G4S 55 G4tgrVolume::G4tgrVolume(const std::vector<G4String>& wl) 56 { 56 { 57 theType = "VOLSimple"; 57 theType = "VOLSimple"; 58 58 59 //---------- set name 59 //---------- set name 60 theName = G4tgrUtils::GetString(wl[1]); 60 theName = G4tgrUtils::GetString(wl[1]); 61 61 62 theVisibility = true; 62 theVisibility = true; 63 theRGBColour = new G4double[4]; 63 theRGBColour = new G4double[4]; 64 for(std::size_t ii = 0; ii < 4; ++ii) 64 for(std::size_t ii = 0; ii < 4; ++ii) 65 { 65 { 66 theRGBColour[ii] = -1.; 66 theRGBColour[ii] = -1.; 67 } 67 } 68 theCheckOverlaps = false; 68 theCheckOverlaps = false; 69 69 70 if(wl.size() != 4) 70 if(wl.size() != 4) 71 { 71 { 72 //:VOLU tag to build a volume creating sol 72 //:VOLU tag to build a volume creating solid and material 73 //---------- set material name 73 //---------- set material name 74 theMaterialName = G4tgrUtils::GetString(wl 74 theMaterialName = G4tgrUtils::GetString(wl[wl.size() - 1]); 75 75 76 //---------- create only vector<double> of 76 //---------- create only vector<double> of theSolidParams 77 theSolid = G4tgrVolumeMgr::GetInstance()-> 77 theSolid = G4tgrVolumeMgr::GetInstance()->CreateSolid(wl, 1); 78 78 79 #ifdef G4VERBOSE 79 #ifdef G4VERBOSE 80 if(G4tgrMessenger::GetVerboseLevel() >= 1) 80 if(G4tgrMessenger::GetVerboseLevel() >= 1) 81 { 81 { 82 G4cout << "Created from new solid: " << 82 G4cout << "Created from new solid: " << *this << G4endl; 83 } 83 } 84 #endif 84 #endif 85 } 85 } 86 else 86 else 87 { 87 { 88 //:VOLU tag to build a volume assigning ma 88 //:VOLU tag to build a volume assigning material to solid 89 //---------- set material name 89 //---------- set material name 90 theMaterialName = G4tgrUtils::GetString(wl 90 theMaterialName = G4tgrUtils::GetString(wl[3]); 91 theSolid = G4tgrVolumeMgr::GetInsta 91 theSolid = G4tgrVolumeMgr::GetInstance()->FindSolid(wl[2], true); 92 92 93 #ifdef G4VERBOSE 93 #ifdef G4VERBOSE 94 if(G4tgrMessenger::GetVerboseLevel() >= 1) 94 if(G4tgrMessenger::GetVerboseLevel() >= 1) 95 { 95 { 96 G4cout << "Created from existing solid: 96 G4cout << "Created from existing solid: " << *this << G4endl; 97 } 97 } 98 #endif 98 #endif 99 } 99 } 100 } 100 } 101 101 102 // ------------------------------------------- 102 // -------------------------------------------------------------------- 103 G4tgrVolume::G4tgrVolume(const G4tgrVolume& vo 103 G4tgrVolume::G4tgrVolume(const G4tgrVolume& vol) 104 { 104 { 105 theName = vol.GetName(); 105 theName = vol.GetName(); 106 theType = vol.GetType(); 106 theType = vol.GetType(); 107 theMaterialName = vol.GetMaterialName(); 107 theMaterialName = vol.GetMaterialName(); 108 theSolid = vol.GetSolid(); 108 theSolid = vol.GetSolid(); 109 thePlacements = vol.GetPlacements(); 109 thePlacements = vol.GetPlacements(); 110 theVisibility = vol.GetVisibility(); 110 theVisibility = vol.GetVisibility(); 111 theRGBColour = vol.GetRGBColour(); 111 theRGBColour = vol.GetRGBColour(); 112 theCheckOverlaps = vol.GetCheckOverlaps(); 112 theCheckOverlaps = vol.GetCheckOverlaps(); 113 } 113 } 114 114 115 // ------------------------------------------- 115 // -------------------------------------------------------------------- 116 G4tgrVolume* G4tgrVolume::GetVolume(G4int ii) 116 G4tgrVolume* G4tgrVolume::GetVolume(G4int ii) const 117 { 117 { 118 G4String ErrMessage = "Should only be called 118 G4String ErrMessage = "Should only be called for composite solids... " + 119 G4UIcommand::ConvertTo 119 G4UIcommand::ConvertToString(ii); 120 G4Exception("G4tgrVolume::GetVolume()", "Inv 120 G4Exception("G4tgrVolume::GetVolume()", "InvalidCall", FatalException, 121 ErrMessage); 121 ErrMessage); 122 return nullptr; 122 return nullptr; 123 } 123 } 124 124 125 // ------------------------------------------- 125 // -------------------------------------------------------------------- 126 G4tgrPlace* G4tgrVolume::AddPlace(const std::v 126 G4tgrPlace* G4tgrVolume::AddPlace(const std::vector<G4String>& wl) 127 { 127 { 128 //---------- Check for exact number of words 128 //---------- Check for exact number of words read 129 G4tgrUtils::CheckWLsize(wl, 8, WLSIZE_EQ, " 129 G4tgrUtils::CheckWLsize(wl, 8, WLSIZE_EQ, " G4tgrVolume::AddPlace"); 130 //---------- set G4tgrPlace 130 //---------- set G4tgrPlace 131 G4tgrPlaceSimple* pl = new G4tgrPlaceSimple( 131 G4tgrPlaceSimple* pl = new G4tgrPlaceSimple(wl); 132 //---------- check that there is no previous 132 //---------- check that there is no previous placement in 133 // the same parent with the same c 133 // the same parent with the same copyNo 134 for(auto ite = thePlacements.cbegin(); ite ! 134 for(auto ite = thePlacements.cbegin(); ite != thePlacements.cend(); ++ite) 135 { 135 { 136 if(((*ite)->GetCopyNo() == pl->GetCopyNo() 136 if(((*ite)->GetCopyNo() == pl->GetCopyNo()) && 137 ((*ite)->GetParentName() == pl->GetPare 137 ((*ite)->GetParentName() == pl->GetParentName())) 138 { 138 { 139 G4String ErrMessage = 139 G4String ErrMessage = 140 "Repeated placement. Volume " + theNam 140 "Repeated placement. Volume " + theName + " in " + pl->GetParentName(); 141 G4Exception("G4tgrVolume::AddPlace()", " 141 G4Exception("G4tgrVolume::AddPlace()", "InvalidArgument", 142 FatalErrorInArgument, ErrMes 142 FatalErrorInArgument, ErrMessage); 143 } 143 } 144 } 144 } 145 145 146 pl->SetVolume(this); 146 pl->SetVolume(this); 147 thePlacements.push_back(pl); 147 thePlacements.push_back(pl); 148 148 149 #ifdef G4VERBOSE 149 #ifdef G4VERBOSE 150 if(G4tgrMessenger::GetVerboseLevel() >= 2) 150 if(G4tgrMessenger::GetVerboseLevel() >= 2) 151 { 151 { 152 G4cout << " G4tgrVolume: New placement: " 152 G4cout << " G4tgrVolume: New placement: " << thePlacements.size() 153 << " added for Volume " << theName 153 << " added for Volume " << theName << " inside " 154 << pl->GetParentName() << " type " 154 << pl->GetParentName() << " type " << pl->GetType() << G4endl; 155 } 155 } 156 #endif 156 #endif 157 //---------- register parent - child 157 //---------- register parent - child 158 G4tgrVolumeMgr::GetInstance()->RegisterParen 158 G4tgrVolumeMgr::GetInstance()->RegisterParentChild(pl->GetParentName(), pl); 159 159 160 return pl; 160 return pl; 161 } 161 } 162 162 163 // ------------------------------------------- 163 // -------------------------------------------------------------------- 164 G4tgrPlaceDivRep* G4tgrVolume::AddPlaceReplica 164 G4tgrPlaceDivRep* G4tgrVolume::AddPlaceReplica(const std::vector<G4String>& wl) 165 { 165 { 166 //---------- Check for exact number of words 166 //---------- Check for exact number of words read 167 G4tgrUtils::CheckWLsize(wl, 6, WLSIZE_GE, " 167 G4tgrUtils::CheckWLsize(wl, 6, WLSIZE_GE, " G4tgrVolume::AddPlaceReplica"); 168 G4tgrUtils::CheckWLsize(wl, 7, WLSIZE_LE, " 168 G4tgrUtils::CheckWLsize(wl, 7, WLSIZE_LE, " G4tgrVolume::AddPlaceReplica"); 169 169 170 if((wl.size() == 7) && (G4tgrUtils::GetDoubl 170 if((wl.size() == 7) && (G4tgrUtils::GetDouble(wl[6]) != 0.) && 171 (wl[3] != "PHI")) 171 (wl[3] != "PHI")) 172 { 172 { 173 G4Exception("G4tgrVolume::AddPlaceReplica" 173 G4Exception("G4tgrVolume::AddPlaceReplica", 174 "Offset set for replica not al 174 "Offset set for replica not along PHI, it will not be used", 175 JustWarning, 175 JustWarning, 176 G4String("Volume " + wl[1] + " 176 G4String("Volume " + wl[1] + " in volume " + wl[2]).c_str()); 177 } 177 } 178 178 179 //---------- set G4tgrPlace 179 //---------- set G4tgrPlace 180 G4tgrPlaceDivRep* pl = new G4tgrPlaceDivRep( 180 G4tgrPlaceDivRep* pl = new G4tgrPlaceDivRep(wl); 181 pl->SetType("PlaceReplica"); 181 pl->SetType("PlaceReplica"); 182 pl->SetVolume(this); 182 pl->SetVolume(this); 183 thePlacements.push_back(pl); 183 thePlacements.push_back(pl); 184 184 185 #ifdef G4VERBOSE 185 #ifdef G4VERBOSE 186 if(G4tgrMessenger::GetVerboseLevel() >= 2) 186 if(G4tgrMessenger::GetVerboseLevel() >= 2) 187 { 187 { 188 G4cout << " G4tgrVolume: New placement re 188 G4cout << " G4tgrVolume: New placement replica: " << thePlacements.size() 189 << " added for Volume " << theName 189 << " added for Volume " << theName << " inside " 190 << pl->GetParentName() << G4endl; 190 << pl->GetParentName() << G4endl; 191 } 191 } 192 #endif 192 #endif 193 //---------- register parent - child 193 //---------- register parent - child 194 G4tgrVolumeMgr::GetInstance()->RegisterParen 194 G4tgrVolumeMgr::GetInstance()->RegisterParentChild(pl->GetParentName(), pl); 195 195 196 return pl; 196 return pl; 197 } 197 } 198 198 199 // ------------------------------------------- 199 // -------------------------------------------------------------------- 200 G4tgrPlaceParameterisation* 200 G4tgrPlaceParameterisation* 201 G4tgrVolume::AddPlaceParam(const std::vector<G 201 G4tgrVolume::AddPlaceParam(const std::vector<G4String>& wl) 202 { 202 { 203 //---------- set G4tgrPlaceParameterisation 203 //---------- set G4tgrPlaceParameterisation 204 G4tgrPlaceParameterisation* pl = new G4tgrPl 204 G4tgrPlaceParameterisation* pl = new G4tgrPlaceParameterisation(wl); 205 205 206 pl->SetVolume(this); 206 pl->SetVolume(this); 207 thePlacements.push_back(pl); 207 thePlacements.push_back(pl); 208 208 209 #ifdef G4VERBOSE 209 #ifdef G4VERBOSE 210 if(G4tgrMessenger::GetVerboseLevel() >= 2) 210 if(G4tgrMessenger::GetVerboseLevel() >= 2) 211 { 211 { 212 G4cout << " G4tgrVolume: New placement Pa 212 G4cout << " G4tgrVolume: New placement Param: " << thePlacements.size() 213 << " added for Volume " << theName 213 << " added for Volume " << theName << " inside " 214 << pl->GetParentName() << G4endl; 214 << pl->GetParentName() << G4endl; 215 } 215 } 216 #endif 216 #endif 217 //---------- register parent - child 217 //---------- register parent - child 218 G4tgrVolumeMgr::GetInstance()->RegisterParen 218 G4tgrVolumeMgr::GetInstance()->RegisterParentChild(pl->GetParentName(), pl); 219 219 220 return pl; 220 return pl; 221 } 221 } 222 222 223 // ------------------------------------------- 223 // -------------------------------------------------------------------- 224 void G4tgrVolume::AddVisibility(const std::vec 224 void G4tgrVolume::AddVisibility(const std::vector<G4String>& wl) 225 { 225 { 226 //---------- Check for exact number of words 226 //---------- Check for exact number of words read 227 G4tgrUtils::CheckWLsize(wl, 3, WLSIZE_EQ, " 227 G4tgrUtils::CheckWLsize(wl, 3, WLSIZE_EQ, " G4tgrVolume::AddVisibility"); 228 228 229 //---------- Set visibility 229 //---------- Set visibility 230 theVisibility = G4tgrUtils::GetBool(wl[2]); 230 theVisibility = G4tgrUtils::GetBool(wl[2]); 231 } 231 } 232 232 233 // ------------------------------------------- 233 // -------------------------------------------------------------------- 234 void G4tgrVolume::AddRGBColour(const std::vect 234 void G4tgrVolume::AddRGBColour(const std::vector<G4String>& wl) 235 { 235 { 236 //---------- Check for exact number of words 236 //---------- Check for exact number of words read 237 G4tgrUtils::CheckWLsize(wl, 5, WLSIZE_GE, " 237 G4tgrUtils::CheckWLsize(wl, 5, WLSIZE_GE, " G4tgrVolume::AddRGBColour"); 238 238 239 //---------- Set RGB colour 239 //---------- Set RGB colour 240 theRGBColour[0] = G4tgrUtils::GetDouble(wl[2 240 theRGBColour[0] = G4tgrUtils::GetDouble(wl[2]); 241 theRGBColour[1] = G4tgrUtils::GetDouble(wl[3 241 theRGBColour[1] = G4tgrUtils::GetDouble(wl[3]); 242 theRGBColour[2] = G4tgrUtils::GetDouble(wl[4 242 theRGBColour[2] = G4tgrUtils::GetDouble(wl[4]); 243 ///--------- Set transparency 243 ///--------- Set transparency 244 if(wl.size() == 6) 244 if(wl.size() == 6) 245 { 245 { 246 theRGBColour[3] = G4tgrUtils::GetDouble(wl 246 theRGBColour[3] = G4tgrUtils::GetDouble(wl[5]); 247 } 247 } 248 } 248 } 249 249 250 // ------------------------------------------- 250 // -------------------------------------------------------------------- 251 void G4tgrVolume::AddCheckOverlaps(const std:: 251 void G4tgrVolume::AddCheckOverlaps(const std::vector<G4String>& wl) 252 { 252 { 253 //---------- Check for exact number of words 253 //---------- Check for exact number of words read 254 G4tgrUtils::CheckWLsize(wl, 3, WLSIZE_GE, " 254 G4tgrUtils::CheckWLsize(wl, 3, WLSIZE_GE, " G4tgrVolume::AddCheckOverlaps"); 255 255 256 ///--------- Set check overlaps 256 ///--------- Set check overlaps 257 theCheckOverlaps = G4tgrUtils::GetBool(wl[2] 257 theCheckOverlaps = G4tgrUtils::GetBool(wl[2]); 258 } 258 } 259 259 260 // ------------------------------------------- 260 // -------------------------------------------------------------------- 261 std::ostream& operator<<(std::ostream& os, con 261 std::ostream& operator<<(std::ostream& os, const G4tgrVolume& obj) 262 { 262 { 263 os << "G4tgrVolume= " << obj.theName << " Ty 263 os << "G4tgrVolume= " << obj.theName << " Type= " << obj.theType 264 << " Material= " << obj.theMaterialName < 264 << " Material= " << obj.theMaterialName << " Visibility " 265 << obj.theVisibility << " Colour " << (ob 265 << obj.theVisibility << " Colour " << (obj.theRGBColour)[0] << " " 266 << (obj.theRGBColour)[1] << " " << (obj.t 266 << (obj.theRGBColour)[1] << " " << (obj.theRGBColour)[2] << " " 267 << (obj.theRGBColour)[3] << " " 267 << (obj.theRGBColour)[3] << " " 268 << " CheckOverlaps " << obj.theCheckOverl 268 << " CheckOverlaps " << obj.theCheckOverlaps << " N placements " 269 << obj.thePlacements.size() << G4endl; 269 << obj.thePlacements.size() << G4endl; 270 270 271 return os; 271 return os; 272 } 272 } 273 273