G4VElasticCollision Class Reference

#include <G4VElasticCollision.hh>

Inheritance diagram for G4VElasticCollision:

G4VCollision G4CollisionMesonBaryonElastic G4CollisionNNElastic G4CollisionnpElastic

Public Member Functions

 G4VElasticCollision ()
virtual ~G4VElasticCollision ()
G4bool operator== (const G4VElasticCollision &right) const
G4bool operator!= (const G4VElasticCollision &right) const
virtual G4KineticTrackVectorFinalState (const G4KineticTrack &trk1, const G4KineticTrack &trk2) const

Detailed Description

Definition at line 40 of file G4VElasticCollision.hh.


Constructor & Destructor Documentation

G4VElasticCollision::G4VElasticCollision (  ) 

Definition at line 45 of file G4VElasticCollision.cc.

00046 { 
00047 }

G4VElasticCollision::~G4VElasticCollision (  )  [virtual]

Definition at line 50 of file G4VElasticCollision.cc.

00051 { }


Member Function Documentation

G4KineticTrackVector * G4VElasticCollision::FinalState ( const G4KineticTrack trk1,
const G4KineticTrack trk2 
) const [virtual]

Implements G4VCollision.

Definition at line 54 of file G4VElasticCollision.cc.

References G4VAngularDistribution::CosTheta(), G4KineticTrack::Get4Momentum(), G4KineticTrack::GetActualMass(), G4VCollision::GetAngularDistribution(), G4KineticTrack::GetDefinition(), G4ParticleDefinition::GetPDGMass(), G4Neutron::Neutron(), G4VAngularDistribution::Phi(), G4Proton::Proton(), and G4KineticTrack::Set4Momentum().

00056 {
00057   const G4VAngularDistribution* angDistribution;
00058 
00059   angDistribution = GetAngularDistribution();
00060 
00061 
00062   G4LorentzVector pCM=trk1.Get4Momentum() + trk2.Get4Momentum();
00063 
00064   G4LorentzRotation toLabFrame(pCM.boostVector());
00065   G4LorentzVector Ptmp=toLabFrame.inverse() * trk1.Get4Momentum();  //trk1 in CMS
00066   G4LorentzRotation toZ;
00067   toZ.rotateZ(-Ptmp.phi());
00068   toZ.rotateY(-Ptmp.theta());
00069   toLabFrame *= toZ.inverse();
00070 
00071   G4double S = pCM.mag2();
00072   G4double m10 = trk1.GetDefinition()->GetPDGMass();
00073   G4double m20 = trk2.GetDefinition()->GetPDGMass();
00074   if(S-(m10+m20)*(m10+m20) < 0) return new G4KineticTrackVector;
00075 
00076   G4double m_1 = trk1.GetActualMass();
00077   G4double m_2 = trk2.GetActualMass();
00078   
00079   // Angles of outgoing particles
00080   G4double cosTheta = angDistribution->CosTheta(S,m_1,m_2);
00081 
00082    if ( (trk1.GetDefinition() == G4Proton::Proton() || trk1.GetDefinition() == G4Neutron::Neutron() )
00083       &&(trk2.GetDefinition() == G4Proton::Proton() || trk2.GetDefinition() == G4Neutron::Neutron() ) )
00084    {
00085       if ( trk1.GetDefinition() == trk2.GetDefinition() )
00086       {
00087           if ( trk1.GetDefinition() == G4Proton::Proton() )
00088           {
00089 //            G4cout << "scatterangle pp " << cosTheta
00090 //                   << " " << typeid(*angDistribution).name() << G4endl;
00091           } else {
00092 //            G4cout << "scatterangle nn " << cosTheta
00093 //                   << " " << typeid(*angDistribution).name() << G4endl;
00094           }
00095       } else {
00096 //        G4cout << "scatterangle pn " << cosTheta
00097 //                   << " " << typeid(*angDistribution).name() << G4endl;
00098       }
00099    } else {
00100 //      G4cout << "scatterangle other " << cosTheta
00101 //                   << " " << typeid(*angDistribution).name() << G4endl;
00102    }
00103 
00104   G4double phi = angDistribution->Phi();
00105   G4double Theta = std::acos(cosTheta);
00106 
00107   // Unit vector of three-momentum
00108   G4ThreeVector pFinal1(std::sin(Theta)*std::cos(phi), std::sin(Theta)*std::sin(phi), cosTheta);
00109   // Three momentum in cm system
00110   G4double pInCM = std::sqrt((S-(m10+m20)*(m10+m20))*(S-(m10-m20)*(m10-m20))/(4.*S));
00111   pFinal1 = pFinal1 * pInCM;
00112   G4ThreeVector pFinal2 = -pFinal1;
00113 
00114   G4double eFinal1 = std::sqrt(pFinal1.mag2() + m10*m10);
00115   G4double eFinal2 = std::sqrt(pFinal2.mag2() + m20*m20);
00116 
00117   G4LorentzVector p4Final1(pFinal1, eFinal1);
00118   G4LorentzVector p4Final2(pFinal2, eFinal2);
00119 
00120   // Lorentz transformation
00121   p4Final1 *= toLabFrame;
00122   p4Final2 *= toLabFrame;
00123 
00124   // Final tracks are copies of incoming ones, with modified 4-momenta
00125   G4KineticTrack* final1 = new G4KineticTrack(trk1);
00126   final1->Set4Momentum(p4Final1);
00127   G4KineticTrack* final2 = new G4KineticTrack(trk2);
00128   final2->Set4Momentum(p4Final2);
00129 
00130   G4KineticTrackVector* finalTracks = new G4KineticTrackVector;
00131   finalTracks->push_back(final1);
00132   finalTracks->push_back(final2);
00133 
00134   return finalTracks;
00135 }

G4bool G4VElasticCollision::operator!= ( const G4VElasticCollision right  )  const

G4bool G4VElasticCollision::operator== ( const G4VElasticCollision right  )  const


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:53:41 2013 for Geant4 by  doxygen 1.4.7