00001 #include "BDSTrajectory.hh" 00002 #include "BDSTrajectoryPoint.hh" 00003 #include <map> 00004 00005 G4Allocator<BDSTrajectory> bdsTrajectoryAllocator; 00006 00007 00008 BDSTrajectory::BDSTrajectory():G4Trajectory(){ 00009 } 00010 00011 BDSTrajectory::BDSTrajectory(const G4Track* aTrack):G4Trajectory(aTrack){ 00012 _positionOfLastScatter[aTrack->GetTrackID()]=aTrack->GetPosition(); 00013 _momDirAtLastScatter[aTrack->GetTrackID()]=aTrack->GetMomentumDirection(); 00014 _energyAtLastScatter[aTrack->GetTrackID()]=aTrack->GetTotalEnergy(); 00015 _timeAtLastScatter[aTrack->GetTrackID()]=aTrack->GetGlobalTime(); 00016 _timeAtVertex[aTrack->GetTrackID()]=aTrack->GetGlobalTime(); 00017 } 00018 00019 BDSTrajectory::~BDSTrajectory(){ 00020 } 00021 00022 void BDSTrajectory::AppendStep(const G4Step* aStep){ 00023 G4Track* aTrack = aStep->GetTrack(); 00024 BDSTrajectoryPoint* tempTP = new BDSTrajectoryPoint(aTrack); 00025 if(tempTP->isScatteringProcess()){ 00026 _positionOfLastScatter[aTrack->GetTrackID()]=aTrack->GetPosition(); 00027 _momDirAtLastScatter[aTrack->GetTrackID()]=aTrack->GetMomentumDirection(); 00028 _energyAtLastScatter[aTrack->GetTrackID()]=aTrack->GetTotalEnergy(); 00029 _timeAtLastScatter[aTrack->GetTrackID()]=aTrack->GetGlobalTime(); 00030 } 00031 delete tempTP; 00032 } 00033 00034 void BDSTrajectory::MergeTrajectory(G4VTrajectory* secondTrajectory){ 00035 if(!secondTrajectory) return; 00036 00037 BDSTrajectory* seco = (BDSTrajectory*)secondTrajectory; 00038 for(std::map<G4int, G4ThreeVector>::iterator iter = seco->_positionOfLastScatter.begin(); 00039 iter!=seco->_positionOfLastScatter.end(); 00040 iter++){ 00041 _positionOfLastScatter.insert(*iter); 00042 } 00043 seco->_positionOfLastScatter.clear(); 00044 } 00045 00046 void BDSTrajectory::printData(){ 00047 } 00048 00049 void BDSTrajectory::printDataOfSteps(){ 00050 BDSTrajectoryPoint* tj; 00051 for(int i = 0; i<GetPointEntries(); i++){ 00052 tj = (BDSTrajectoryPoint*)GetPoint(i); 00053 if(i>0){ 00054 G4cout << "BDSTrajectory: Data for trajectory point : " << i << G4endl; 00055 tj->printData(); 00056 } 00057 } 00058 } 00059 00060 void BDSTrajectory::printDataOfSteps(G4Step* aStep){ 00061 G4int trackID = aStep->GetTrack()->GetTrackID(); 00062 BDSTrajectoryPoint* tj; 00063 for(int i = 0; i<GetPointEntries(); i++){ 00064 tj = (BDSTrajectoryPoint*)GetPoint(i); 00065 if(tj->GetTrackID() == trackID){ 00066 G4cout << "BDSTrajectory: Data for trajectory point : " << i << G4endl; 00067 tj->printData(); 00068 } 00069 } 00070 } 00071 00072 G4ThreeVector BDSTrajectory::GetPositionOfLastScatter(G4Track* aTrack){ 00073 return _positionOfLastScatter[aTrack->GetTrackID()]; 00074 } 00075 00076 G4ThreeVector BDSTrajectory::GetMomDirAtLastScatter(G4Track* aTrack){ 00077 return _momDirAtLastScatter[aTrack->GetTrackID()]; 00078 } 00079 00080 G4double BDSTrajectory::GetEnergyAtLastScatter(G4Track* aTrack){ 00081 return _energyAtLastScatter[aTrack->GetTrackID()]; 00082 } 00083 00084 G4double BDSTrajectory::GetTimeAtLastScatter(G4Track* aTrack){ 00085 return _timeAtLastScatter[aTrack->GetTrackID()]; 00086 } 00087 00088 G4double BDSTrajectory::GetTimeAtVertex(G4Track* aTrack){ 00089 return _timeAtVertex[aTrack->GetTrackID()]; 00090 } 00091