Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 // 23 // >> 24 // $Id: G4PhysicalVolumeMassScene.cc,v 1.3 2004/11/11 16:06:49 johna Exp $ >> 25 // GEANT4 tag $Name: geant4-07-00-patch-01 $ 27 // 26 // 28 // 27 // 29 // John Allison 10th August 1998. 28 // John Allison 10th August 1998. 30 // An artificial scene to find physical volume 29 // An artificial scene to find physical volumes. 31 30 32 #include "G4PhysicalVolumeMassScene.hh" 31 #include "G4PhysicalVolumeMassScene.hh" 33 32 34 #include "G4VSolid.hh" 33 #include "G4VSolid.hh" 35 #include "G4Vector3D.hh" 34 #include "G4Vector3D.hh" 36 #include "G4PhysicalVolumeModel.hh" 35 #include "G4PhysicalVolumeModel.hh" 37 #include "G4LogicalVolume.hh" 36 #include "G4LogicalVolume.hh" 38 #include "G4Polyhedron.hh" 37 #include "G4Polyhedron.hh" 39 #include "G4Material.hh" 38 #include "G4Material.hh" 40 #include "G4VPVParameterisation.hh" 39 #include "G4VPVParameterisation.hh" 41 #include "G4UnitsTable.hh" 40 #include "G4UnitsTable.hh" 42 41 43 #define G4warn G4cout << 42 G4PhysicalVolumeMassScene::G4PhysicalVolumeMassScene (): 44 << 45 G4PhysicalVolumeMassScene::G4PhysicalVolumeMas << 46 (G4PhysicalVolumeModel* pPVModel): << 47 fpPVModel (pPVModel), << 48 fVolume (0.), 43 fVolume (0.), 49 fMass (0.), 44 fMass (0.), 50 fpLastPV (0), 45 fpLastPV (0), 51 fPVPCount (0), 46 fPVPCount (0), 52 fLastDepth (0), 47 fLastDepth (0), 53 fLastDensity (0.) << 48 fLastDensity (0.), >> 49 fCurrentDepth (0), >> 50 fpCurrentPV (0), >> 51 fpCurrentLV (0) 54 {} 52 {} 55 53 56 G4PhysicalVolumeMassScene::~G4PhysicalVolumeMa 54 G4PhysicalVolumeMassScene::~G4PhysicalVolumeMassScene () {} 57 55 >> 56 void G4PhysicalVolumeMassScene::EstablishSpecials >> 57 (G4PhysicalVolumeModel& pvModel) { >> 58 pvModel.DefinePointersToWorkingSpace (&fCurrentDepth, >> 59 &fpCurrentPV, >> 60 &fpCurrentLV); >> 61 } >> 62 58 void G4PhysicalVolumeMassScene::Reset () 63 void G4PhysicalVolumeMassScene::Reset () 59 { 64 { 60 fVolume = 0.; 65 fVolume = 0.; 61 fMass = 0.; 66 fMass = 0.; 62 fpLastPV = 0; 67 fpLastPV = 0; 63 fPVPCount = 0; 68 fPVPCount = 0; 64 fLastDepth = 0; 69 fLastDepth = 0; 65 fLastDensity = 0.; 70 fLastDensity = 0.; 66 fDensityStack.clear(); 71 fDensityStack.clear(); >> 72 fCurrentDepth = 0; >> 73 fpCurrentPV = 0; >> 74 fpCurrentLV = 0; >> 75 67 } 76 } 68 77 69 void G4PhysicalVolumeMassScene::ProcessVolume << 78 void G4PhysicalVolumeMassScene::AccrueMass (const G4VSolid& solid) 70 { 79 { 71 G4int currentDepth = fpPVModel->GetCurrentDe << 80 if (fpCurrentPV != fpLastPV) { 72 G4VPhysicalVolume* pCurrentPV = fpPVModel->G << 81 fpLastPV = fpCurrentPV; 73 //G4LogicalVolume* pCurrentLV = fpPVModel->G << 74 G4Material* pCurrentMaterial = fpPVModel->Ge << 75 << 76 if (pCurrentPV != fpLastPV) { << 77 fpLastPV = pCurrentPV; << 78 fPVPCount = 0; 82 fPVPCount = 0; 79 } 83 } 80 84 81 G4double currentVolume = ((G4VSolid&)solid). << 85 G4double currentVolume; 82 G4double currentDensity = pCurrentMaterial? << 86 G4double currentDensity; 83 /* Using G4Polyhedron... (gives slightly dif << 84 G4Polyhedron* pPolyhedron = solid.GetPolyhed 87 G4Polyhedron* pPolyhedron = solid.GetPolyhedron(); 85 if (!pPolyhedron) { << 88 if (pPolyhedron) { >> 89 G4Material* pMaterial; >> 90 G4VPVParameterisation* pP = fpCurrentPV->GetParameterisation(); >> 91 if (pP) { >> 92 pMaterial = pP -> ComputeMaterial (fPVPCount++, fpCurrentPV); >> 93 } else { >> 94 pMaterial = fpCurrentLV->GetMaterial(); >> 95 } >> 96 currentVolume = pPolyhedron->GetVolume(); >> 97 currentDensity = pMaterial->GetDensity(); >> 98 } else { 86 G4cout << 99 G4cout << 87 "G4PhysicalVolumeMassScene::AccrueMass: 100 "G4PhysicalVolumeMassScene::AccrueMass: WARNING:" 88 "\n No G4Polyhedron for" << solid.GetEn 101 "\n No G4Polyhedron for" << solid.GetEntityType() << 89 ". \"" << solid.GetName() << "\" will n 102 ". \"" << solid.GetName() << "\" will not be accounted." 90 "\n It will be as though not there, i.e 103 "\n It will be as though not there, i.e., the density as its mother." 91 "\n Its daughters will still be found a 104 "\n Its daughters will still be found and accounted." 92 << G4endl; 105 << G4endl; 93 currentVolume = 0.; 106 currentVolume = 0.; 94 currentDensity = 0.; 107 currentDensity = 0.; 95 } 108 } 96 */ << 97 109 98 if (currentDepth == 0) fVolume = currentVolu << 110 if (fCurrentDepth == 0) fVolume = currentVolume; 99 111 100 if (currentDepth > fLastDepth) { << 112 if (fCurrentDepth > fLastDepth) { 101 fDensityStack.push_back (fLastDensity); 113 fDensityStack.push_back (fLastDensity); 102 } else if (currentDepth < fLastDepth) { << 114 } else if (fCurrentDepth < fLastDepth) { 103 fDensityStack.pop_back(); 115 fDensityStack.pop_back(); 104 } 116 } 105 fLastDepth = currentDepth; << 117 fLastDepth = fCurrentDepth; 106 fLastDensity = currentDensity; 118 fLastDensity = currentDensity; 107 G4double motherDensity = 0.; 119 G4double motherDensity = 0.; 108 if (currentDepth > 0) motherDensity = fDensi << 120 if (fCurrentDepth > 0) motherDensity = fDensityStack.back(); 109 121 110 G4double subtractedMass = currentVolume * mo 122 G4double subtractedMass = currentVolume * motherDensity; 111 G4double addedMass = currentVolume * current 123 G4double addedMass = currentVolume * currentDensity; 112 fMass -= subtractedMass; 124 fMass -= subtractedMass; 113 fMass += addedMass; 125 fMass += addedMass; 114 /* Debug 126 /* Debug 115 G4cout << "current vol = " 127 G4cout << "current vol = " 116 << G4BestUnit (currentVolume,"Volume") 128 << G4BestUnit (currentVolume,"Volume") 117 << ", current density = " 129 << ", current density = " 118 << G4BestUnit (currentDensity, "Volumic Mas 130 << G4BestUnit (currentDensity, "Volumic Mass") 119 << ", mother density = " 131 << ", mother density = " 120 << G4BestUnit (motherDensity, "Volumic Mass 132 << G4BestUnit (motherDensity, "Volumic Mass") 121 << G4endl; 133 << G4endl; 122 G4cout << "Subtracted mass = " << G4BestUnit 134 G4cout << "Subtracted mass = " << G4BestUnit (subtractedMass, "Mass") 123 << ", added mass = " << G4BestUnit (addedMa 135 << ", added mass = " << G4BestUnit (addedMass, "Mass") 124 << ", new mass = " << G4BestUnit (fMass, "M 136 << ", new mass = " << G4BestUnit (fMass, "Mass") 125 << G4endl; 137 << G4endl; 126 */ 138 */ 127 if (fMass < 0.) { 139 if (fMass < 0.) { 128 G4warn << << 140 G4cout << 129 "G4PhysicalVolumeMassScene::AccrueMass: 141 "G4PhysicalVolumeMassScene::AccrueMass: WARNING:" 130 "\n Mass going negative for \"" 142 "\n Mass going negative for \"" 131 << pCurrentPV->GetName() << << 143 << fpCurrentPV->GetName() << 132 "\", copy " 144 "\", copy " 133 << pCurrentPV->GetCopyNo() << << 145 << fpCurrentPV->GetCopyNo() << 134 ". Larger than mother?" 146 ". Larger than mother?" 135 << G4endl; 147 << G4endl; 136 } 148 } 137 } 149 } 138 150