Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-23 09:20:13

0001 //
0002 // ********************************************************************
0003 // * License and Disclaimer                                           *
0004 // *                                                                  *
0005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
0006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
0007 // * conditions of the Geant4 Software License,  included in the file *
0008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
0009 // * include a list of copyright holders.                             *
0010 // *                                                                  *
0011 // * Neither the authors of this software system, nor their employing *
0012 // * institutes,nor the agencies providing financial support for this *
0013 // * work  make  any representation or  warranty, express or implied, *
0014 // * regarding  this  software system or assume any liability for its *
0015 // * use.  Please see the license in the file  LICENSE  and URL above *
0016 // * for the full disclaimer and the limitation of liability.         *
0017 // *                                                                  *
0018 // * This  code  implementation is the result of  the  scientific and *
0019 // * technical work of the GEANT4 collaboration.                      *
0020 // * By using,  copying,  modifying or  distributing the software (or *
0021 // * any work based  on the software)  you  agree  to acknowledge its *
0022 // * use  in  resulting  scientific  publications,  and indicate your *
0023 // * acceptance of all terms of the Geant4 Software license.          *
0024 // ********************************************************************
0025 //
0026 // Previous authors: G. Guerrieri, S. Guatelli and M. G. Pia, INFN Genova, Italy
0027 // Authors (since 2007): S. Guatelli, University of Wollongong, Australia
0028 // 
0029 //
0030 #include "G4PhantomBuilder.hh"
0031 #include "G4VBodyFactory.hh"
0032 #include "G4MIRDBodyFactory.hh"
0033 #include "G4ORNLFemaleBodyFactory.hh"
0034 #include "G4ORNLMaleBodyFactory.hh"
0035 #include "G4RunManager.hh"
0036 #include "G4Element.hh"
0037 #include "G4Material.hh"
0038 #include "G4Box.hh"
0039 #include "G4LogicalVolume.hh"
0040 #include "G4PVPlacement.hh"
0041 #include "G4Colour.hh"
0042 #include "G4VisAttributes.hh"
0043 
0044 G4PhantomBuilder::G4PhantomBuilder(): fModel("MIRD")
0045 {  
0046   // sex can be "female" or "male"
0047   fBody = nullptr;
0048   fMotherVolume = nullptr;
0049   fHeadVolume = nullptr;
0050   fTrunkVolume = nullptr;
0051   fLeftLegVolume =nullptr;
0052   fRightLegVolume = nullptr;
0053   fMaleGenitaliaVolume = nullptr;  
0054 }
0055 
0056 void G4PhantomBuilder::BuildTrunk(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0057 { 
0058   if (fMotherVolume == nullptr)
0059     G4Exception("G4PhantomBuilder::BuildTrunk()", "human_phantom0014", FatalException, "The world volume is missing !!!!!");
0060   
0061   G4cout <<"MotherVolume: " <<  fMotherVolume -> GetName()<< G4endl;
0062   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0063   fTrunkVolume = fBody -> CreateOrgan("Trunk", fMotherVolume, colourName, solidVis, sensitivity);
0064 }
0065 
0066 void G4PhantomBuilder::BuildLeftLeg(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0067 { 
0068   if (fMotherVolume == nullptr)
0069     G4Exception("G4PhantomBuilder::BuildLeftLeg()", "human_phantom0015", FatalException, "The world volume is missing !!!!!");
0070   
0071   G4cout <<"MotherVolume: " <<  fMotherVolume -> GetName()<< G4endl;
0072   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0073   fLeftLegVolume = fBody -> CreateOrgan("LeftLeg", fMotherVolume, colourName, solidVis, sensitivity);
0074 }
0075 void G4PhantomBuilder::BuildRightLeg(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0076 { 
0077   if (fMotherVolume == nullptr)
0078     G4Exception("G4PhantomBuilder::BuildRightLeg()", "human_phantom0016", FatalException, "The world volume is missing !!!!!");
0079   
0080   G4cout <<"MotherVolume: " <<  fMotherVolume -> GetName()<< G4endl;
0081   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0082   fRightLegVolume = fBody -> CreateOrgan("RightLeg", fMotherVolume, colourName, solidVis, sensitivity);
0083 }
0084 
0085 void G4PhantomBuilder::BuildLeftLegBone(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0086 { 
0087   if (fLeftLegVolume == nullptr)
0088     G4Exception("G4PhantomBuilder::BuildLeftLegBone()", "human_phantom0017", FatalException, "The left leg volume is missing !!!!!");
0089   
0090   G4cout <<"MotherVolume: " <<  fLeftLegVolume -> GetName()<< G4endl;
0091   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0092   fBody -> CreateOrgan("LeftLegBone", fLeftLegVolume,colourName, solidVis, sensitivity);
0093 }
0094 
0095 void G4PhantomBuilder::BuildRightLegBone(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0096 { 
0097   if (fTrunkVolume == nullptr)
0098     G4Exception("G4PhantomBuilder::BuildRightLegBone()", "human_phantom0018", FatalException, "The right leg volume is missing !!!!!");
0099   
0100   G4cout <<"MotherVolume: " << fRightLegVolume -> GetName()<< G4endl;
0101   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0102   fBody -> CreateOrgan("RightLegBone", fRightLegVolume, colourName, solidVis, sensitivity);
0103 }
0104 
0105 void G4PhantomBuilder::BuildLeftArmBone(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0106 { 
0107   if (fTrunkVolume == nullptr)
0108     G4Exception("G4PhantomBuilder::BuildLeftArmBone()", "human_phantom0019", FatalException, "The world volume is missing !!!!!");
0109   
0110   G4cout <<"MotherVolume: " << fTrunkVolume -> GetName()<< G4endl;
0111   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0112   fBody -> CreateOrgan("LeftArmBone", fTrunkVolume, colourName, solidVis, sensitivity);
0113 }
0114 void G4PhantomBuilder::BuildRightArmBone(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0115 { 
0116   if (fTrunkVolume == nullptr)
0117     G4Exception("G4PhantomBuilder::BuildRightArmBone()", "human_phantom0020", FatalException, "The trunk volume is missing !!!!!");
0118   
0119   G4cout <<"MotherVolume: " << fTrunkVolume -> GetName()<< G4endl;
0120   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0121   fBody -> CreateOrgan("RightArmBone", fTrunkVolume,colourName,solidVis, sensitivity);
0122 }
0123 
0124 void G4PhantomBuilder::BuildLeftScapula(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0125 { 
0126   if (fTrunkVolume == nullptr)
0127     G4Exception("G4PhantomBuilder::BuildLeftScapula()", "human_phantom0021", FatalException, "The trunk volume is missing !!!!!");
0128   
0129   G4cout <<"MotherVolume: " << fTrunkVolume -> GetName()<< G4endl;
0130   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0131   fBody -> CreateOrgan("LeftScapula",fTrunkVolume,colourName,solidVis, sensitivity);
0132 }
0133 
0134 void G4PhantomBuilder::BuildRightScapula(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0135 { 
0136   if (fTrunkVolume == nullptr)
0137     G4Exception("G4PhantomBuilder::BuildRightScapula()", "human_phantom0022", FatalException, "The trunk volume is missing !!!!!");
0138   
0139   G4cout <<"MotherVolume: " <<  fTrunkVolume -> GetName()<< G4endl;
0140   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0141   fBody -> CreateOrgan("RightScapula",fTrunkVolume,colourName,solidVis, sensitivity);
0142 }
0143 
0144 void G4PhantomBuilder::BuildLeftClavicle(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0145 { 
0146   if (fTrunkVolume == nullptr)
0147     G4Exception("G4PhantomBuilder::BuildLeftClavicle()", "human_phantom0023", FatalException, "The trunk volume is missing !!!!!");
0148   
0149   G4cout <<"MotherVolume: " <<  fTrunkVolume -> GetName()<< G4endl;
0150   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0151   fBody -> CreateOrgan("LeftClavicle", fTrunkVolume,colourName,solidVis, sensitivity);
0152 }
0153 
0154 void G4PhantomBuilder::BuildRightClavicle(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0155 { 
0156   if (fTrunkVolume == nullptr)
0157     G4Exception("G4PhantomBuilder::BuildRightClavicle()", "human_phantom0024", FatalException, "The trunk volume is missing !!!!!");
0158   
0159   G4cout <<"MotherVolume: " << fTrunkVolume -> GetName()<< G4endl;
0160   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0161   fBody -> CreateOrgan("RightClavicle",fTrunkVolume,colourName,solidVis, sensitivity);
0162 }
0163 
0164 void G4PhantomBuilder::BuildHead(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0165 { 
0166   if (fMotherVolume == nullptr)
0167     G4Exception("G4PhantomBuilder::BuildHead()", "human_phantom0025", FatalException, "The mother volume is missing !!!!!");
0168   
0169   G4cout <<"MotherVolume: " <<  fMotherVolume -> GetName()<< G4endl;
0170   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0171   fHeadVolume = fBody -> CreateOrgan("Head", fMotherVolume, colourName, solidVis, sensitivity);
0172 }
0173 
0174 void G4PhantomBuilder::BuildSkull(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0175 { 
0176   if (fHeadVolume == nullptr)
0177     G4Exception("G4PhantomBuilder::BuildSkull()", "human_phantom0026", FatalException, "The head volume is missing !!!!!");
0178   
0179   G4cout <<"MotherVolume: " << fHeadVolume -> GetName()<< G4endl;
0180   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0181   fBody -> CreateOrgan( "Skull", fHeadVolume, colourName, solidVis, sensitivity);
0182 }
0183 
0184 void G4PhantomBuilder::BuildUpperSpine(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0185 { 
0186   if (fHeadVolume == nullptr)
0187     G4Exception("G4PhantomBuilder::BuildUpperSpine()", "human_phantom0027", FatalException, "The head volume is missing !!!!!");
0188   
0189   G4cout <<"MotherVolume: " << fHeadVolume -> GetName()<< G4endl;
0190   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0191   fBody -> CreateOrgan("UpperSpine", fHeadVolume,colourName, solidVis, sensitivity);
0192 }
0193 
0194 void G4PhantomBuilder::BuildMiddleLowerSpine(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0195 { 
0196   if (fTrunkVolume == nullptr)
0197     G4Exception("G4PhantomBuilder::BuildMiddleLowerSpine()", "human_phantom0028", FatalException, "The trunk volume is missing !!!!!");
0198   
0199   G4cout <<"MotherVolume: " << fTrunkVolume -> GetName()<< G4endl;
0200   G4cout << "sensitivity : "<< sensitivity << G4endl; 
0201   fBody -> CreateOrgan("MiddleLowerSpine",fTrunkVolume, colourName, solidVis, sensitivity);
0202 }
0203 
0204 void G4PhantomBuilder::BuildPelvis(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0205 { 
0206   if (fTrunkVolume == nullptr)
0207     G4Exception("G4PhantomBuilder::BuildPelvis()", "human_phantom0029", FatalException, "The trunk volume is missing !!!!!");
0208 
0209   fBody -> CreateOrgan( "Pelvis", fTrunkVolume, colourName, solidVis, sensitivity);
0210 }
0211 
0212 void G4PhantomBuilder::BuildBrain(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0213 { 
0214   if (fHeadVolume == nullptr)
0215     G4Exception("G4PhantomBuilder::BuildBrain()", "human_phantom0030", FatalException, "The head volume is missing !!!!!");
0216 
0217   fBody -> CreateOrgan("Brain", fHeadVolume, colourName, solidVis, sensitivity);
0218 }
0219 
0220 void G4PhantomBuilder::BuildHeart(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0221 { 
0222   if (fTrunkVolume == nullptr)
0223     G4Exception("G4PhantomBuilder::BuildHeart()", "human_phantom0031", FatalException, "The trunk volume is missing !!!!!");
0224   fBody -> CreateOrgan("Heart", fTrunkVolume,colourName, solidVis, sensitivity);
0225 }
0226 
0227 void G4PhantomBuilder::BuildLeftLung(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0228 { 
0229   if (fTrunkVolume == nullptr)
0230     G4Exception("G4PhantomBuilder::BuildLeftLung()", "human_phantom0032", FatalException, "The trunk volume is missing !!!!!");
0231 
0232   fBody -> CreateOrgan("LeftLung", fTrunkVolume,colourName,solidVis, sensitivity);
0233 }
0234 
0235 void G4PhantomBuilder::BuildRightLung(const G4String& colourName, G4bool solidVis, G4bool sensitivity )
0236 { 
0237   if (fTrunkVolume == nullptr)
0238     G4Exception("G4PhantomBuilder::BuildRightLung()", "human_phantom0033", FatalException, "The trunk volume is missing !!!!!");
0239 
0240   fBody -> CreateOrgan("RightLung", fTrunkVolume,colourName, solidVis, sensitivity);
0241 }
0242 
0243 void G4PhantomBuilder::BuildStomach(const G4String& colourName, G4bool solidVis, G4bool sensitivity )
0244 { 
0245   if (fTrunkVolume == nullptr)
0246     G4Exception("G4PhantomBuilder::BuildStomach()", "human_phantom0034", FatalException, "The trunk volume is missing !!!!!");
0247 
0248   fBody -> CreateOrgan("Stomach", fTrunkVolume,colourName, solidVis, sensitivity);
0249 }
0250 
0251 void G4PhantomBuilder::BuildRibCage(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0252 { 
0253   if (fTrunkVolume == nullptr)
0254     G4Exception("G4PhantomBuilder::BuildRibCage()", "human_phantom0035", FatalException, "The trunk volume is missing !!!!!");
0255 
0256   fBody -> CreateOrgan("RibCage", fTrunkVolume,colourName, solidVis, sensitivity);
0257 }
0258 
0259 void G4PhantomBuilder::BuildSpleen(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0260 { 
0261   if (fTrunkVolume == nullptr)
0262     G4Exception("G4PhantomBuilder::BuildSpleen()", "human_phantom0036", FatalException, "The trunk volume is missing !!!!!");
0263 
0264   fBody -> CreateOrgan("Spleen", fTrunkVolume,colourName, solidVis, sensitivity);
0265 }
0266 
0267 void G4PhantomBuilder::BuildUpperLargeIntestine(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0268 { 
0269   if (fTrunkVolume == nullptr)
0270     G4Exception("G4PhantomBuilder::BuildUpperLargeIntestine()", "human_phantom0037", FatalException, "The trunk volume is missing !!!!!");
0271 
0272   fBody -> CreateOrgan("UpperLargeIntestine", fTrunkVolume, colourName, solidVis, sensitivity);
0273 }
0274 
0275 void G4PhantomBuilder::BuildLowerLargeIntestine(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0276 { 
0277   if (fTrunkVolume == nullptr)
0278     G4Exception("G4PhantomBuilder::BuildLowerLargeIntestine()", "human_phantom0038", FatalException, "The trunk volume is missing !!!!!");
0279 
0280   fBody -> CreateOrgan("LowerLargeIntestine", fTrunkVolume, colourName,solidVis, sensitivity);
0281 }
0282 
0283 void G4PhantomBuilder::BuildSmallIntestine(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0284 { 
0285   if (fTrunkVolume == nullptr)
0286     G4Exception("G4PhantomBuilder::BuildSamllIntestine()", "human_phantom0039", FatalException, "The trunk volume is missing !!!!!");
0287 
0288   fBody -> CreateOrgan("SmallIntestine", fTrunkVolume, colourName, solidVis, sensitivity);
0289 }
0290 
0291 void G4PhantomBuilder::BuildLeftKidney(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0292 { 
0293   if (fTrunkVolume == nullptr)
0294     G4Exception("G4PhantomBuilder::BuildLeftKidney()", "human_phantom0040", FatalException, "The trunk volume is missing !!!!!");
0295 
0296   fBody -> CreateOrgan("LeftKidney", fTrunkVolume,colourName, solidVis, sensitivity);
0297 }
0298 void G4PhantomBuilder::BuildRightKidney(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0299 { 
0300   if (fTrunkVolume == nullptr)
0301     G4Exception("G4PhantomBuilder::BuildRightKidney()", "human_phantom0041", FatalException, "The trunk volume is missing !!!!!");
0302 
0303   fBody -> CreateOrgan("RightKidney", fTrunkVolume,colourName, solidVis, sensitivity);
0304 }
0305 
0306 void G4PhantomBuilder::BuildLeftAdrenal(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0307 { 
0308   if (fTrunkVolume == nullptr)
0309     G4Exception("G4PhantomBuilder::BuildLeftAdrenal()", "human_phantom0042", FatalException, "The trunk volume is missing !!!!!");
0310 
0311   fBody -> CreateOrgan("LeftAdrenal", fTrunkVolume,colourName, solidVis, sensitivity);
0312 }
0313 
0314 void G4PhantomBuilder::BuildRightAdrenal(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0315 { 
0316   if (fTrunkVolume == nullptr)
0317     G4Exception("G4PhantomBuilder::BuildRightAdrenal()", "human_phantom0043", FatalException, "The trunk volume is missing !!!!!");
0318 
0319   fBody -> CreateOrgan("RightAdrenal", fTrunkVolume,colourName, solidVis, sensitivity);
0320 }
0321 
0322 void G4PhantomBuilder::BuildLiver(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0323 { 
0324   if (fTrunkVolume == nullptr)
0325     G4Exception("G4PhantomBuilder::BuildLiver()", "human_phantom0044", FatalException, "The trunk volume is missing !!!!!");
0326 
0327   fBody -> CreateOrgan("Liver", fTrunkVolume,colourName, solidVis, sensitivity);
0328 }
0329 void G4PhantomBuilder::BuildPancreas(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0330 { 
0331   if (fTrunkVolume == nullptr)
0332     G4Exception("G4PhantomBuilder::BuildPancreas()", "human_phantom0045", FatalException, "The trunk volume is missing !!!!!");
0333 
0334   fBody -> CreateOrgan("Pancreas", fTrunkVolume,colourName, solidVis, sensitivity);
0335 }
0336 
0337 void G4PhantomBuilder::BuildUrinaryBladder(const G4String& colourName, G4bool solidVis, G4bool sensitivity)
0338 { 
0339   if (fTrunkVolume == nullptr)
0340     G4Exception("G4PhantomBuilder::BuildUrinaryBladder()", "human_phantom0046", FatalException, "The trunk volume is missing !!!!!");
0341 
0342   fBody -> CreateOrgan("UrinaryBladder", fTrunkVolume, colourName, solidVis, sensitivity);
0343 }
0344 
0345 void G4PhantomBuilder::BuildThyroid(const G4String& colourName, G4bool solidVis, G4bool sensitivity )
0346 { 
0347   if (fHeadVolume == nullptr)
0348     G4Exception("G4PhantomBuilder::BuildThyroid()", "human_phantom0047", FatalException, "The trunk volume is missing !!!!!");
0349 
0350   fBody -> CreateOrgan("Thyroid", fHeadVolume, colourName,solidVis, sensitivity);
0351 }
0352 
0353 void G4PhantomBuilder::BuildThymus(const G4String& colourName, G4bool solidVis, G4bool sensitivity )
0354 { 
0355   if (fTrunkVolume == nullptr)
0356     G4Exception("G4PhantomBuilder::BuildThymus()", "human_phantom0048", FatalException, "The trunk volume is missing !!!!!");
0357   
0358   fBody -> CreateOrgan("Thymus",fTrunkVolume, colourName,solidVis, sensitivity);
0359 }
0360 
0361 G4VPhysicalVolume* G4PhantomBuilder::GetPhantom()
0362 {
0363   return fMotherVolume;
0364 }
0365 
0366 void G4PhantomBuilder::SetMotherVolume(G4VPhysicalVolume* mother)
0367 {
0368   fMotherVolume = mother;
0369 }
0370 
0371 void G4PhantomBuilder::SetModel(G4String modelFlag)
0372 {
0373   fModel = modelFlag;
0374 
0375   if(fModel=="MIRD") fBody = new G4MIRDBodyFactory();
0376   else if(fModel=="ORNLFemale")
0377   {
0378 #ifdef G4LIB_USE_GDML
0379     fBody = new G4ORNLFemaleBodyFactory();
0380 #else
0381     G4cout << fModel << " Working with GDML only! set -DWITH_GDML_USE=ON  flag during the CMAKE configuration step" << G4endl;
0382 #endif
0383   }
0384   else if(fModel=="ORNLMale") 
0385   {
0386 #ifdef G4LIB_USE_GDML
0387     fBody = new G4ORNLMaleBodyFactory();
0388 #else
0389     G4cout << fModel << " Working with GDML only! set -DWITH_GDML_USE=ON  flag during the CMAKE configuration step" << G4endl;
0390 #endif
0391   }
0392 }