#include <G4VScatteringCollision.hh>
Inheritance diagram for G4VScatteringCollision:
Public Member Functions | |
G4VScatteringCollision () | |
virtual | ~G4VScatteringCollision () |
G4bool | operator== (const G4VScatteringCollision &right) const |
G4bool | operator!= (const G4VScatteringCollision &right) const |
virtual G4KineticTrackVector * | FinalState (const G4KineticTrack &trk1, const G4KineticTrack &trk2) const |
virtual const G4VAngularDistribution * | GetAngularDistribution () const |
Protected Member Functions | |
virtual const std::vector< const G4ParticleDefinition * > & | GetOutgoingParticles () const =0 |
Definition at line 55 of file G4VScatteringCollision.hh.
G4VScatteringCollision::G4VScatteringCollision | ( | ) |
Definition at line 47 of file G4VScatteringCollision.cc.
00048 { 00049 theAngularDistribution = new G4AngularDistribution(true); 00050 }
G4VScatteringCollision::~G4VScatteringCollision | ( | ) | [virtual] |
G4KineticTrackVector * G4VScatteringCollision::FinalState | ( | const G4KineticTrack & | trk1, | |
const G4KineticTrack & | trk2 | |||
) | const [virtual] |
Implements G4VCollision.
Definition at line 59 of file G4VScatteringCollision.cc.
References G4VAngularDistribution::CosTheta(), G4cerr, G4cout, G4endl, G4KineticTrack::Get4Momentum(), G4KineticTrack::GetActualMass(), GetAngularDistribution(), G4KineticTrack::GetDefinition(), GetOutgoingParticles(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetPDGCharge(), G4KineticTrack::GetPosition(), G4Neutron::NeutronDefinition(), G4VAngularDistribution::Phi(), and G4PionPlus::PionPlus().
00061 { 00062 const G4VAngularDistribution* angDistribution = GetAngularDistribution(); 00063 G4LorentzVector p = trk1.Get4Momentum() + trk2.Get4Momentum(); 00064 G4double sqrtS = p.m(); 00065 G4double S = sqrtS * sqrtS; 00066 00067 std::vector<const G4ParticleDefinition*> OutputDefinitions = GetOutgoingParticles(); 00068 if (OutputDefinitions.size() != 2) 00069 throw G4HadronicException(__FILE__, __LINE__, "G4VScatteringCollision: Too many output particles!"); 00070 00071 if (OutputDefinitions[0]->IsShortLived() && OutputDefinitions[1]->IsShortLived()) 00072 { 00073 if(getenv("G4KCDEBUG")) G4cerr << "two shortlived for Type = "<<typeid(*this).name()<<G4endl; 00074 // throw G4HadronicException(__FILE__, __LINE__, "G4VScatteringCollision: can't handle two shortlived particles!"); // @hpw@ 00075 } 00076 00077 G4double outm1 = OutputDefinitions[0]->GetPDGMass(); 00078 G4double outm2 = OutputDefinitions[1]->GetPDGMass(); 00079 00080 if (OutputDefinitions[0]->IsShortLived()) 00081 { 00082 outm1 = SampleResonanceMass(outm1, 00083 OutputDefinitions[0]->GetPDGWidth(), 00084 G4Neutron::NeutronDefinition()->GetPDGMass()+G4PionPlus::PionPlus()->GetPDGMass(), 00085 sqrtS-(G4Neutron::NeutronDefinition()->GetPDGMass()+G4PionPlus::PionPlus()->GetPDGMass())); 00086 00087 } 00088 if (OutputDefinitions[1]->IsShortLived()) 00089 { 00090 outm2 = SampleResonanceMass(outm2, OutputDefinitions[1]->GetPDGWidth(), 00091 G4Neutron::NeutronDefinition()->GetPDGMass()+G4PionPlus::PionPlus()->GetPDGMass(), 00092 sqrtS-outm1); 00093 } 00094 00095 // Angles of outgoing particles 00096 G4double cosTheta = angDistribution->CosTheta(S, trk1.GetActualMass(), trk2.GetActualMass()); 00097 G4double phi = angDistribution->Phi(); 00098 00099 // Unit vector of three-momentum 00100 G4LorentzRotation fromCMSFrame(p.boostVector()); 00101 G4LorentzRotation toCMSFrame(fromCMSFrame.inverse()); 00102 G4LorentzVector TempPtr = toCMSFrame*trk1.Get4Momentum(); 00103 G4LorentzRotation toZ; 00104 toZ.rotateZ(-1*TempPtr.phi()); 00105 toZ.rotateY(-1*TempPtr.theta()); 00106 G4LorentzRotation toCMS(toZ.inverse()); 00107 00108 G4ThreeVector pFinal1(std::sin(std::acos(cosTheta))*std::cos(phi), std::sin(std::acos(cosTheta))*std::sin(phi), cosTheta); 00109 00110 // Three momentum in cm system 00111 G4double pCM = std::sqrt( (S-(outm1+outm2)*(outm1+outm2)) * (S-(outm1-outm2)*(outm1-outm2)) /(4.*S)); 00112 pFinal1 = pFinal1 * pCM; 00113 G4ThreeVector pFinal2 = -pFinal1; 00114 00115 G4double eFinal1 = std::sqrt(pFinal1.mag2() + outm1*outm1); 00116 G4double eFinal2 = std::sqrt(pFinal2.mag2() + outm2*outm2); 00117 00118 G4LorentzVector p4Final1(pFinal1, eFinal1); 00119 G4LorentzVector p4Final2(pFinal2, eFinal2); 00120 p4Final1 = toCMS*p4Final1; 00121 p4Final2 = toCMS*p4Final2; 00122 00123 00124 // Lorentz transformation 00125 G4LorentzRotation toLabFrame(p.boostVector()); 00126 p4Final1 *= toLabFrame; 00127 p4Final2 *= toLabFrame; 00128 00129 // Final tracks are copies of incoming ones, with modified 4-momenta 00130 00131 G4double chargeBalance = OutputDefinitions[0]->GetPDGCharge()+OutputDefinitions[1]->GetPDGCharge(); 00132 chargeBalance-= trk1.GetDefinition()->GetPDGCharge(); 00133 chargeBalance-= trk2.GetDefinition()->GetPDGCharge(); 00134 if(std::abs(chargeBalance) >.1) 00135 { 00136 G4cout << "Charges in "<<typeid(*this).name()<<G4endl; 00137 G4cout << OutputDefinitions[0]->GetPDGCharge()<<" "<<OutputDefinitions[0]->GetParticleName() 00138 << OutputDefinitions[1]->GetPDGCharge()<<" "<<OutputDefinitions[1]->GetParticleName() 00139 << trk1.GetDefinition()->GetPDGCharge()<<" "<<trk1.GetDefinition()->GetParticleName() 00140 << trk2.GetDefinition()->GetPDGCharge()<<" "<<trk2.GetDefinition()->GetParticleName()<<G4endl; 00141 } 00142 G4KineticTrack* final1 = new G4KineticTrack(const_cast<G4ParticleDefinition *>(OutputDefinitions[0]), 0.0, 00143 trk1.GetPosition(), p4Final1); 00144 G4KineticTrack* final2 = new G4KineticTrack(const_cast<G4ParticleDefinition *>(OutputDefinitions[1]), 0.0, 00145 trk2.GetPosition(), p4Final2); 00146 00147 G4KineticTrackVector* finalTracks = new G4KineticTrackVector; 00148 00149 finalTracks->push_back(final1); 00150 finalTracks->push_back(final2); 00151 00152 return finalTracks; 00153 }
virtual const G4VAngularDistribution* G4VScatteringCollision::GetAngularDistribution | ( | ) | const [inline, virtual] |
Implements G4VCollision.
Definition at line 69 of file G4VScatteringCollision.hh.
Referenced by FinalState().
virtual const std::vector<const G4ParticleDefinition*>& G4VScatteringCollision::GetOutgoingParticles | ( | ) | const [protected, pure virtual] |
G4bool G4VScatteringCollision::operator!= | ( | const G4VScatteringCollision & | right | ) | const |
G4bool G4VScatteringCollision::operator== | ( | const G4VScatteringCollision & | right | ) | const |