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 // G4MCTSimEvent implementation 27 // 28 // Author: Youhei Morita, 12.09.2001 29 // -------------------------------------------------------------------- 30 31 #include "G4ios.hh" 32 #include "G4MCTSimEvent.hh" 33 #include "G4MCTSimParticle.hh" 34 #include "G4MCTSimVertex.hh" 35 36 // -------------------------------------------------------------------- 37 G4MCTSimEvent::G4MCTSimEvent() 38 { 39 } 40 41 // -------------------------------------------------------------------- 42 G4MCTSimEvent::~G4MCTSimEvent() 43 { 44 ClearEvent(); 45 } 46 47 // -------------------------------------------------------------------- 48 G4bool G4MCTSimEvent::AddParticle(const G4MCTSimParticle* aparticle) 49 50 { 51 G4MCTSimParticle* qpart = const_cast<G4MCTSimParticle*>(aparticle); 52 G4int trackID = aparticle->GetTrackID(); 53 std::size_t nc = particleMap.count(trackID); 54 if(nc == 0) 55 { 56 particleMap.insert(std::make_pair(trackID, qpart)); 57 return true; 58 } 59 else 60 { 61 return false; 62 } 63 } 64 65 // -------------------------------------------------------------------- 66 G4MCTSimParticle* G4MCTSimEvent::FindParticle(G4int tid) const 67 { 68 G4MCTSimParticleContainer::const_iterator pos = particleMap.find(tid); 69 if(pos != particleMap.cend()) 70 { 71 return pos->second; 72 } 73 else 74 { 75 return nullptr; 76 } 77 } 78 79 // -------------------------------------------------------------------- 80 G4MCTSimVertex* G4MCTSimEvent::GetVertex(G4int vid) const 81 { 82 G4int nv = (G4int)vertexVec.size(); 83 if(vid >= 1 && vid <= nv) 84 { 85 return vertexVec[vid - 1]; 86 } 87 else 88 { 89 return nullptr; 90 } 91 } 92 93 // -------------------------------------------------------------------- 94 void G4MCTSimEvent::BuildVertexContainer() 95 { 96 G4MCTSimParticleContainer::iterator itr; 97 G4int vid = 1; 98 for(itr = particleMap.begin(); itr != particleMap.end(); ++itr) 99 { 100 G4MCTSimVertex* vertex = itr->second->GetVertex(); 101 if(vertex) 102 { 103 if(vertex->GetID() < 0) 104 { 105 vertex->SetID(vid); // ID not yet assigned 106 ++vid; 107 if(vertex) 108 vertexVec.push_back(vertex); 109 } 110 } 111 } 112 } 113 114 // -------------------------------------------------------------------- 115 void G4MCTSimEvent::ClearEvent() 116 { 117 G4MCTSimParticleContainer::iterator itr; 118 for(itr = particleMap.begin(); itr != particleMap.end(); ++itr) 119 { 120 delete itr->second; 121 } 122 particleMap.clear(); 123 124 G4MCTSimVertexContainer::iterator itrv; 125 for(itrv = vertexVec.begin(); itrv != vertexVec.end(); ++itrv) 126 { 127 delete(*itrv); 128 } 129 vertexVec.clear(); 130 } 131 132 // -------------------------------------------------------------------- 133 G4int G4MCTSimEvent::GetNofStoredParticles() const 134 { 135 G4int n = 0; 136 G4MCTSimParticleContainer::const_iterator itr; 137 for(itr = particleMap.cbegin(); itr != particleMap.cend(); ++itr) 138 { 139 if(itr->second->GetStoreFlag()) 140 ++n; 141 } 142 return n; 143 } 144 145 // -------------------------------------------------------------------- 146 G4int G4MCTSimEvent::GetNofStoredVertices() const 147 { 148 G4int n = 0; 149 G4MCTSimVertexContainer::const_iterator itr; 150 for(itr = vertexVec.cbegin(); itr != vertexVec.cend(); ++itr) 151 { 152 if((*itr)->GetStoreFlag()) 153 ++n; 154 } 155 return n; 156 } 157 158 // -------------------------------------------------------------------- 159 void G4MCTSimEvent::Print(std::ostream& ostr) const 160 { 161 ostr << "____________________________________________________" 162 "____________________________" 163 << G4endl; 164 ostr << "SimEvent:" << G4endl << G4endl; 165 ostr << "Current Memory Usage: " << particleMap.size() << " particles, " 166 << vertexVec.size() << " vertices." << G4endl; 167 ostr << "trk#<ptrk#: P(Px(GeV), Py, Pz, E ) @PDG %proc\n" 168 << " vtx#- X( X(mm), Y, Z, T(ns)) @vname-#" 169 << G4endl; 170 ostr << "____________________________________________________" 171 "____________________________" 172 << G4endl; 173 174 G4MCTSimParticleContainer::const_iterator itr; 175 for(itr = particleMap.cbegin(); itr != particleMap.cend(); ++itr) 176 { 177 itr->second->PrintSingle(ostr); 178 } 179 ostr << "____________________________________________________" 180 "____________________________" 181 << G4endl; 182 } 183