Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // INCL++ intra-nuclear cascade model 26 // INCL++ intra-nuclear cascade model 27 // Alain Boudard, CEA-Saclay, France << 27 // Pekka Kaitaniemi, CEA and Helsinki Institute of Physics 28 // Joseph Cugnon, University of Liege, Belgium << 28 // Davide Mancusi, CEA 29 // Jean-Christophe David, CEA-Saclay, France << 29 // Alain Boudard, CEA 30 // Pekka Kaitaniemi, CEA-Saclay, France, and H << 30 // Sylvie Leray, CEA 31 // Sylvie Leray, CEA-Saclay, France << 31 // Joseph Cugnon, University of Liege 32 // Davide Mancusi, CEA-Saclay, France << 33 // 32 // 34 #define INCLXX_IN_GEANT4_MODE 1 33 #define INCLXX_IN_GEANT4_MODE 1 35 34 36 #include "globals.hh" 35 #include "globals.hh" 37 36 38 #include "G4INCLKinematicsUtils.hh" 37 #include "G4INCLKinematicsUtils.hh" 39 #include "G4INCLParticleTable.hh" 38 #include "G4INCLParticleTable.hh" 40 39 41 namespace G4INCL { 40 namespace G4INCL { 42 41 43 namespace KinematicsUtils { << 42 void KinematicsUtils::transformToLocalEnergyFrame(Nucleus const * const n, Particle * const p) { 44 << 43 const G4double localEnergy = KinematicsUtils::getLocalEnergy(n, p); 45 G4double fiveParFit (const G4double a, const << 46 return a+b*std::pow(x, c)+d*std::log(x)+e* << 47 } << 48 << 49 G4double compute_xs(const std::vector<G4doub << 50 G4double sigma = 0.; << 51 G4double Ethreshold = 0.0; << 52 if(coefficients.size() == 6){ << 53 Ethreshold = coefficients[5]; << 54 if(Ethreshold >= 5){ //there are no << 55 if(pLab > Ethreshold){ // E is E << 56 return 0.; << 57 } << 58 } << 59 else{ << 60 if(pLab < Ethreshold){ << 61 return 0.; << 62 } << 63 } << 64 } << 65 << 66 sigma = fiveParFit(coefficients[0],coeff << 67 if(sigma < 0.){ << 68 return 0.; << 69 }; << 70 return sigma; << 71 } << 72 << 73 void transformToLocalEnergyFrame(Nucleus con << 74 // assert(!p->isMeson() && !p->isPhoton() && ! << 75 const G4double localEnergy = getLocalEnerg << 76 const G4double localTotalEnergy = p->getEn 44 const G4double localTotalEnergy = p->getEnergy() - localEnergy; 77 p->setEnergy(localTotalEnergy); 45 p->setEnergy(localTotalEnergy); 78 p->adjustMomentumFromEnergy(); 46 p->adjustMomentumFromEnergy(); 79 } 47 } 80 48 81 G4double getLocalEnergy(Nucleus const * cons << 49 G4double KinematicsUtils::getLocalEnergy(Nucleus const * const n, Particle * const p) { 82 // assert(!p->isMeson() && !p->isPhoton() && ! << 50 // assert(!p->isPion()); // No local energy for pions >> 51 83 G4double vloc = 0.0; 52 G4double vloc = 0.0; 84 const G4double r = p->getPosition().mag(); 53 const G4double r = p->getPosition().mag(); 85 const G4double mass = p->getMass(); 54 const G4double mass = p->getMass(); 86 55 87 // Local energy is constant outside the su 56 // Local energy is constant outside the surface 88 if(r > n->getUniverseRadius()) { 57 if(r > n->getUniverseRadius()) { 89 INCL_WARN("Tried to evaluate local energ << 58 WARN("Tried to evaluate local energy for a particle outside the maximum radius." 90 << '\n' << p->print() << '\n' << 59 << std::endl << p->print() << std::endl 91 << "Maximum radius = " << n->getDe << 60 << "Maximum radius = " << n->getDensity()->getMaximumRadius() << std::endl 92 << "Universe radius = " << n->getU << 61 << "Universe radius = " << n->getUniverseRadius() << std::endl); 93 return 0.0; 62 return 0.0; 94 } 63 } 95 64 96 G4double pfl0 = 0.0; 65 G4double pfl0 = 0.0; 97 const ParticleType t = p->getType(); << 98 const G4double kinE = p->getKineticEnergy( 66 const G4double kinE = p->getKineticEnergy(); 99 if(kinE <= n->getPotential()->getFermiEner << 67 if(kinE <= n->getPotential()->getFermiEnergy(p->getType())) { 100 pfl0 = n->getPotential()->getFermiMoment 68 pfl0 = n->getPotential()->getFermiMomentum(p); 101 } else { 69 } else { 102 const G4double tf0 = p->getPotentialEner 70 const G4double tf0 = p->getPotentialEnergy() - n->getPotential()->getSeparationEnergy(p); 103 if(tf0<0.0) return 0.0; 71 if(tf0<0.0) return 0.0; 104 pfl0 = std::sqrt(tf0*(tf0 + 2.0*mass)); << 72 pfl0 = std::sqrt(tf0*(tf0 + 2.0*mass)); 105 } 73 } 106 const G4double pReflection = p->getReflect << 74 const G4double pl = pfl0*n->getDensity()->getMaxTFromR(r); 107 const G4double reflectionRadius = n->getDe << 108 const G4double pNominal = p->getMomentum() << 109 const G4double nominalReflectionRadius = n << 110 const G4double pl = pfl0*n->getDensity()-> << 111 vloc = std::sqrt(pl*pl + mass*mass) - mass 75 vloc = std::sqrt(pl*pl + mass*mass) - mass; 112 76 113 return vloc; 77 return vloc; 114 } 78 } 115 79 116 ThreeVector makeBoostVector(Particle const * << 80 ThreeVector KinematicsUtils::makeBoostVector(Particle const * const p1, Particle const * const p2){ 117 const G4double totalEnergy = p1->getEnergy 81 const G4double totalEnergy = p1->getEnergy() + p2->getEnergy(); 118 return ((p1->getMomentum() + p2->getMoment 82 return ((p1->getMomentum() + p2->getMomentum())/totalEnergy); 119 } 83 } 120 84 121 G4double totalEnergyInCM(Particle const * co << 85 G4double KinematicsUtils::totalEnergyInCM(Particle const * const p1, Particle const * const p2){ 122 return std::sqrt(squareTotalEnergyInCM(p1, 86 return std::sqrt(squareTotalEnergyInCM(p1,p2)); 123 } 87 } 124 88 125 G4double squareTotalEnergyInCM(Particle cons << 89 G4double KinematicsUtils::squareTotalEnergyInCM(Particle const * const p1, Particle const * const p2) { 126 G4double beta2 = makeBoostVector(p1, p2).m << 90 G4double beta2 = KinematicsUtils::makeBoostVector(p1, p2).mag2(); 127 if(beta2 > 1.0) { 91 if(beta2 > 1.0) { 128 INCL_ERROR("squareTotalEnergyInCM: beta2 << 92 ERROR("KinematicsUtils::squareTotalEnergyInCM: beta2 == " << beta2 << " > 1.0" << std::endl); 129 beta2 = 0.0; 93 beta2 = 0.0; 130 } 94 } 131 return (1.0 - beta2)*std::pow(p1->getEnerg 95 return (1.0 - beta2)*std::pow(p1->getEnergy() + p2->getEnergy(), 2); 132 } 96 } 133 97 134 G4double momentumInCM(Particle const * const << 98 G4double KinematicsUtils::momentumInCM(Particle const * const p1, Particle const * const p2) { 135 const G4double m1sq = std::pow(p1->getMass 99 const G4double m1sq = std::pow(p1->getMass(),2); 136 const G4double m2sq = std::pow(p2->getMass 100 const G4double m2sq = std::pow(p2->getMass(),2); 137 const G4double z = p1->getEnergy()*p2->get 101 const G4double z = p1->getEnergy()*p2->getEnergy() - p1->getMomentum().dot(p2->getMomentum()); 138 G4double pcm2 = (z*z-m1sq*m2sq)/(2*z+m1sq+ 102 G4double pcm2 = (z*z-m1sq*m2sq)/(2*z+m1sq+m2sq); 139 if(pcm2 < 0.0) { 103 if(pcm2 < 0.0) { 140 INCL_ERROR("momentumInCM: pcm2 == " << p << 104 ERROR("KinematicsUtils::momentumInCM: pcm2 == " << pcm2 << " < 0.0" << std::endl); 141 pcm2 = 0.0; 105 pcm2 = 0.0; 142 } 106 } 143 return std::sqrt(pcm2); 107 return std::sqrt(pcm2); 144 } 108 } 145 109 146 G4double momentumInCM(const G4double E, cons << 110 G4double KinematicsUtils::momentumInCM(const G4double E, const G4double M1, const G4double M2) { 147 return 0.5*std::sqrt((E*E - std::pow(M1 + 111 return 0.5*std::sqrt((E*E - std::pow(M1 + M2, 2)) 148 *(E*E - std::pow(M1 - M2, 2)))/E; 112 *(E*E - std::pow(M1 - M2, 2)))/E; 149 } 113 } 150 114 151 G4double momentumInLab(const G4double s, con << 115 G4double KinematicsUtils::momentumInLab(const G4double s, const G4double m1, const G4double m2) { 152 const G4double m1sq = m1*m1; 116 const G4double m1sq = m1*m1; 153 const G4double m2sq = m2*m2; 117 const G4double m2sq = m2*m2; 154 G4double plab2 = (s*s-2*s*(m1sq+m2sq)+(m1s 118 G4double plab2 = (s*s-2*s*(m1sq+m2sq)+(m1sq-m2sq)*(m1sq-m2sq))/(4*m2sq); 155 if(plab2 < 0.0) { 119 if(plab2 < 0.0) { 156 INCL_ERROR("momentumInLab: plab2 == " << << 120 ERROR("KinematicsUtils::momentumInLab: plab2 == " << plab2 << " < 0.0; m1sq == " << m1sq << "; m2sq == " << m2sq << "; s == " << s << std::endl); 157 plab2 = 0.0; 121 plab2 = 0.0; 158 } 122 } 159 return std::sqrt(plab2); 123 return std::sqrt(plab2); 160 } 124 } 161 125 162 G4double momentumInLab(Particle const * cons << 126 G4double KinematicsUtils::momentumInLab(Particle const * const p1, Particle const * const p2) { 163 const G4double m1 = p1->getMass(); 127 const G4double m1 = p1->getMass(); 164 const G4double m2 = p2->getMass(); 128 const G4double m2 = p2->getMass(); 165 const G4double s = squareTotalEnergyInCM(p 129 const G4double s = squareTotalEnergyInCM(p1, p2); 166 return momentumInLab(s, m1, m2); << 130 return KinematicsUtils::momentumInLab(s, m1, m2); 167 } 131 } 168 132 169 G4double sumTotalEnergies(const ParticleList << 133 G4double KinematicsUtils::sumTotalEnergies(const ParticleList &pl) { 170 G4double E = 0.0; 134 G4double E = 0.0; 171 for(ParticleIter i=pl.begin(), e=pl.end(); << 135 for(ParticleIter i = pl.begin(); i != pl.end(); ++i) { 172 E += (*i)->getEnergy(); 136 E += (*i)->getEnergy(); 173 } 137 } 174 return E; 138 return E; 175 } 139 } 176 140 177 ThreeVector sumMomenta(const ParticleList &p << 141 ThreeVector KinematicsUtils::sumMomenta(const ParticleList &pl) { 178 ThreeVector p(0.0, 0.0, 0.0); 142 ThreeVector p(0.0, 0.0, 0.0); 179 for(ParticleIter i=pl.begin(), e=pl.end(); << 143 for(ParticleIter i = pl.begin(); i != pl.end(); ++i) { 180 p += (*i)->getMomentum(); 144 p += (*i)->getMomentum(); 181 } 145 } 182 return p; 146 return p; 183 } 147 } 184 148 185 G4double energy(const ThreeVector &p, const << 149 G4double KinematicsUtils::energy(const ThreeVector &p, const G4double m) { 186 return std::sqrt(p.mag2() + m*m); 150 return std::sqrt(p.mag2() + m*m); 187 } 151 } 188 152 189 G4double invariantMass(const G4double E, con << 153 G4double KinematicsUtils::invariantMass(const G4double E, const ThreeVector & p) { 190 return std::sqrt(squareInvariantMass(E, p) << 154 return std::sqrt(E*E - p.mag2()); 191 } 155 } 192 156 193 G4double squareInvariantMass(const G4double << 157 G4double KinematicsUtils::gammaFromKineticEnergy(const ParticleSpecies &p, const G4double EKin) { 194 return E*E - p.mag2(); << 195 } << 196 << 197 G4double gammaFromKineticEnergy(const Partic << 198 G4double mass; 158 G4double mass; 199 if(p.theType==Composite) 159 if(p.theType==Composite) 200 mass = ParticleTable::getTableMass(p.the << 160 mass = ParticleTable::getTableMass(p.theA, p.theZ); 201 else 161 else 202 mass = ParticleTable::getTableParticleMa 162 mass = ParticleTable::getTableParticleMass(p.theType); 203 return (1.+EKin/mass); 163 return (1.+EKin/mass); 204 } << 205 << 206 } 164 } 207 165 208 } 166 } 209 167