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 << 27 // 26 // 28 // Author: Hisaya Kurashige, 23 March 1998 << 27 // $Id: G4ParticleChangeForMSC.cc,v 1.13 2006/06/29 21:15:09 gunter Exp $ 29 // Revision: Vladimir Ivantchenko, 16 January << 28 // GEANT4 tag $Name: geant4-08-02 $ 30 // 23 August 2 << 29 // 31 // ------------------------------------------- << 30 // >> 31 // -------------------------------------------------------------- >> 32 // GEANT 4 class implementation file >> 33 // >> 34 // >> 35 // >> 36 // ------------------------------------------------------------ >> 37 // Implemented for the new scheme 23 Mar. 1998 H.Kurahige >> 38 // Update for model variant of msc 16 Jan 2004 V.Ivanchenko >> 39 // -------------------------------------------------------------- 32 40 33 #include "G4ParticleChangeForMSC.hh" 41 #include "G4ParticleChangeForMSC.hh" 34 #include "G4SystemOfUnits.hh" << 35 #include "G4Track.hh" 42 #include "G4Track.hh" 36 #include "G4Step.hh" 43 #include "G4Step.hh" >> 44 #include "G4DynamicParticle.hh" 37 #include "G4ExceptionSeverity.hh" 45 #include "G4ExceptionSeverity.hh" 38 46 39 // ------------------------------------------- << 47 G4ParticleChangeForMSC::G4ParticleChangeForMSC():G4VParticleChange() 40 G4ParticleChangeForMSC::G4ParticleChangeForMSC << 48 { >> 49 #ifdef G4VERBOSE >> 50 if (verboseLevel>2) { >> 51 G4cout << "G4ParticleChangeForMSC::G4ParticleChangeForMSC() " << G4endl; >> 52 } >> 53 #endif >> 54 } >> 55 >> 56 G4ParticleChangeForMSC::~G4ParticleChangeForMSC() >> 57 { >> 58 #ifdef G4VERBOSE >> 59 if (verboseLevel>2) { >> 60 G4cout << "G4ParticleChangeForMSC::~G4ParticleChangeForMSC() " << G4endl; >> 61 } >> 62 #endif >> 63 } >> 64 >> 65 G4ParticleChangeForMSC::G4ParticleChangeForMSC( >> 66 const G4ParticleChangeForMSC &right): G4VParticleChange(right) >> 67 { >> 68 if (verboseLevel>1) { >> 69 G4cout << "G4ParticleChangeForMSC:: copy constructor is called " << G4endl; >> 70 } >> 71 theMomentumDirection = right.theMomentumDirection; >> 72 thePosition = right.thePosition; >> 73 } >> 74 >> 75 // assignment operator >> 76 G4ParticleChangeForMSC & G4ParticleChangeForMSC::operator=( >> 77 const G4ParticleChangeForMSC &right) 41 { 78 { 42 // Disable flag that is enabled in G4VPartic << 79 if (verboseLevel>1) { 43 debugFlag = false; << 80 G4cout << "G4ParticleChangeForMSC:: assignment operator is called " << G4endl; >> 81 } >> 82 if (this != &right) >> 83 { >> 84 theListOfSecondaries = right.theListOfSecondaries; >> 85 theSizeOftheListOfSecondaries = right.theSizeOftheListOfSecondaries; >> 86 theNumberOfSecondaries = right.theNumberOfSecondaries; >> 87 theStatusChange = right.theStatusChange; >> 88 theLocalEnergyDeposit = right.theLocalEnergyDeposit; >> 89 theSteppingControlFlag = right.theSteppingControlFlag; >> 90 theTrueStepLength = right.theTrueStepLength; >> 91 >> 92 theMomentumDirection = right.theMomentumDirection; >> 93 thePosition = right.thePosition; >> 94 } >> 95 return *this; 44 } 96 } 45 97 46 // ------------------------------------------- << 98 //---------------------------------------------------------------- >> 99 // methods for updating G4Step >> 100 // >> 101 47 G4Step* G4ParticleChangeForMSC::UpdateStepForA 102 G4Step* G4ParticleChangeForMSC::UpdateStepForAlongStep(G4Step* pStep) 48 { 103 { 49 // update the G4Step specific attributes << 104 // Update the G4Step specific attributes 50 pStep->SetStepLength(theTrueStepLength); 105 pStep->SetStepLength(theTrueStepLength); >> 106 theStatusChange = pStep->GetTrack()->GetTrackStatus(); >> 107 return pStep; >> 108 } 51 109 52 // multiple scattering calculates the final << 110 G4Step* G4ParticleChangeForMSC::UpdateStepForPostStep(G4Step* pStep) >> 111 { >> 112 // A physics process always calculates the final state of the particle 53 G4StepPoint* pPostStepPoint = pStep->GetPost 113 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); 54 114 55 // update momentum direction 115 // update momentum direction 56 pPostStepPoint->SetMomentumDirection(theMome 116 pPostStepPoint->SetMomentumDirection(theMomentumDirection); 57 117 58 // update position 118 // update position 59 pPostStepPoint->SetPosition(thePosition); << 119 pPostStepPoint->SetPosition( thePosition ); >> 120 >> 121 // Update the G4Step specific attributes 60 return pStep; 122 return pStep; 61 } 123 } >> 124 >> 125 >> 126 //---------------------------------------------------------------- >> 127 // methods for printing messages >> 128 // >> 129 >> 130 void G4ParticleChangeForMSC::DumpInfo() const >> 131 { >> 132 // use base-class DumpInfo >> 133 G4VParticleChange::DumpInfo(); >> 134 >> 135 G4cout.precision(3); >> 136 G4cout << " Position - x (mm) : " >> 137 << std::setw(20) << thePosition.x()/mm >> 138 << G4endl; >> 139 G4cout << " Position - y (mm) : " >> 140 << std::setw(20) << thePosition.y()/mm >> 141 << G4endl; >> 142 G4cout << " Position - z (mm) : " >> 143 << std::setw(20) << thePosition.z()/mm >> 144 << G4endl; >> 145 G4cout << " Momentum Direct - x : " >> 146 << std::setw(20) << theMomentumDirection.x() >> 147 << G4endl; >> 148 G4cout << " Momentum Direct - y : " >> 149 << std::setw(20) << theMomentumDirection.y() >> 150 << G4endl; >> 151 G4cout << " Momentum Direct - z : " >> 152 << std::setw(20) << theMomentumDirection.z() >> 153 << G4endl; >> 154 } >> 155 >> 156 >> 157 G4bool G4ParticleChangeForMSC::CheckIt(const G4Track& aTrack) >> 158 { >> 159 G4bool itsOK = true; >> 160 G4bool exitWithError = false; >> 161 >> 162 G4double accuracy; >> 163 >> 164 // check >> 165 >> 166 // MomentumDirection should be unit vector >> 167 accuracy = std::abs(theMomentumDirection.mag2()-1.0); >> 168 if (accuracy > accuracyForWarning) { >> 169 #ifdef G4VERBOSE >> 170 G4cout << " G4ParticleChangeForMSC::CheckIt : "; >> 171 G4cout << "the Momentum Change is not unit vector !!" << G4endl; >> 172 G4cout << " Difference: " << accuracy << G4endl; >> 173 #endif >> 174 itsOK = false; >> 175 if (accuracy > accuracyForException) exitWithError = true; >> 176 } >> 177 >> 178 // dump out information of this particle change >> 179 #ifdef G4VERBOSE >> 180 if (!itsOK) { >> 181 G4cout << " G4ParticleChangeForMSC::CheckIt " <<G4endl; >> 182 DumpInfo(); >> 183 } >> 184 #endif >> 185 >> 186 // Exit with error >> 187 if (exitWithError) { >> 188 G4Exception("G4ParticleChangeForMSC::CheckIt", >> 189 "300", >> 190 EventMustBeAborted, >> 191 "momentum direction was illegal"); >> 192 } >> 193 //correction >> 194 if (!itsOK) { >> 195 G4double vmag = theMomentumDirection.mag(); >> 196 theMomentumDirection = (1./vmag)*theMomentumDirection; >> 197 } >> 198 >> 199 itsOK = (itsOK) && G4VParticleChange::CheckIt(aTrack); >> 200 return itsOK; >> 201 } >> 202 >> 203 >> 204 62 205 63 206