66 delete theElementaryParticleCollider;
83 G4cout <<
" >>> G4LightTargetCollider::collide" <<
G4endl;
97 theElementaryParticleCollider->
collide(bullet, target, globalOutput);
103 if (ke < mP + mN - mD) {
105 G4Exception(
"G4LightTargetCollider::collide()",
"HAD_BERT_201",
106 JustWarning,
"Projectile energy below reaction threshold");
113 G4double gammaDXS = GammaDCrossSection(ke);
120 G4double totalDXS = gammaPXS + gammaNXS + gammaDXS;
121 probP = gammaPXS/totalDXS;
122 probN = (gammaPXS+gammaNXS)/totalDXS;
129 G4LorentzVector protonMomentum(fermiMomentum, std::sqrt(mP*mP + pFermiD*pFermiD) );
130 G4LorentzVector neutronMomentum(-fermiMomentum, std::sqrt(mN*mN + pFermiD*pFermiD) );
137 protonMomentum.
boost(toProtonRest);
138 bulletMomentum.
boost(toProtonRest);
148 globalOutput.
reset();
150 for (
G4int i = 0; i <
G4int(products.size()); i++) {
151 temp = products[i].getMomentum();
153 products[i].setMomentum(temp);
160 }
else if (rndm < probN) {
162 G4LorentzVector protonMomentum(fermiMomentum, std::sqrt(mP*mP + pFermiD*pFermiD) );
163 G4LorentzVector neutronMomentum(-fermiMomentum, std::sqrt(mN*mN + pFermiD*pFermiD) );
170 neutronMomentum.
boost(toNeutronRest);
171 bulletMomentum.
boost(toNeutronRest);
182 globalOutput.
reset();
184 for (
G4int i = 0; i <
G4int(products.size()); i++) {
185 temp = products[i].getMomentum();
187 products[i].setMomentum(temp);
195 NucleonPair products = AbsorptionOnDeuteron(bullet);
196 globalOutput.
reset();
215 G4Exception(
"G4LightTargetCollider::collide()",
"HAD_BERT_203",
230 if (gammaEnergy > 0.144 && gammaEnergy < 0.42) {
231 term = (gammaEnergy - 0.24)/0.155;
232 sigma = 0.065*std::exp(-term*term);
233 }
else if (gammaEnergy >= 0.42) {
234 sigma = 0.000526/gammaEnergy/gammaEnergy/gammaEnergy/gammaEnergy;
249 G4double S = bulletMass*bulletMass + mD*mD + 2.*mD*bulletE;
260 qcm = std::sqrt( (
S - (mP + mN)*(mP + mN)) * (
S - (mP - mN)*(mP - mN))/
S/4.);
261 Mom1.
setE(std::sqrt(mP*mP + qcm*qcm) );
263 Mom2.
setE(std::sqrt(mN*mN + qcm*qcm) );
267 qcm = std::sqrt( (
S - 4.*mP*mP)/4.);
268 Mom1.
setE(std::sqrt(mP*mP + qcm*qcm) );
270 Mom2.
setE(std::sqrt(mP*mP + qcm*qcm) );
274 qcm = std::sqrt( (
S - 4.*mN*mN)/4.);
275 Mom1.
setE(std::sqrt(mN*mN + qcm*qcm) );
277 Mom2.
setE(std::sqrt(mN*mN + qcm*qcm) );
281 G4Exception(
"G4LightTargetCollider::collide()",
"HAD_BERT_204",
318 std::vector<G4double> masses;
323 std::vector<G4LorentzVector> cmMomenta;
324 std::vector<G4int> particle_kinds;
326 G4int itry_max = 200;
332 while (generate && itry < itry_max) {
333 particle_kinds.clear();
336 for (
G4int i = 0; i < mult; i++) {
338 masses.push_back(mass);
350 if (itry == itry_max) mult--;
357 G4Exception(
"G4LightTargetCollider::SingleNucleonScattering()",
"HAD_BERT_202",
360 finalState.push_back(projectile);
361 finalState.push_back(nucleon);
364 for (
G4int i = 0; i < mult; i++) {
366 finalState.push_back(fsPart);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::vector< G4InuclElementaryParticle > ScatteringProducts
std::pair< G4InuclElementaryParticle, G4InuclElementaryParticle > NucleonPair
G4ThreeVector G4RandomDirection()
G4GLOB_DLL std::ostream G4cout
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
void setVect(const Hep3Vector &)
Hep3Vector findBoostToCM() const
static const G4CascadeChannel * GetTable(G4int initialState)
virtual G4int getMultiplicity(G4double ke) const =0
virtual G4double getCrossSection(double ke) const =0
virtual void getOutgoingParticleTypes(std::vector< G4int > &kinds, G4int mult, G4double ke) const =0
virtual void setVerboseLevel(G4int verbose=0)
void Configure(G4InuclElementaryParticle *bullet, G4InuclElementaryParticle *target, const std::vector< G4int > &particle_kinds)
G4int numberOfOutgoingParticles() const
void addOutgoingParticle(const G4InuclElementaryParticle &particle)
void setVerboseLevel(G4int verbose)
void trivialise(G4InuclParticle *bullet, G4InuclParticle *target)
static G4Deuteron * Deuteron()
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
G4bool Generate(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
static G4double getParticleMass(G4int type)
const G4ParticleDefinition * getDefinition() const
G4double getKineticEnergy() const
G4LorentzVector getMomentum() const
G4double getMomModule() const
G4double getEnergy() const
virtual ~G4LightTargetCollider()
void setVerboseLevel(G4int verbose=0)
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &globalOutput)
static G4Neutron * Neutron()
G4double GetPDGMass() const
const G4String & GetParticleName() const
static G4PionMinus * PionMinus()
static G4PionPlus * PionPlus()
static G4PionZero * PionZero()
static G4Proton * Proton()
void generate(const G4double sqrtS, ParticleList &particles)
Generate an event in the CM system.
G4bool nucleon(G4int ityp)