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 // Alain Boudard, CEA-Saclay, France 28 // Joseph Cugnon, University of Liege, Belgium 28 // Joseph Cugnon, University of Liege, Belgium 29 // Jean-Christophe David, CEA-Saclay, France 29 // Jean-Christophe David, CEA-Saclay, France 30 // Pekka Kaitaniemi, CEA-Saclay, France, and H 30 // Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland 31 // Sylvie Leray, CEA-Saclay, France 31 // Sylvie Leray, CEA-Saclay, France 32 // Davide Mancusi, CEA-Saclay, France 32 // Davide Mancusi, CEA-Saclay, France 33 // 33 // 34 #define INCLXX_IN_GEANT4_MODE 1 34 #define INCLXX_IN_GEANT4_MODE 1 35 35 36 #include "globals.hh" 36 #include "globals.hh" 37 37 38 /** \file G4INCLEventInfo.cc 38 /** \file G4INCLEventInfo.cc 39 * \brief Simple container for output of event 39 * \brief Simple container for output of event results. 40 * 40 * 41 * Contains the results of an INCL cascade. 41 * Contains the results of an INCL cascade. 42 * 42 * 43 * \date 21 January 2011 43 * \date 21 January 2011 44 * \author Davide Mancusi 44 * \author Davide Mancusi 45 */ 45 */ 46 46 47 #include "G4INCLEventInfo.hh" 47 #include "G4INCLEventInfo.hh" 48 #include "G4INCLGlobals.hh" 48 #include "G4INCLGlobals.hh" 49 #include "G4INCLParticleTable.hh" 49 #include "G4INCLParticleTable.hh" 50 #include "G4INCLParticle.hh" 50 #include "G4INCLParticle.hh" 51 #include <cmath> 51 #include <cmath> 52 52 53 namespace G4INCL { 53 namespace G4INCL { 54 54 55 G4ThreadLocal Int_t EventInfo::eventNumber = 55 G4ThreadLocal Int_t EventInfo::eventNumber = 0; 56 56 57 void EventInfo::fillInverseKinematics(const 57 void EventInfo::fillInverseKinematics(const Double_t gamma) { 58 const Double_t beta = std::sqrt(1.-1./(gam 58 const Double_t beta = std::sqrt(1.-1./(gamma*gamma)); 59 for(Int_t i=0; i<nParticles; ++i) { 59 for(Int_t i=0; i<nParticles; ++i) { 60 // determine the particle mass from the 60 // determine the particle mass from the kinetic energy and the momentum; 61 // this ensures consistency with the mas 61 // this ensures consistency with the masses uses by the models 62 Double_t mass; 62 Double_t mass; 63 if(EKin[i]>0.) { 63 if(EKin[i]>0.) { 64 mass = std::max( 64 mass = std::max( 65 0.5 * (px[i]*px[i]+py[ 65 0.5 * (px[i]*px[i]+py[i]*py[i]+pz[i]*pz[i]-EKin[i]*EKin[i]) / EKin[i], 66 0.0); 66 0.0); 67 } else { 67 } else { 68 INCL_WARN("Particle with null kinetic 68 INCL_WARN("Particle with null kinetic energy in fillInverseKinematics, cannot determine its mass:\n" 69 << " A=" << A[i] << ", Z=" 69 << " A=" << A[i] << ", Z=" << Z[i] << ", S=" << S[i] << '\n' 70 << " EKin=" << EKin[i] << " 70 << " EKin=" << EKin[i] << ", px=" << px[i] << ", py=" << py[i] << ", pz=" << pz[i] << '\n' 71 << " Falling back to the ma 71 << " Falling back to the mass from the INCL ParticleTable" << '\n'); 72 mass = ParticleTable::getRealMass(A[i] 72 mass = ParticleTable::getRealMass(A[i], Z[i], S[i]); 73 } 73 } 74 74 75 const Double_t ETot = EKin[i] + mass; 75 const Double_t ETot = EKin[i] + mass; 76 const Double_t ETotPrime = gamma*(ETot - 76 const Double_t ETotPrime = gamma*(ETot - beta*pz[i]); 77 EKinPrime[i] = ETotPrime - mass; 77 EKinPrime[i] = ETotPrime - mass; 78 pzPrime[i] = -gamma*(pz[i] - beta*ETot); 78 pzPrime[i] = -gamma*(pz[i] - beta*ETot); 79 const Double_t pPrime = std::sqrt(px[i]* 79 const Double_t pPrime = std::sqrt(px[i]*px[i] + py[i]*py[i] + pzPrime[i]*pzPrime[i]); 80 const Double_t cosThetaPrime = (pPrime>0 80 const Double_t cosThetaPrime = (pPrime>0.) ? (pzPrime[i]/pPrime) : 1.; 81 if(cosThetaPrime>=1.) 81 if(cosThetaPrime>=1.) 82 thetaPrime[i] = 0.; 82 thetaPrime[i] = 0.; 83 else if(cosThetaPrime<=-1.) 83 else if(cosThetaPrime<=-1.) 84 thetaPrime[i] = 180.; 84 thetaPrime[i] = 180.; 85 else 85 else 86 thetaPrime[i] = Math::toDegrees(Math:: 86 thetaPrime[i] = Math::toDegrees(Math::arcCos(cosThetaPrime)); 87 } 87 } 88 } 88 } 89 89 90 void EventInfo::remnantToParticle(const G4in 90 void EventInfo::remnantToParticle(const G4int remnantIndex) { 91 91 92 INCL_DEBUG("remnantToParticle function use 92 INCL_DEBUG("remnantToParticle function used\n"); 93 93 94 A[nParticles] = ARem[remnantIndex]; 94 A[nParticles] = ARem[remnantIndex]; 95 Z[nParticles] = ZRem[remnantIndex]; 95 Z[nParticles] = ZRem[remnantIndex]; 96 S[nParticles] = SRem[remnantIndex]; 96 S[nParticles] = SRem[remnantIndex]; 97 J[nParticles] = JRem[remnantIndex]; << 97 98 << 99 << 100 ParticleSpecies pt(A[nParticles],Z[nParticle 98 ParticleSpecies pt(A[nParticles],Z[nParticles],S[nParticles]); 101 PDGCode[nParticles] = pt.getPDGCode(); 99 PDGCode[nParticles] = pt.getPDGCode(); 102 100 103 ParticleBias[nParticles] = Particle::getTo 101 ParticleBias[nParticles] = Particle::getTotalBias(); 104 emissionTime[nParticles] = stoppingTime; 102 emissionTime[nParticles] = stoppingTime; 105 103 106 px[nParticles] = pxRem[remnantIndex]; 104 px[nParticles] = pxRem[remnantIndex]; 107 py[nParticles] = pyRem[remnantIndex]; 105 py[nParticles] = pyRem[remnantIndex]; 108 pz[nParticles] = pzRem[remnantIndex]; 106 pz[nParticles] = pzRem[remnantIndex]; 109 107 110 const G4double plab = std::sqrt(pxRem[remn 108 const G4double plab = std::sqrt(pxRem[remnantIndex]*pxRem[remnantIndex] 111 +pyRem[remna 109 +pyRem[remnantIndex]*pyRem[remnantIndex] 112 +pzRem[remna 110 +pzRem[remnantIndex]*pzRem[remnantIndex]); 113 if(plab != 0.0){ << 111 G4double pznorm = pzRem[remnantIndex]/plab; 114 G4double pznorm = pzRem[remnantIndex]/pl << 112 if(pznorm>1.) 115 if(pznorm>1.) pznorm = 1.; << 113 pznorm = 1.; 116 else if(pznorm<-1.) pznorm = -1.; << 114 else if(pznorm<-1.) >> 115 pznorm = -1.; 117 theta[nParticles] = Math::toDegrees(Math:: 116 theta[nParticles] = Math::toDegrees(Math::arcCos(pznorm)); 118 phi[nParticles] = Math::toDegrees(std::ata 117 phi[nParticles] = Math::toDegrees(std::atan2(pyRem[remnantIndex],pxRem[remnantIndex])); >> 118 119 EKin[nParticles] = EKinRem[remnantIndex]; 119 EKin[nParticles] = EKinRem[remnantIndex]; 120 } << 121 else{ << 122 theta[nParticles] = 0.0; << 123 phi[nParticles] = 0.0; << 124 EKin[nParticles] = 0.0; << 125 } << 126 origin[nParticles] = -1; // Origin: cascad 120 origin[nParticles] = -1; // Origin: cascade 127 #ifdef INCLXX_IN_GEANT4_MODE << 128 parentResonancePDGCode[nParticles] = 0; / << 129 parentResonanceID[nParticles] = 0; / << 130 #endif << 131 history.push_back(""); // history 121 history.push_back(""); // history 132 nParticles++; 122 nParticles++; 133 // assert(history.size()==(unsigned int)nParti 123 // assert(history.size()==(unsigned int)nParticles); 134 } 124 } 135 } 125 } 136 126 137 127