#include <G4CollisionComposite.hh>
Inheritance diagram for G4CollisionComposite:
Public Member Functions | |
G4CollisionComposite () | |
virtual | ~G4CollisionComposite () |
virtual G4double | CrossSection (const G4KineticTrack &trk1, const G4KineticTrack &trk2) const |
virtual G4KineticTrackVector * | FinalState (const G4KineticTrack &trk1, const G4KineticTrack &trk2) const |
virtual G4bool | IsInCharge (const G4KineticTrack &trk1, const G4KineticTrack &trk2) const |
void | AddComponent (G4VCollision *aC) |
virtual const G4VCrossSectionSource * | GetCrossSectionSource () const |
virtual const G4VAngularDistribution * | GetAngularDistribution () const |
virtual const G4CollisionVector * | GetComponents () const |
Data Structures | |
struct | Register |
struct | Resolve |
Definition at line 57 of file G4CollisionComposite.hh.
G4CollisionComposite::G4CollisionComposite | ( | ) |
G4CollisionComposite::~G4CollisionComposite | ( | ) | [virtual] |
Definition at line 49 of file G4CollisionComposite.cc.
00050 { 00051 std::for_each(components.begin(), components.end(), G4Delete()); 00052 }
void G4CollisionComposite::AddComponent | ( | G4VCollision * | aC | ) | [inline] |
G4double G4CollisionComposite::CrossSection | ( | const G4KineticTrack & | trk1, | |
const G4KineticTrack & | trk2 | |||
) | const [virtual] |
Reimplemented from G4VCollision.
Reimplemented in G4CollisionNN.
Definition at line 55 of file G4CollisionComposite.cc.
References G4VCrossSectionSource::CrossSection(), GetCrossSectionSource(), and G4KineticTrack::GetDefinition().
00057 { 00058 G4double crossSect = 0.; 00059 const G4VCrossSectionSource* xSource = GetCrossSectionSource(); 00060 if (xSource != 0) 00061 // There is a total cross section for this Collision 00062 { 00063 crossSect = xSource->CrossSection(trk1,trk2); 00064 } 00065 else 00066 { 00067 // waiting for mutable to enable buffering. 00068 const_cast<G4CollisionComposite *>(this)->BufferCrossSection(trk1.GetDefinition(), trk2.GetDefinition()); 00069 // G4cerr << "Buffer filled, reying with sqrts = "<< (trk1.Get4Momentum()+trk2.Get4Momentum()).mag() <<G4endl; 00070 crossSect = BufferedCrossSection(trk1,trk2); 00071 } 00072 return crossSect; 00073 }
G4KineticTrackVector * G4CollisionComposite::FinalState | ( | const G4KineticTrack & | trk1, | |
const G4KineticTrack & | trk2 | |||
) | const [virtual] |
Implements G4VCollision.
Definition at line 76 of file G4CollisionComposite.cc.
References G4UniformRand, and IsInCharge().
00078 { 00079 std::vector<G4double> cxCache; 00080 G4double partialCxSum = 0.0; 00081 00082 size_t i; 00083 for (i=0; i<components.size(); i++) 00084 { 00085 G4double partialCx; 00086 // cout << "comp" << i << " " << components[i]()->GetName(); 00087 if (components[i]->IsInCharge(trk1,trk2)) 00088 { 00089 partialCx = components[i]->CrossSection(trk1,trk2); 00090 } 00091 else 00092 { 00093 partialCx = 0.0; 00094 } 00095 // cout << " cx=" << partialCx << endl; 00096 partialCxSum += partialCx; 00097 cxCache.push_back(partialCx); 00098 } 00099 00100 G4double random = G4UniformRand()*partialCxSum; 00101 G4double running = 0; 00102 for (i=0; i<cxCache.size(); i++) 00103 { 00104 running += cxCache[i]; 00105 if (running > random) 00106 { 00107 return components[i]->FinalState(trk1, trk2); 00108 } 00109 } 00110 // G4cerr <<"in charge = "<<IsInCharge(trk1, trk2)<<G4endl; 00111 // G4cerr <<"Cross-section = "<<CrossSection(trk1, trk2)/millibarn<<" "<<running<<" "<<cxCache.size()<<G4endl; 00112 // G4cerr <<"Names = "<<trk1.GetDefinition()->GetParticleName()<<", "<<trk2.GetDefinition()->GetParticleName()<<G4endl; 00113 // throw G4HadronicException(__FILE__, __LINE__, "G4CollisionComposite: no final state found!"); 00114 return NULL; 00115 }
virtual const G4VAngularDistribution* G4CollisionComposite::GetAngularDistribution | ( | ) | const [inline, virtual] |
Implements G4VCollision.
Reimplemented in G4CollisionNN, and G4CollisionPN.
Definition at line 76 of file G4CollisionComposite.hh.
virtual const G4CollisionVector* G4CollisionComposite::GetComponents | ( | ) | const [inline, virtual] |
Reimplemented from G4VCollision.
Reimplemented in G4CollisionNN, G4CollisionNNToDeltaDelta1600, G4CollisionNNToDeltaDelta1620, G4CollisionNNToDeltaDelta1700, G4CollisionNNToDeltaDelta1900, G4CollisionNNToDeltaDelta1905, G4CollisionNNToDeltaDelta1910, G4CollisionNNToDeltaDelta1920, G4CollisionNNToDeltaDelta1930, G4CollisionNNToDeltaDelta1950, G4CollisionNNToNDelta, G4CollisionNNToNDelta1600, G4CollisionNNToNDelta1620, G4CollisionNNToNDelta1700, G4CollisionNNToNDelta1900, G4CollisionNNToNDelta1905, G4CollisionNNToNDelta1910, G4CollisionNNToNDelta1920, G4CollisionNNToNDelta1930, and G4CollisionNNToNDelta1950.
Definition at line 78 of file G4CollisionComposite.hh.
Referenced by IsInCharge().
virtual const G4VCrossSectionSource* G4CollisionComposite::GetCrossSectionSource | ( | ) | const [inline, virtual] |
Implements G4VCollision.
Reimplemented in G4CollisionNN, and G4CollisionPN.
Definition at line 75 of file G4CollisionComposite.hh.
Referenced by CrossSection().
G4bool G4CollisionComposite::IsInCharge | ( | const G4KineticTrack & | trk1, | |
const G4KineticTrack & | trk2 | |||
) | const [virtual] |
Implements G4VCollision.
Reimplemented in G4GeneralNNCollision.
Definition at line 118 of file G4CollisionComposite.cc.
References GetComponents().
Referenced by FinalState().
00120 { 00121 G4bool isInCharge = false; 00122 00123 // The composite is in charge if any of its components is in charge 00124 00125 const G4CollisionVector* comps = GetComponents(); 00126 if (comps) 00127 { 00128 G4CollisionVector::const_iterator iter; 00129 for (iter = comps->begin(); iter != comps->end(); ++iter) 00130 { 00131 if ( ((*iter))->IsInCharge(trk1,trk2) ) isInCharge = true; 00132 } 00133 } 00134 00135 return isInCharge; 00136 }