00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #define INCLXX_IN_GEANT4_MODE 1
00034
00035 #include "globals.hh"
00036
00037 #include "G4INCLPionNucleonChannel.hh"
00038 #include "G4INCLKinematicsUtils.hh"
00039 #include "G4INCLBinaryCollisionAvatar.hh"
00040 #include "G4INCLRandom.hh"
00041 #include "G4INCLGlobals.hh"
00042 #include "G4INCLLogger.hh"
00043
00044 namespace G4INCL {
00045
00046 PionNucleonChannel::PionNucleonChannel(Particle *p1, Particle *p2, Nucleus *nucleus, const G4bool localE)
00047 : theNucleus(nucleus), particle1(p1), particle2(p2), locE(localE)
00048 {
00049
00050 }
00051
00052 PionNucleonChannel::~PionNucleonChannel(){
00053
00054 }
00055
00056 FinalState* PionNucleonChannel::getFinalState() {
00057 FinalState *fs = new FinalState;
00058
00059 Particle * nucleon;
00060 Particle * pion;
00061 if(particle1->isNucleon()) {
00062 nucleon = particle1;
00063 pion = particle2;
00064 } else {
00065 nucleon = particle2;
00066 pion = particle1;
00067 }
00068
00069 ParticleType deltaType = DeltaZero;
00070 if(ParticleConfig::isPair(particle1, particle2, Proton, PiPlus)) {
00071 deltaType = DeltaPlusPlus;
00072 } else if(ParticleConfig::isPair(particle1, particle2, Neutron, PiPlus)) {
00073 deltaType = DeltaPlus;
00074 } else if(ParticleConfig::isPair(particle1, particle2, Proton, PiZero)) {
00075 deltaType = DeltaPlus;
00076 } else if(ParticleConfig::isPair(particle1, particle2, Neutron, PiZero)) {
00077 deltaType = DeltaZero;
00078 } else if(ParticleConfig::isPair(particle1, particle2, Proton, PiMinus)) {
00079 deltaType = DeltaZero;
00080 } else if(ParticleConfig::isPair(particle1, particle2, Neutron, PiMinus)) {
00081 deltaType = DeltaMinus;
00082 } else {
00083 ERROR("Unknown particle pair in Pi-N collision." << std::endl);
00084 }
00085
00086 G4double deltaEnergy = nucleon->getEnergy() - nucleon->getPotentialEnergy()
00087 + pion->getEnergy() - pion->getPotentialEnergy();
00088
00089 nucleon->setType(deltaType);
00090 deltaEnergy += theNucleus->getPotential()->computePotentialEnergy(nucleon);
00091 nucleon->setEnergy(deltaEnergy);
00092
00093 ThreeVector deltaMomentum = nucleon->getMomentum() + pion->getMomentum();
00094 nucleon->setMomentum(deltaMomentum);
00095
00096 const G4double deltaMass = std::sqrt(deltaEnergy*deltaEnergy - deltaMomentum.mag2());
00097 nucleon->setMass(deltaMass);
00098 theNucleus->updatePotentialEnergy(nucleon);
00099
00100 fs->addModifiedParticle(nucleon);
00101 fs->addDestroyedParticle(pion);
00102 return fs;
00103 }
00104
00105 }