Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4ParticleChangeForMSC class implementation 26 // G4ParticleChangeForMSC class implementation 27 // 27 // 28 // Author: Hisaya Kurashige, 23 March 1998 28 // Author: Hisaya Kurashige, 23 March 1998 29 // Revision: Vladimir Ivantchenko, 16 January 29 // Revision: Vladimir Ivantchenko, 16 January 2004 30 // 23 August 2 << 31 // ------------------------------------------- 30 // -------------------------------------------------------------------- 32 31 33 #include "G4ParticleChangeForMSC.hh" 32 #include "G4ParticleChangeForMSC.hh" 34 #include "G4SystemOfUnits.hh" 33 #include "G4SystemOfUnits.hh" 35 #include "G4Track.hh" 34 #include "G4Track.hh" 36 #include "G4Step.hh" 35 #include "G4Step.hh" >> 36 #include "G4DynamicParticle.hh" 37 #include "G4ExceptionSeverity.hh" 37 #include "G4ExceptionSeverity.hh" 38 38 39 // ------------------------------------------- 39 // -------------------------------------------------------------------- 40 G4ParticleChangeForMSC::G4ParticleChangeForMSC << 40 G4ParticleChangeForMSC::G4ParticleChangeForMSC() >> 41 : G4VParticleChange() 41 { 42 { 42 // Disable flag that is enabled in G4VPartic << 43 } 43 debugFlag = false; << 44 >> 45 // -------------------------------------------------------------------- >> 46 G4ParticleChangeForMSC::~G4ParticleChangeForMSC() >> 47 { >> 48 } >> 49 >> 50 // -------------------------------------------------------------------- >> 51 G4ParticleChangeForMSC:: >> 52 G4ParticleChangeForMSC(const G4ParticleChangeForMSC& right) >> 53 : G4VParticleChange(right) >> 54 { >> 55 theMomentumDirection = right.theMomentumDirection; >> 56 thePosition = right.thePosition; >> 57 } >> 58 >> 59 // -------------------------------------------------------------------- >> 60 G4ParticleChangeForMSC& >> 61 G4ParticleChangeForMSC::operator=(const G4ParticleChangeForMSC& right) >> 62 { >> 63 if(this != &right) >> 64 { >> 65 theListOfSecondaries = right.theListOfSecondaries; >> 66 theSizeOftheListOfSecondaries = right.theSizeOftheListOfSecondaries; >> 67 theNumberOfSecondaries = right.theNumberOfSecondaries; >> 68 theStatusChange = right.theStatusChange; >> 69 theLocalEnergyDeposit = right.theLocalEnergyDeposit; >> 70 theSteppingControlFlag = right.theSteppingControlFlag; >> 71 theTrueStepLength = right.theTrueStepLength; >> 72 >> 73 theMomentumDirection = right.theMomentumDirection; >> 74 thePosition = right.thePosition; >> 75 } >> 76 return *this; 44 } 77 } 45 78 46 // ------------------------------------------- 79 // -------------------------------------------------------------------- 47 G4Step* G4ParticleChangeForMSC::UpdateStepForA 80 G4Step* G4ParticleChangeForMSC::UpdateStepForAlongStep(G4Step* pStep) 48 { 81 { 49 // update the G4Step specific attributes 82 // update the G4Step specific attributes 50 pStep->SetStepLength(theTrueStepLength); 83 pStep->SetStepLength(theTrueStepLength); >> 84 theStatusChange = pStep->GetTrack()->GetTrackStatus(); 51 85 52 // multiple scattering calculates the final 86 // multiple scattering calculates the final state of the particle 53 G4StepPoint* pPostStepPoint = pStep->GetPost 87 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); 54 88 55 // update momentum direction 89 // update momentum direction 56 pPostStepPoint->SetMomentumDirection(theMome 90 pPostStepPoint->SetMomentumDirection(theMomentumDirection); 57 91 58 // update position 92 // update position 59 pPostStepPoint->SetPosition(thePosition); 93 pPostStepPoint->SetPosition(thePosition); 60 return pStep; 94 return pStep; 61 } 95 } 62 96 >> 97 // -------------------------------------------------------------------- >> 98 G4Step* G4ParticleChangeForMSC::UpdateStepForPostStep(G4Step* pStep) >> 99 { >> 100 // multiple scattering calculates the final state of the particle >> 101 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); >> 102 >> 103 // update momentum direction >> 104 pPostStepPoint->SetMomentumDirection(theMomentumDirection); >> 105 >> 106 // update position >> 107 pPostStepPoint->SetPosition(thePosition); >> 108 >> 109 // update the G4Step specific attributes >> 110 return pStep; >> 111 } >> 112 >> 113 // -------------------------------------------------------------------- >> 114 void G4ParticleChangeForMSC::DumpInfo() const >> 115 { >> 116 // use base-class DumpInfo >> 117 G4VParticleChange::DumpInfo(); >> 118 >> 119 G4int oldprc = G4cout.precision(3); >> 120 G4cout << " Position - x (mm) : " << std::setw(20) >> 121 << thePosition.x() / mm << G4endl; >> 122 G4cout << " Position - y (mm) : " << std::setw(20) >> 123 << thePosition.y() / mm << G4endl; >> 124 G4cout << " Position - z (mm) : " << std::setw(20) >> 125 << thePosition.z() / mm << G4endl; >> 126 G4cout << " Momentum Direct - x : " << std::setw(20) >> 127 << theMomentumDirection.x() << G4endl; >> 128 G4cout << " Momentum Direct - y : " << std::setw(20) >> 129 << theMomentumDirection.y() << G4endl; >> 130 G4cout << " Momentum Direct - z : " << std::setw(20) >> 131 << theMomentumDirection.z() << G4endl; >> 132 G4cout.precision(oldprc); >> 133 } >> 134 >> 135 // -------------------------------------------------------------------- >> 136 G4bool G4ParticleChangeForMSC::CheckIt(const G4Track& aTrack) >> 137 { >> 138 G4bool itsOK = true; >> 139 G4bool exitWithError = false; >> 140 >> 141 G4double accuracy; >> 142 >> 143 // check >> 144 >> 145 // MomentumDirection should be unit vector >> 146 accuracy = std::fabs(theMomentumDirection.mag2() - 1.0); >> 147 if(accuracy > accuracyForWarning) >> 148 { >> 149 itsOK = false; >> 150 exitWithError = (accuracy > accuracyForException); >> 151 #ifdef G4VERBOSE >> 152 G4cout << " G4ParticleChangeForMSC::CheckIt : "; >> 153 G4cout << "the Momentum Change is not unit vector !!" >> 154 << " Difference: " << accuracy << G4endl; >> 155 G4cout << aTrack.GetDefinition()->GetParticleName() >> 156 << " E=" << aTrack.GetKineticEnergy() / MeV >> 157 << " pos=" << aTrack.GetPosition().x() / m << ", " >> 158 << aTrack.GetPosition().y() / m << ", " >> 159 << aTrack.GetPosition().z() / m << G4endl; >> 160 #endif >> 161 } >> 162 >> 163 // dump out information of this particle change >> 164 #ifdef G4VERBOSE >> 165 if(!itsOK) { DumpInfo(); } >> 166 #endif >> 167 >> 168 // exit with error >> 169 if(exitWithError) >> 170 { >> 171 G4Exception("G4ParticleChangeForMSC::CheckIt()", "300", EventMustBeAborted, >> 172 "momentum direction was illegal"); >> 173 } >> 174 // correction >> 175 if(!itsOK) >> 176 { >> 177 G4double vmag = theMomentumDirection.mag(); >> 178 theMomentumDirection = (1. / vmag) * theMomentumDirection; >> 179 } >> 180 >> 181 itsOK = (itsOK) && G4VParticleChange::CheckIt(aTrack); >> 182 return itsOK; >> 183 } 63 184