Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // 28 // G4PSSphereSurfaceCurrent 29 #include "G4PSSphereSurfaceCurrent.hh" 30 31 #include "G4SystemOfUnits.hh" 32 #include "G4StepStatus.hh" 33 #include "G4Track.hh" 34 #include "G4VSolid.hh" 35 #include "G4VPhysicalVolume.hh" 36 #include "G4VPVParameterisation.hh" 37 #include "G4UnitsTable.hh" 38 #include "G4GeometryTolerance.hh" 39 ////////////////////////////////////////////// 40 // (Description) 41 // This is a primitive scorer class for scor 42 // Current version assumes only for G4Sphere 43 // 44 // Surface is defined at the inside of sphere 45 // Direction -Rmin +Rmax 46 // 0 IN || OUT ->|<- | 47 // 1 IN ->| | 48 // 2 OUT |<- | 49 // 50 // Created: 2005-11-14 Tsukasa ASO, Akinori K 51 // 2010-07-22 Introduce Unit specification. 52 // 53 ////////////////////////////////////////////// 54 55 G4PSSphereSurfaceCurrent::G4PSSphereSurfaceCur 56 57 : G4PSSphereSurfaceCurrent(name, direction, 58 {} 59 60 G4PSSphereSurfaceCurrent::G4PSSphereSurfaceCur 61 62 63 64 : G4VPrimitiveScorer(name, depth) 65 , HCID(-1) 66 , fDirection(direction) 67 , EvtMap(nullptr) 68 , weighted(true) 69 , divideByArea(true) 70 { 71 DefineUnitAndCategory(); 72 SetUnit(unit); 73 } 74 75 G4bool G4PSSphereSurfaceCurrent::ProcessHits(G 76 { 77 G4StepPoint* preStep = aStep->GetPreStepPoin 78 G4VSolid* solid = ComputeCurrentSolid(a 79 assert(dynamic_cast<G4Sphere*>(solid) != nul 80 81 auto sphereSolid = static_cast<G4Sphere*>(s 82 83 G4int dirFlag = IsSelectedSurface(aStep, sph 84 if(dirFlag > 0) 85 { 86 if(fDirection == fCurrent_InOut || fDirect 87 { 88 G4double radi = sphereSolid->GetInner 89 G4double dph = sphereSolid->GetDelta 90 G4double stth = sphereSolid->GetStart 91 G4double enth = stth + sphereSolid->G 92 G4double current = 1.0; 93 if(weighted) 94 current = preStep->GetWeight(); // Cu 95 if(divideByArea) 96 { 97 G4double square = 98 radi * radi * dph * (-std::cos(enth) 99 current = current / square; // Curren 100 } 101 102 G4int index = GetIndex(aStep); 103 EvtMap->add(index, current); 104 } 105 } 106 107 return true; 108 } 109 110 G4int G4PSSphereSurfaceCurrent::IsSelectedSurf 111 112 { 113 G4TouchableHandle theTouchable = 114 aStep->GetPreStepPoint()->GetTouchableHand 115 G4double kCarTolerance = 116 G4GeometryTolerance::GetInstance()->GetSur 117 118 if(aStep->GetPreStepPoint()->GetStepStatus() 119 { 120 // Entering Geometry 121 G4ThreeVector stppos1 = aStep->GetPreStepP 122 G4ThreeVector localpos1 = 123 theTouchable->GetHistory()->GetTopTransf 124 G4double localR2 = localpos1.x() * localpo 125 localpos1.y() * localpo 126 localpos1.z() * localpo 127 // G4double InsideRadius2 = 128 // sphereSolid->GetInsideRadius()*sphereS 129 // if(std::fabs( localR2 - InsideRadius2 ) 130 G4double InsideRadius = sphereSolid->GetIn 131 if(localR2 > 132 (InsideRadius - kCarTolerance) * (Ins 133 localR2 < 134 (InsideRadius + kCarTolerance) * (Ins 135 { 136 return fCurrent_In; 137 } 138 } 139 140 if(aStep->GetPostStepPoint()->GetStepStatus( 141 { 142 // Exiting Geometry 143 G4ThreeVector stppos2 = aStep->GetPostStep 144 G4ThreeVector localpos2 = 145 theTouchable->GetHistory()->GetTopTransf 146 G4double localR2 = localpos2.x() * localpo 147 localpos2.y() * localpo 148 localpos2.z() * localpo 149 // G4double InsideRadius2 = 150 // sphereSolid->GetInsideRadius()*sphereS 151 // if(std::fabs( localR2 - InsideRadius2 ) 152 G4double InsideRadius = sphereSolid->GetIn 153 if(localR2 > 154 (InsideRadius - kCarTolerance) * (Ins 155 localR2 < 156 (InsideRadius + kCarTolerance) * (Ins 157 { 158 return fCurrent_Out; 159 } 160 } 161 162 return -1; 163 } 164 165 void G4PSSphereSurfaceCurrent::Initialize(G4HC 166 { 167 EvtMap = new G4THitsMap<G4double>(detector-> 168 if(HCID < 0) 169 HCID = GetCollectionID(0); 170 HCE->AddHitsCollection(HCID, (G4VHitsCollect 171 } 172 173 void G4PSSphereSurfaceCurrent::clear() { EvtMa 174 175 void G4PSSphereSurfaceCurrent::PrintAll() 176 { 177 G4cout << " MultiFunctionalDet " << detecto 178 G4cout << " PrimitiveScorer " << GetName() < 179 G4cout << " Number of entries " << EvtMap->e 180 for(const auto& [copy, current] : *(EvtMap-> 181 { 182 G4cout << " copy no.: " << copy << " cur 183 if(divideByArea) 184 { 185 G4cout << *(current) / GetUnitValue() << 186 } 187 else 188 { 189 G4cout << *(current) << " [tracks]"; 190 } 191 G4cout << G4endl; 192 } 193 } 194 195 void G4PSSphereSurfaceCurrent::SetUnit(const G 196 { 197 if(divideByArea) 198 { 199 CheckAndSetUnit(unit, "Per Unit Surface"); 200 } 201 else 202 { 203 if(unit.empty()) 204 { 205 unitName = unit; 206 unitValue = 1.0; 207 } 208 else 209 { 210 G4String msg = "Invalid unit [" + unit + 211 GetUnit() + "] ) for " + 212 G4Exception("G4PSSphereSurfaceCurrent::S 213 msg); 214 } 215 } 216 } 217 218 void G4PSSphereSurfaceCurrent::DefineUnitAndCa 219 { 220 // Per Unit Surface 221 new G4UnitDefinition("percentimeter2", "perc 222 (1. / cm2)); 223 new G4UnitDefinition("permillimeter2", "perm 224 (1. / mm2)); 225 new G4UnitDefinition("permeter2", "perm2", " 226 } 227