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 // G4PSPassageCellCurrent 29 #include "G4PSPassageCellCurrent.hh" 30 #include "G4StepStatus.hh" 31 #include "G4Track.hh" 32 #include "G4VSolid.hh" 33 #include "G4UnitsTable.hh" 34 #include "G4VScoreHistFiller.hh" 35 36 ////////////////////////////////////////////// 37 // (Description) 38 // This is a primitive scorer class for scor 39 // where only tracks passing through the geo 40 // into account. 41 // 42 // Created: 2005-11-14 Tsukasa ASO, Akinori K 43 // 2010-07-22 Introduce Unit specification. 44 // 2010-07-22 Add weighted option 45 // 2020-10-06 Use G4VPrimitivePlotter and fi 46 // vs. current * track weight (y) 47 // 48 ////////////////////////////////////////////// 49 50 G4PSPassageCellCurrent::G4PSPassageCellCurrent 51 : G4VPrimitivePlotter(name, depth) 52 { 53 SetUnit(""); 54 } 55 56 G4bool G4PSPassageCellCurrent::ProcessHits(G4S 57 { 58 if(IsPassed(aStep)) 59 { 60 fCurrent = 1.; 61 if(weighted) 62 fCurrent = aStep->GetPreStepPoint()->Get 63 G4int index = GetIndex(aStep); 64 EvtMap->add(index, fCurrent); 65 66 if(!hitIDMap.empty() && hitIDMap.find(inde 67 { 68 auto filler = G4VScoreHistFiller::Instan 69 if(filler == nullptr) 70 { 71 G4Exception( 72 "G4PSVolumeFlux::ProcessHits", "SCOR 73 "G4TScoreHistFiller is not instantia 74 } 75 else 76 { 77 filler->FillH1(hitIDMap[index], 78 aStep->GetPreStepPoint( 79 } 80 } 81 } 82 83 return true; 84 } 85 86 G4bool G4PSPassageCellCurrent::IsPassed(G4Step 87 { 88 G4bool Passed = false; 89 90 G4bool IsEnter = aStep->GetPreStepPoint()->G 91 G4bool IsExit = aStep->GetPostStepPoint()-> 92 93 G4int trkid = aStep->GetTrack()->GetTrackID( 94 95 if(IsEnter && IsExit) 96 { // Passed at one step 97 Passed = true; 98 } 99 else if(IsEnter) 100 { // Enter a new geo 101 fCurrentTrkID = trkid; // Resetting the c 102 } 103 else if(IsExit) 104 { // Exit a current geometry 105 if(fCurrentTrkID == trkid) 106 { 107 Passed = true; // if the track is same 108 } 109 } 110 else 111 { // Inside geometry 112 if(fCurrentTrkID == trkid) 113 { // Adding the track length to current o 114 } 115 } 116 return Passed; 117 } 118 119 void G4PSPassageCellCurrent::Initialize(G4HCof 120 { 121 fCurrentTrkID = -1; 122 123 EvtMap = new G4THitsMap<G4double>(detector-> 124 if(HCID < 0) 125 HCID = GetCollectionID(0); 126 HCE->AddHitsCollection(HCID, EvtMap); 127 } 128 129 void G4PSPassageCellCurrent::clear() { EvtMap- 130 131 void G4PSPassageCellCurrent::PrintAll() 132 { 133 G4cout << " MultiFunctionalDet " << detecto 134 G4cout << " PrimitiveScorer " << GetName() < 135 G4cout << " Number of entries " << EvtMap->e 136 for(const auto& [copy, current] : *(EvtMap-> 137 { 138 G4cout << " copy no.: " << copy 139 << " cell current : " << *(current 140 } 141 } 142 143 void G4PSPassageCellCurrent::SetUnit(const G4S 144 { 145 if(unit.empty()) 146 { 147 unitName = unit; 148 unitValue = 1.0; 149 } 150 else 151 { 152 G4String msg = "Invalid unit [" + unit + " 153 GetUnit() + "] ) for " + Ge 154 G4Exception("G4PSPassageCellCurrent::SetUn 155 msg); 156 } 157 } 158