Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // G4tgrVolume implementation 27 // 28 // Author: P.Arce, CIEMAT (November 2007) 29 // -------------------------------------------------------------------- 30 31 #include "G4tgrVolume.hh" 32 #include "G4tgrUtils.hh" 33 #include "G4tgrSolid.hh" 34 #include "G4tgrVolumeMgr.hh" 35 #include "G4tgrPlace.hh" 36 #include "G4tgrPlaceSimple.hh" 37 #include "G4tgrPlaceDivRep.hh" 38 #include "G4tgrPlaceParameterisation.hh" 39 #include "G4tgrFileReader.hh" 40 #include "G4tgrMessenger.hh" 41 #include "G4UIcommand.hh" 42 43 // -------------------------------------------------------------------- 44 G4tgrVolume::G4tgrVolume() 45 { 46 } 47 48 // -------------------------------------------------------------------- 49 G4tgrVolume::~G4tgrVolume() 50 { 51 delete[] theRGBColour; 52 } 53 54 // -------------------------------------------------------------------- 55 G4tgrVolume::G4tgrVolume(const std::vector<G4String>& wl) 56 { 57 theType = "VOLSimple"; 58 59 //---------- set name 60 theName = G4tgrUtils::GetString(wl[1]); 61 62 theVisibility = true; 63 theRGBColour = new G4double[4]; 64 for(std::size_t ii = 0; ii < 4; ++ii) 65 { 66 theRGBColour[ii] = -1.; 67 } 68 theCheckOverlaps = false; 69 70 if(wl.size() != 4) 71 { 72 //:VOLU tag to build a volume creating solid and material 73 //---------- set material name 74 theMaterialName = G4tgrUtils::GetString(wl[wl.size() - 1]); 75 76 //---------- create only vector<double> of theSolidParams 77 theSolid = G4tgrVolumeMgr::GetInstance()->CreateSolid(wl, 1); 78 79 #ifdef G4VERBOSE 80 if(G4tgrMessenger::GetVerboseLevel() >= 1) 81 { 82 G4cout << "Created from new solid: " << *this << G4endl; 83 } 84 #endif 85 } 86 else 87 { 88 //:VOLU tag to build a volume assigning material to solid 89 //---------- set material name 90 theMaterialName = G4tgrUtils::GetString(wl[3]); 91 theSolid = G4tgrVolumeMgr::GetInstance()->FindSolid(wl[2], true); 92 93 #ifdef G4VERBOSE 94 if(G4tgrMessenger::GetVerboseLevel() >= 1) 95 { 96 G4cout << "Created from existing solid: " << *this << G4endl; 97 } 98 #endif 99 } 100 } 101 102 // -------------------------------------------------------------------- 103 G4tgrVolume::G4tgrVolume(const G4tgrVolume& vol) 104 { 105 theName = vol.GetName(); 106 theType = vol.GetType(); 107 theMaterialName = vol.GetMaterialName(); 108 theSolid = vol.GetSolid(); 109 thePlacements = vol.GetPlacements(); 110 theVisibility = vol.GetVisibility(); 111 theRGBColour = vol.GetRGBColour(); 112 theCheckOverlaps = vol.GetCheckOverlaps(); 113 } 114 115 // -------------------------------------------------------------------- 116 G4tgrVolume* G4tgrVolume::GetVolume(G4int ii) const 117 { 118 G4String ErrMessage = "Should only be called for composite solids... " + 119 G4UIcommand::ConvertToString(ii); 120 G4Exception("G4tgrVolume::GetVolume()", "InvalidCall", FatalException, 121 ErrMessage); 122 return nullptr; 123 } 124 125 // -------------------------------------------------------------------- 126 G4tgrPlace* G4tgrVolume::AddPlace(const std::vector<G4String>& wl) 127 { 128 //---------- Check for exact number of words read 129 G4tgrUtils::CheckWLsize(wl, 8, WLSIZE_EQ, " G4tgrVolume::AddPlace"); 130 //---------- set G4tgrPlace 131 G4tgrPlaceSimple* pl = new G4tgrPlaceSimple(wl); 132 //---------- check that there is no previous placement in 133 // the same parent with the same copyNo 134 for(auto ite = thePlacements.cbegin(); ite != thePlacements.cend(); ++ite) 135 { 136 if(((*ite)->GetCopyNo() == pl->GetCopyNo()) && 137 ((*ite)->GetParentName() == pl->GetParentName())) 138 { 139 G4String ErrMessage = 140 "Repeated placement. Volume " + theName + " in " + pl->GetParentName(); 141 G4Exception("G4tgrVolume::AddPlace()", "InvalidArgument", 142 FatalErrorInArgument, ErrMessage); 143 } 144 } 145 146 pl->SetVolume(this); 147 thePlacements.push_back(pl); 148 149 #ifdef G4VERBOSE 150 if(G4tgrMessenger::GetVerboseLevel() >= 2) 151 { 152 G4cout << " G4tgrVolume: New placement: " << thePlacements.size() 153 << " added for Volume " << theName << " inside " 154 << pl->GetParentName() << " type " << pl->GetType() << G4endl; 155 } 156 #endif 157 //---------- register parent - child 158 G4tgrVolumeMgr::GetInstance()->RegisterParentChild(pl->GetParentName(), pl); 159 160 return pl; 161 } 162 163 // -------------------------------------------------------------------- 164 G4tgrPlaceDivRep* G4tgrVolume::AddPlaceReplica(const std::vector<G4String>& wl) 165 { 166 //---------- Check for exact number of words read 167 G4tgrUtils::CheckWLsize(wl, 6, WLSIZE_GE, " G4tgrVolume::AddPlaceReplica"); 168 G4tgrUtils::CheckWLsize(wl, 7, WLSIZE_LE, " G4tgrVolume::AddPlaceReplica"); 169 170 if((wl.size() == 7) && (G4tgrUtils::GetDouble(wl[6]) != 0.) && 171 (wl[3] != "PHI")) 172 { 173 G4Exception("G4tgrVolume::AddPlaceReplica", 174 "Offset set for replica not along PHI, it will not be used", 175 JustWarning, 176 G4String("Volume " + wl[1] + " in volume " + wl[2]).c_str()); 177 } 178 179 //---------- set G4tgrPlace 180 G4tgrPlaceDivRep* pl = new G4tgrPlaceDivRep(wl); 181 pl->SetType("PlaceReplica"); 182 pl->SetVolume(this); 183 thePlacements.push_back(pl); 184 185 #ifdef G4VERBOSE 186 if(G4tgrMessenger::GetVerboseLevel() >= 2) 187 { 188 G4cout << " G4tgrVolume: New placement replica: " << thePlacements.size() 189 << " added for Volume " << theName << " inside " 190 << pl->GetParentName() << G4endl; 191 } 192 #endif 193 //---------- register parent - child 194 G4tgrVolumeMgr::GetInstance()->RegisterParentChild(pl->GetParentName(), pl); 195 196 return pl; 197 } 198 199 // -------------------------------------------------------------------- 200 G4tgrPlaceParameterisation* 201 G4tgrVolume::AddPlaceParam(const std::vector<G4String>& wl) 202 { 203 //---------- set G4tgrPlaceParameterisation 204 G4tgrPlaceParameterisation* pl = new G4tgrPlaceParameterisation(wl); 205 206 pl->SetVolume(this); 207 thePlacements.push_back(pl); 208 209 #ifdef G4VERBOSE 210 if(G4tgrMessenger::GetVerboseLevel() >= 2) 211 { 212 G4cout << " G4tgrVolume: New placement Param: " << thePlacements.size() 213 << " added for Volume " << theName << " inside " 214 << pl->GetParentName() << G4endl; 215 } 216 #endif 217 //---------- register parent - child 218 G4tgrVolumeMgr::GetInstance()->RegisterParentChild(pl->GetParentName(), pl); 219 220 return pl; 221 } 222 223 // -------------------------------------------------------------------- 224 void G4tgrVolume::AddVisibility(const std::vector<G4String>& wl) 225 { 226 //---------- Check for exact number of words read 227 G4tgrUtils::CheckWLsize(wl, 3, WLSIZE_EQ, " G4tgrVolume::AddVisibility"); 228 229 //---------- Set visibility 230 theVisibility = G4tgrUtils::GetBool(wl[2]); 231 } 232 233 // -------------------------------------------------------------------- 234 void G4tgrVolume::AddRGBColour(const std::vector<G4String>& wl) 235 { 236 //---------- Check for exact number of words read 237 G4tgrUtils::CheckWLsize(wl, 5, WLSIZE_GE, " G4tgrVolume::AddRGBColour"); 238 239 //---------- Set RGB colour 240 theRGBColour[0] = G4tgrUtils::GetDouble(wl[2]); 241 theRGBColour[1] = G4tgrUtils::GetDouble(wl[3]); 242 theRGBColour[2] = G4tgrUtils::GetDouble(wl[4]); 243 ///--------- Set transparency 244 if(wl.size() == 6) 245 { 246 theRGBColour[3] = G4tgrUtils::GetDouble(wl[5]); 247 } 248 } 249 250 // -------------------------------------------------------------------- 251 void G4tgrVolume::AddCheckOverlaps(const std::vector<G4String>& wl) 252 { 253 //---------- Check for exact number of words read 254 G4tgrUtils::CheckWLsize(wl, 3, WLSIZE_GE, " G4tgrVolume::AddCheckOverlaps"); 255 256 ///--------- Set check overlaps 257 theCheckOverlaps = G4tgrUtils::GetBool(wl[2]); 258 } 259 260 // -------------------------------------------------------------------- 261 std::ostream& operator<<(std::ostream& os, const G4tgrVolume& obj) 262 { 263 os << "G4tgrVolume= " << obj.theName << " Type= " << obj.theType 264 << " Material= " << obj.theMaterialName << " Visibility " 265 << obj.theVisibility << " Colour " << (obj.theRGBColour)[0] << " " 266 << (obj.theRGBColour)[1] << " " << (obj.theRGBColour)[2] << " " 267 << (obj.theRGBColour)[3] << " " 268 << " CheckOverlaps " << obj.theCheckOverlaps << " N placements " 269 << obj.thePlacements.size() << G4endl; 270 271 return os; 272 } 273