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 // 080505 Fixed and changed sampling method of 26 // 080505 Fixed and changed sampling method of impact parameter by T. Koi 27 // 080602 Fix memory leaks by T. Koi 27 // 080602 Fix memory leaks by T. Koi 28 // 080612 Delete unnecessary dependency and un 28 // 080612 Delete unnecessary dependency and unused functions 29 // Change criterion of reaction by T. K 29 // Change criterion of reaction by T. Koi 30 // 081107 Add UnUseGEM (then use the default c 30 // 081107 Add UnUseGEM (then use the default channel of G4Evaporation) 31 // UseFrag (chage criterion of a in 31 // UseFrag (chage criterion of a inelastic reaction) 32 // Fix bug in nucleon projectiles by T 32 // Fix bug in nucleon projectiles by T. Koi 33 // 090122 Be8 -> Alpha + Alpha 33 // 090122 Be8 -> Alpha + Alpha 34 // 090331 Change member shenXS and genspaXS ob 34 // 090331 Change member shenXS and genspaXS object to pointer 35 // 091119 Fix for incidence of neutral particl 35 // 091119 Fix for incidence of neutral particles 36 // 36 // 37 #include "G4QMDReaction.hh" 37 #include "G4QMDReaction.hh" 38 #include "G4QMDNucleus.hh" 38 #include "G4QMDNucleus.hh" 39 #include "G4QMDGroundStateNucleus.hh" 39 #include "G4QMDGroundStateNucleus.hh" 40 #include "G4Pow.hh" 40 #include "G4Pow.hh" 41 #include "G4PhysicalConstants.hh" 41 #include "G4PhysicalConstants.hh" 42 #include "G4SystemOfUnits.hh" 42 #include "G4SystemOfUnits.hh" 43 #include "G4NistManager.hh" 43 #include "G4NistManager.hh" 44 44 45 #include "G4CrossSectionDataSetRegistry.hh" 45 #include "G4CrossSectionDataSetRegistry.hh" 46 #include "G4BGGPionElasticXS.hh" << 47 #include "G4BGGPionInelasticXS.hh" << 48 #include "G4VCrossSectionDataSet.hh" << 49 #include "G4CrossSectionInelastic.hh" << 50 #include "G4ComponentGGNuclNuclXsc.hh" << 51 #include "G4PhysicsModelCatalog.hh" << 52 << 53 46 54 G4QMDReaction::G4QMDReaction() 47 G4QMDReaction::G4QMDReaction() 55 : G4HadronicInteraction("QMDModel") 48 : G4HadronicInteraction("QMDModel") 56 , system ( NULL ) 49 , system ( NULL ) 57 , deltaT ( 1 ) // in fsec (c=1) 50 , deltaT ( 1 ) // in fsec (c=1) 58 , maxTime ( 100 ) // will have maxTime-th time 51 , maxTime ( 100 ) // will have maxTime-th time step 59 , envelopF ( 1.05 ) // 10% for Peripheral reac 52 , envelopF ( 1.05 ) // 10% for Peripheral reactions 60 , gem ( true ) 53 , gem ( true ) 61 , frag ( false ) 54 , frag ( false ) 62 , secID( -1 ) << 63 { 55 { 64 theXS = new G4CrossSectionInelastic( new G4 << 65 pipElNucXS = new G4BGGPionElasticXS(G4PionP << 66 pipElNucXS->BuildPhysicsTable(*(G4PionPlus: << 67 << 68 pimElNucXS = new G4BGGPionElasticXS(G4PionM << 69 pimElNucXS->BuildPhysicsTable(*(G4PionMinus << 70 << 71 pipInelNucXS = new G4BGGPionInelasticXS(G4P << 72 pipInelNucXS->BuildPhysicsTable(*(G4PionPlu << 73 << 74 pimInelNucXS = new G4BGGPionInelasticXS(G4P << 75 pimInelNucXS->BuildPhysicsTable(*(G4PionMin << 76 56 >> 57 //090331 >> 58 shenXS = new G4IonsShenCrossSection(); >> 59 //genspaXS = new G4GeneralSpaceNNCrossSection(); >> 60 piNucXS = (G4PiNuclearCrossSection*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4PiNuclearCrossSection::Default_Name()); 77 meanField = new G4QMDMeanField(); 61 meanField = new G4QMDMeanField(); 78 collision = new G4QMDCollision(); 62 collision = new G4QMDCollision(); 79 63 80 excitationHandler = new G4ExcitationHandler << 64 excitationHandler = new G4ExcitationHandler; >> 65 excitationHandler->SetDeexChannelsType( fCombined ); >> 66 //fEvaporation - 8 default channels >> 67 //fCombined - 8 default + 60 GEM >> 68 //fGEM - 2 default + 66 GEM >> 69 evaporation = new G4Evaporation; >> 70 excitationHandler->SetEvaporation( evaporation ); 81 setEvaporationCh(); 71 setEvaporationCh(); 82 72 83 coulomb_collision_gamma_proj = 0.0; 73 coulomb_collision_gamma_proj = 0.0; 84 coulomb_collision_rx_proj = 0.0; 74 coulomb_collision_rx_proj = 0.0; 85 coulomb_collision_rz_proj = 0.0; 75 coulomb_collision_rz_proj = 0.0; 86 coulomb_collision_px_proj = 0.0; 76 coulomb_collision_px_proj = 0.0; 87 coulomb_collision_pz_proj = 0.0; 77 coulomb_collision_pz_proj = 0.0; 88 78 89 coulomb_collision_gamma_targ = 0.0; 79 coulomb_collision_gamma_targ = 0.0; 90 coulomb_collision_rx_targ = 0.0; 80 coulomb_collision_rx_targ = 0.0; 91 coulomb_collision_rz_targ = 0.0; 81 coulomb_collision_rz_targ = 0.0; 92 coulomb_collision_px_targ = 0.0; 82 coulomb_collision_px_targ = 0.0; 93 coulomb_collision_pz_targ = 0.0; 83 coulomb_collision_pz_targ = 0.0; 94 84 95 secID = G4PhysicsModelCatalog::GetModelID( << 96 } 85 } 97 86 98 87 >> 88 99 G4QMDReaction::~G4QMDReaction() 89 G4QMDReaction::~G4QMDReaction() 100 { 90 { >> 91 delete evaporation; 101 delete excitationHandler; 92 delete excitationHandler; 102 delete collision; 93 delete collision; 103 delete meanField; 94 delete meanField; 104 } 95 } 105 96 106 97 >> 98 107 G4HadFinalState* G4QMDReaction::ApplyYourself( 99 G4HadFinalState* G4QMDReaction::ApplyYourself( const G4HadProjectile & projectile , G4Nucleus & target ) 108 { 100 { 109 //G4cout << "G4QMDReaction::ApplyYourself" 101 //G4cout << "G4QMDReaction::ApplyYourself" << G4endl; 110 102 111 theParticleChange.Clear(); 103 theParticleChange.Clear(); 112 104 113 system = new G4QMDSystem; 105 system = new G4QMDSystem; 114 106 115 G4int proj_Z = 0; 107 G4int proj_Z = 0; 116 G4int proj_A = 0; 108 G4int proj_A = 0; 117 const G4ParticleDefinition* proj_pd = ( con 109 const G4ParticleDefinition* proj_pd = ( const G4ParticleDefinition* ) projectile.GetDefinition(); 118 if ( proj_pd->GetParticleType() == "nucleus 110 if ( proj_pd->GetParticleType() == "nucleus" ) 119 { 111 { 120 proj_Z = proj_pd->GetAtomicNumber(); 112 proj_Z = proj_pd->GetAtomicNumber(); 121 proj_A = proj_pd->GetAtomicMass(); 113 proj_A = proj_pd->GetAtomicMass(); 122 } 114 } 123 else 115 else 124 { 116 { 125 proj_Z = (int)( proj_pd->GetPDGCharge()/ 117 proj_Z = (int)( proj_pd->GetPDGCharge()/eplus ); 126 proj_A = 1; 118 proj_A = 1; 127 } 119 } 128 //G4int targ_Z = int ( target.GetZ() + 0.5 120 //G4int targ_Z = int ( target.GetZ() + 0.5 ); 129 //G4int targ_A = int ( target.GetN() + 0.5 121 //G4int targ_A = int ( target.GetN() + 0.5 ); 130 //migrate to integer A and Z (GetN_asInt re 122 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this) 131 G4int targ_Z = target.GetZ_asInt(); 123 G4int targ_Z = target.GetZ_asInt(); 132 G4int targ_A = target.GetA_asInt(); 124 G4int targ_A = target.GetA_asInt(); 133 const G4ParticleDefinition* targ_pd = G4Ion 125 const G4ParticleDefinition* targ_pd = G4IonTable::GetIonTable()->GetIon( targ_Z , targ_A , 0.0 ); 134 126 135 127 136 //G4NistManager* nistMan = G4NistManager::I 128 //G4NistManager* nistMan = G4NistManager::Instance(); 137 // G4Element* G4NistManager::FindOrBuildElem 129 // G4Element* G4NistManager::FindOrBuildElement( targ_Z ); 138 130 139 const G4DynamicParticle* proj_dp = new G4Dy 131 const G4DynamicParticle* proj_dp = new G4DynamicParticle ( proj_pd , projectile.Get4Momentum() ); 140 //const G4Element* targ_ele = nistMan->Fin 132 //const G4Element* targ_ele = nistMan->FindOrBuildElement( targ_Z ); 141 //G4double aTemp = projectile.GetMaterial() 133 //G4double aTemp = projectile.GetMaterial()->GetTemperature(); 142 134 143 // Glauber-Gribov nucleus-nucleus cross sec << 135 //090331 144 // therefore call GetElementCrossSection in << 136 145 //G4double xs_0 = theXS->GetIsoCrossSection << 137 G4VCrossSectionDataSet* theXS = shenXS; 146 G4double xs_0 = theXS->GetElementCrossSecti << 138 147 << 139 if ( proj_pd->GetParticleType() == "meson" ) theXS = piNucXS; 148 // When the projectile is a pion << 149 if (proj_pd == G4PionPlus::PionPlus() ) { << 150 xs_0 = pipElNucXS->GetElementCrossSection << 151 pipInelNucXS->GetElementCrossSecti << 152 } else if (proj_pd == G4PionMinus::PionMinu << 153 xs_0 = pimElNucXS->GetElementCrossSection << 154 pimInelNucXS->GetElementCrossSecti << 155 } << 156 140 157 //G4double xs_0 = genspaXS->GetCrossSection 141 //G4double xs_0 = genspaXS->GetCrossSection ( proj_dp , targ_ele , aTemp ); 158 //G4double xs_0 = theXS->GetCrossSection ( 142 //G4double xs_0 = theXS->GetCrossSection ( proj_dp , targ_ele , aTemp ); 159 //110822 143 //110822 >> 144 G4double xs_0 = theXS->GetIsoCrossSection ( proj_dp , targ_Z , targ_A ); 160 145 161 G4double bmax_0 = std::sqrt( xs_0 / pi ); 146 G4double bmax_0 = std::sqrt( xs_0 / pi ); 162 //std::cout << "bmax_0 in fm (fermi) " << 147 //std::cout << "bmax_0 in fm (fermi) " << bmax_0/fermi << std::endl; 163 148 164 //delete proj_dp; 149 //delete proj_dp; 165 150 166 G4bool elastic = true; 151 G4bool elastic = true; 167 152 168 std::vector< G4QMDNucleus* > nucleuses; // 153 std::vector< G4QMDNucleus* > nucleuses; // Secondary nuceluses 169 G4ThreeVector boostToReac; // ReactionSyste 154 G4ThreeVector boostToReac; // ReactionSystem (CM or NN); 170 G4ThreeVector boostBackToLAB; // Reaction S 155 G4ThreeVector boostBackToLAB; // Reaction System to LAB; 171 156 172 G4LorentzVector targ4p( G4ThreeVector( 0.0 157 G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ_pd->GetPDGMass()/GeV ); 173 G4ThreeVector boostLABtoCM = targ4p.findBoo 158 G4ThreeVector boostLABtoCM = targ4p.findBoostToCM( proj_dp->Get4Momentum()/GeV ); // CM of target and proj; 174 159 175 G4double p1 = proj_dp->GetMomentum().mag()/ 160 G4double p1 = proj_dp->GetMomentum().mag()/GeV/proj_A; 176 G4double m1 = proj_dp->GetDefinition()->Get 161 G4double m1 = proj_dp->GetDefinition()->GetPDGMass()/GeV/proj_A; 177 G4double e1 = std::sqrt( p1*p1 + m1*m1 ); 162 G4double e1 = std::sqrt( p1*p1 + m1*m1 ); 178 G4double e2 = targ_pd->GetPDGMass()/GeV/tar 163 G4double e2 = targ_pd->GetPDGMass()/GeV/targ_A; 179 G4double beta_nn = -p1 / ( e1+e2 ); 164 G4double beta_nn = -p1 / ( e1+e2 ); 180 165 181 G4ThreeVector boostLABtoNN ( 0. , 0. , beta 166 G4ThreeVector boostLABtoNN ( 0. , 0. , beta_nn ); // CM of NN; 182 167 183 G4double beta_nncm = ( - boostLABtoCM.beta( 168 G4double beta_nncm = ( - boostLABtoCM.beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.beta() * boostLABtoNN.beta() ) ; 184 169 185 //std::cout << targ4p << std::endl; 170 //std::cout << targ4p << std::endl; 186 //std::cout << proj_dp->Get4Momentum()<< st 171 //std::cout << proj_dp->Get4Momentum()<< std::endl; 187 //std::cout << beta_nncm << std::endl; 172 //std::cout << beta_nncm << std::endl; 188 G4ThreeVector boostNNtoCM( 0. , 0. , beta_n 173 G4ThreeVector boostNNtoCM( 0. , 0. , beta_nncm ); // 189 G4ThreeVector boostCMtoNN( 0. , 0. , -beta_ 174 G4ThreeVector boostCMtoNN( 0. , 0. , -beta_nncm ); // 190 175 191 boostToReac = boostLABtoNN; 176 boostToReac = boostLABtoNN; 192 boostBackToLAB = -boostLABtoNN; 177 boostBackToLAB = -boostLABtoNN; 193 178 194 delete proj_dp; 179 delete proj_dp; 195 180 196 G4int icounter = 0; 181 G4int icounter = 0; 197 G4int icounter_max = 1024; 182 G4int icounter_max = 1024; 198 while ( elastic ) // Loop checking, 11.03.2 183 while ( elastic ) // Loop checking, 11.03.2015, T. Koi 199 { 184 { 200 icounter++; 185 icounter++; 201 if ( icounter > icounter_max ) { 186 if ( icounter > icounter_max ) { 202 G4cout << "Loop-counter exceeded the thresh 187 G4cout << "Loop-counter exceeded the threshold value at " << __LINE__ << "th line of " << __FILE__ << "." << G4endl; 203 break; 188 break; 204 } 189 } 205 190 206 // impact parameter 191 // impact parameter 207 //G4double bmax = 1.05*(bmax_0/fermi); 192 //G4double bmax = 1.05*(bmax_0/fermi); // 10% for Peripheral reactions 208 G4double bmax = envelopF*(bmax_0/fermi); 193 G4double bmax = envelopF*(bmax_0/fermi); 209 G4double b = bmax * std::sqrt ( G4Unifor 194 G4double b = bmax * std::sqrt ( G4UniformRand() ); 210 //071112 195 //071112 211 //G4double b = 0; 196 //G4double b = 0; 212 //G4double b = bmax; 197 //G4double b = bmax; 213 //G4double b = bmax/1.05 * 0.7 * G4Unifo 198 //G4double b = bmax/1.05 * 0.7 * G4UniformRand(); 214 199 215 //G4cout << "G4QMDRESULT bmax_0 = " << b 200 //G4cout << "G4QMDRESULT bmax_0 = " << bmax_0/fermi << " fm, bmax = " << bmax << " fm , b = " << b << " fm " << G4endl; 216 201 217 G4double plab = projectile.GetTotalMomen 202 G4double plab = projectile.GetTotalMomentum()/GeV; 218 G4double elab = ( projectile.GetKineticE 203 G4double elab = ( projectile.GetKineticEnergy() + proj_pd->GetPDGMass() + targ_pd->GetPDGMass() )/GeV; 219 204 220 calcOffSetOfCollision( b , proj_pd , tar 205 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN ); 221 206 222 // Projectile 207 // Projectile 223 G4LorentzVector proj4pLAB = projectile.G 208 G4LorentzVector proj4pLAB = projectile.Get4Momentum()/GeV; 224 209 225 G4QMDGroundStateNucleus* proj(NULL); 210 G4QMDGroundStateNucleus* proj(NULL); 226 if ( projectile.GetDefinition()->GetPart 211 if ( projectile.GetDefinition()->GetParticleType() == "nucleus" 227 || projectile.GetDefinition()->GetPart 212 || projectile.GetDefinition()->GetParticleName() == "proton" 228 || projectile.GetDefinition()->GetPart 213 || projectile.GetDefinition()->GetParticleName() == "neutron" ) 229 { 214 { 230 215 231 proj_Z = proj_pd->GetAtomicNumber(); 216 proj_Z = proj_pd->GetAtomicNumber(); 232 proj_A = proj_pd->GetAtomicMass(); 217 proj_A = proj_pd->GetAtomicMass(); 233 218 234 proj = new G4QMDGroundStateNucleus( p 219 proj = new G4QMDGroundStateNucleus( proj_Z , proj_A ); 235 //proj->ShowParticipants(); 220 //proj->ShowParticipants(); 236 221 237 222 238 meanField->SetSystem ( proj ); 223 meanField->SetSystem ( proj ); 239 proj->SetTotalPotential( meanField->G 224 proj->SetTotalPotential( meanField->GetTotalPotential() ); 240 proj->CalEnergyAndAngularMomentumInCM 225 proj->CalEnergyAndAngularMomentumInCM(); 241 226 242 } 227 } 243 228 244 // Target 229 // Target 245 //G4int iz = int ( target.GetZ() ); 230 //G4int iz = int ( target.GetZ() ); 246 //G4int ia = int ( target.GetN() ); 231 //G4int ia = int ( target.GetN() ); 247 //migrate to integer A and Z (GetN_asInt 232 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this) 248 G4int iz = int ( target.GetZ_asInt() ); 233 G4int iz = int ( target.GetZ_asInt() ); 249 G4int ia = int ( target.GetA_asInt() ); 234 G4int ia = int ( target.GetA_asInt() ); 250 235 251 G4QMDGroundStateNucleus* targ = new G4QM 236 G4QMDGroundStateNucleus* targ = new G4QMDGroundStateNucleus( iz , ia ); 252 237 253 meanField->SetSystem (targ ); 238 meanField->SetSystem (targ ); 254 targ->SetTotalPotential( meanField->GetT 239 targ->SetTotalPotential( meanField->GetTotalPotential() ); 255 targ->CalEnergyAndAngularMomentumInCM(); 240 targ->CalEnergyAndAngularMomentumInCM(); 256 241 257 //G4LorentzVector targ4p( G4ThreeVector( 242 //G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ->GetNuclearMass()/GeV ); 258 // Boost Vector to CM 243 // Boost Vector to CM 259 //boostToCM = targ4p.findBoostToCM( proj 244 //boostToCM = targ4p.findBoostToCM( proj4pLAB ); 260 245 261 // Target 246 // Target 262 for ( G4int i = 0 ; i < targ->GetTotalNu 247 for ( G4int i = 0 ; i < targ->GetTotalNumberOfParticipant() ; i++ ) 263 { 248 { 264 249 265 G4ThreeVector p0 = targ->GetParticipa 250 G4ThreeVector p0 = targ->GetParticipant( i )->GetMomentum(); 266 G4ThreeVector r0 = targ->GetParticipa 251 G4ThreeVector r0 = targ->GetParticipant( i )->GetPosition(); 267 252 268 G4ThreeVector p ( p0.x() + coulomb_co 253 G4ThreeVector p ( p0.x() + coulomb_collision_px_targ 269 , p0.y() 254 , p0.y() 270 , p0.z() * coulomb_co 255 , p0.z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ ); 271 256 272 G4ThreeVector r ( r0.x() + coulomb_co 257 G4ThreeVector r ( r0.x() + coulomb_collision_rx_targ 273 , r0.y() 258 , r0.y() 274 , r0.z() / coulomb_co 259 , r0.z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ ); 275 260 276 system->SetParticipant( new G4QMDPart 261 system->SetParticipant( new G4QMDParticipant( targ->GetParticipant( i )->GetDefinition() , p , r ) ); 277 system->GetParticipant( i )->SetTarge 262 system->GetParticipant( i )->SetTarget(); 278 263 279 } 264 } 280 265 281 G4LorentzVector proj4pCM = CLHEP::boostO 266 G4LorentzVector proj4pCM = CLHEP::boostOf ( proj4pLAB , boostToReac ); 282 G4LorentzVector targ4pCM = CLHEP::boostO 267 G4LorentzVector targ4pCM = CLHEP::boostOf ( targ4p , boostToReac ); 283 268 284 // Projectile 269 // Projectile 285 //G4cout << "proj : " << proj << G4endl; << 270 if ( proj != NULL ) 286 //if ( proj != NULL ) << 287 if ( proj_A != 1 ) << 288 { 271 { 289 272 290 // projectile is nucleus 273 // projectile is nucleus 291 274 292 for ( G4int i = 0 ; i < proj->GetTota 275 for ( G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ ) 293 { 276 { 294 277 295 G4ThreeVector p0 = proj->GetPartic 278 G4ThreeVector p0 = proj->GetParticipant( i )->GetMomentum(); 296 G4ThreeVector r0 = proj->GetPartic 279 G4ThreeVector r0 = proj->GetParticipant( i )->GetPosition(); 297 280 298 G4ThreeVector p ( p0.x() + coulomb 281 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 299 , p0.y() 282 , p0.y() 300 , p0.z() * coulomb 283 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 301 284 302 G4ThreeVector r ( r0.x() + coulomb 285 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 303 , r0.y() 286 , r0.y() 304 , r0.z() / coulomb 287 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 305 288 306 system->SetParticipant( new G4QMDP 289 system->SetParticipant( new G4QMDParticipant( proj->GetParticipant( i )->GetDefinition() , p , r ) ); 307 system->GetParticipant ( i + targ- 290 system->GetParticipant ( i + targ->GetTotalNumberOfParticipant() )->SetProjectile(); 308 } 291 } 309 292 310 } 293 } 311 else 294 else 312 { 295 { 313 296 314 // projectile is particle 297 // projectile is particle 315 298 316 // avoid multiple set in "elastic" lo 299 // avoid multiple set in "elastic" loop 317 //G4cout << "system Total Participant << 318 if ( system->GetTotalNumberOfParticip 300 if ( system->GetTotalNumberOfParticipant() == targ->GetTotalNumberOfParticipant() ) 319 { 301 { 320 302 321 G4int i = targ->GetTotalNumberOfPa 303 G4int i = targ->GetTotalNumberOfParticipant(); 322 304 323 G4ThreeVector p0( 0 ); 305 G4ThreeVector p0( 0 ); 324 G4ThreeVector r0( 0 ); 306 G4ThreeVector r0( 0 ); 325 307 326 G4ThreeVector p ( p0.x() + coulomb 308 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 327 , p0.y() 309 , p0.y() 328 , p0.z() * coulomb 310 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 329 311 330 G4ThreeVector r ( r0.x() + coulomb 312 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 331 , r0.y() 313 , r0.y() 332 , r0.z() / coulomb 314 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 333 315 334 system->SetParticipant( new G4QMDP 316 system->SetParticipant( new G4QMDParticipant( (G4ParticleDefinition*)projectile.GetDefinition() , p , r ) ); 335 // This is not important becase on 317 // This is not important becase only 1 projectile particle. 336 system->GetParticipant ( i )->SetP 318 system->GetParticipant ( i )->SetProjectile(); 337 } 319 } 338 320 339 } 321 } 340 //system->ShowParticipants(); 322 //system->ShowParticipants(); 341 323 342 delete targ; 324 delete targ; 343 delete proj; 325 delete proj; 344 326 345 meanField->SetSystem ( system ); 327 meanField->SetSystem ( system ); 346 collision->SetMeanField ( meanField ); 328 collision->SetMeanField ( meanField ); 347 329 348 // Time Evolution 330 // Time Evolution 349 //std::cout << "Start time evolution " << s 331 //std::cout << "Start time evolution " << std::endl; 350 //system->ShowParticipants(); 332 //system->ShowParticipants(); 351 for ( G4int i = 0 ; i < maxTime ; i++ ) 333 for ( G4int i = 0 ; i < maxTime ; i++ ) 352 { 334 { 353 //G4cout << " do Paropagate " << i << " 335 //G4cout << " do Paropagate " << i << " th time step. " << G4endl; 354 meanField->DoPropagation( deltaT ); 336 meanField->DoPropagation( deltaT ); 355 //system->ShowParticipants(); 337 //system->ShowParticipants(); 356 collision->CalKinematicsOfBinaryCollisio 338 collision->CalKinematicsOfBinaryCollisions( deltaT ); 357 339 358 if ( i / 10 * 10 == i ) 340 if ( i / 10 * 10 == i ) 359 { 341 { 360 //G4cout << i << " th time step. " << 342 //G4cout << i << " th time step. " << G4endl; 361 //system->ShowParticipants(); 343 //system->ShowParticipants(); 362 } 344 } 363 //system->ShowParticipants(); 345 //system->ShowParticipants(); 364 } 346 } 365 //system->ShowParticipants(); 347 //system->ShowParticipants(); 366 348 367 349 368 //std::cout << "Doing Cluster Judgment " << 350 //std::cout << "Doing Cluster Judgment " << std::endl; 369 351 370 nucleuses = meanField->DoClusterJudgment(); 352 nucleuses = meanField->DoClusterJudgment(); 371 353 372 // Elastic Judgment 354 // Elastic Judgment 373 355 374 G4int numberOfSecondary = int ( nucleuses.s 356 G4int numberOfSecondary = int ( nucleuses.size() ) + system->GetTotalNumberOfParticipant(); 375 357 376 G4int sec_a_Z = 0; 358 G4int sec_a_Z = 0; 377 G4int sec_a_A = 0; 359 G4int sec_a_A = 0; 378 const G4ParticleDefinition* sec_a_pd = NULL 360 const G4ParticleDefinition* sec_a_pd = NULL; 379 G4int sec_b_Z = 0; 361 G4int sec_b_Z = 0; 380 G4int sec_b_A = 0; 362 G4int sec_b_A = 0; 381 const G4ParticleDefinition* sec_b_pd = NULL 363 const G4ParticleDefinition* sec_b_pd = NULL; 382 364 383 if ( numberOfSecondary == 2 ) 365 if ( numberOfSecondary == 2 ) 384 { 366 { 385 367 386 G4bool elasticLike_system = false; 368 G4bool elasticLike_system = false; 387 if ( nucleuses.size() == 2 ) 369 if ( nucleuses.size() == 2 ) 388 { 370 { 389 371 390 sec_a_Z = nucleuses[0]->GetAtomicNumb 372 sec_a_Z = nucleuses[0]->GetAtomicNumber(); 391 sec_a_A = nucleuses[0]->GetMassNumber 373 sec_a_A = nucleuses[0]->GetMassNumber(); 392 sec_b_Z = nucleuses[1]->GetAtomicNumb 374 sec_b_Z = nucleuses[1]->GetAtomicNumber(); 393 sec_b_A = nucleuses[1]->GetMassNumber 375 sec_b_A = nucleuses[1]->GetMassNumber(); 394 376 395 if ( ( sec_a_Z == proj_Z && sec_a_A = 377 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A ) 396 || ( sec_a_Z == targ_Z && sec_a_A = 378 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) ) 397 { 379 { 398 elasticLike_system = true; 380 elasticLike_system = true; 399 } 381 } 400 382 401 } 383 } 402 else if ( nucleuses.size() == 1 ) 384 else if ( nucleuses.size() == 1 ) 403 { 385 { 404 386 405 sec_a_Z = nucleuses[0]->GetAtomicNumb 387 sec_a_Z = nucleuses[0]->GetAtomicNumber(); 406 sec_a_A = nucleuses[0]->GetMassNumber 388 sec_a_A = nucleuses[0]->GetMassNumber(); 407 sec_b_pd = system->GetParticipant( 0 389 sec_b_pd = system->GetParticipant( 0 )->GetDefinition(); 408 390 409 if ( ( sec_a_Z == proj_Z && sec_a_A = 391 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd ) 410 || ( sec_a_Z == targ_Z && sec_a_A = 392 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) ) 411 { 393 { 412 elasticLike_system = true; 394 elasticLike_system = true; 413 } 395 } 414 396 415 } 397 } 416 else 398 else 417 { 399 { 418 400 419 sec_a_pd = system->GetParticipant( 0 401 sec_a_pd = system->GetParticipant( 0 )->GetDefinition(); 420 sec_b_pd = system->GetParticipant( 1 402 sec_b_pd = system->GetParticipant( 1 )->GetDefinition(); 421 403 422 if ( ( sec_a_pd == proj_pd && sec_b_p 404 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd ) 423 || ( sec_a_pd == targ_pd && sec_b_p 405 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) ) 424 { 406 { 425 elasticLike_system = true; 407 elasticLike_system = true; 426 } 408 } 427 409 428 } 410 } 429 411 430 if ( elasticLike_system == true ) 412 if ( elasticLike_system == true ) 431 { 413 { 432 414 433 G4bool elasticLike_energy = true; 415 G4bool elasticLike_energy = true; 434 // Cal ExcitationEnergy 416 // Cal ExcitationEnergy 435 for ( G4int i = 0 ; i < int ( nucleus 417 for ( G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ ) 436 { 418 { 437 419 438 //meanField->SetSystem( nucleuses[ 420 //meanField->SetSystem( nucleuses[i] ); 439 meanField->SetNucleus( nucleuses[i 421 meanField->SetNucleus( nucleuses[i] ); 440 //nucleuses[i]->SetTotalPotential( 422 //nucleuses[i]->SetTotalPotential( meanField->GetTotalPotential() ); 441 //nucleuses[i]->CalEnergyAndAngula 423 //nucleuses[i]->CalEnergyAndAngularMomentumInCM(); 442 424 443 if ( nucleuses[i]->GetExcitationEn 425 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false; 444 426 445 } 427 } 446 428 447 // Check Collision 429 // Check Collision 448 G4bool withCollision = true; 430 G4bool withCollision = true; 449 if ( system->GetNOCollision() == 0 ) 431 if ( system->GetNOCollision() == 0 ) withCollision = false; 450 432 451 // Final judegement for Inelasitc or Elasti 433 // Final judegement for Inelasitc or Elastic; 452 // 434 // 453 // ElasticLike without Collision 435 // ElasticLike without Collision 454 //if ( elasticLike_energy == true && 436 //if ( elasticLike_energy == true && withCollision == false ) elastic = true; // ielst = 0 455 // ElasticLike with Collision 437 // ElasticLike with Collision 456 //if ( elasticLike_energy == true && 438 //if ( elasticLike_energy == true && withCollision == true ) elastic = true; // ielst = 1 457 // InelasticLike without Collision 439 // InelasticLike without Collision 458 //if ( elasticLike_energy == false ) 440 //if ( elasticLike_energy == false ) elastic = false; // ielst = 2 459 if ( frag == true ) 441 if ( frag == true ) 460 if ( elasticLike_energy == false ) 442 if ( elasticLike_energy == false ) elastic = false; 461 // InelasticLike with Collision 443 // InelasticLike with Collision 462 if ( elasticLike_energy == false && w 444 if ( elasticLike_energy == false && withCollision == true ) elastic = false; // ielst = 3 463 445 464 } 446 } 465 447 466 } 448 } 467 else 449 else 468 { 450 { 469 451 470 // numberOfSecondary != 2 452 // numberOfSecondary != 2 471 elastic = false; 453 elastic = false; 472 454 473 } 455 } 474 456 475 //071115 457 //071115 476 //G4cout << elastic << G4endl; 458 //G4cout << elastic << G4endl; 477 // if elastic is true try again from sam 459 // if elastic is true try again from sampling of impact parameter 478 460 479 if ( elastic == true ) 461 if ( elastic == true ) 480 { 462 { 481 // delete this nucleues 463 // delete this nucleues 482 for ( std::vector< G4QMDNucleus* >::i 464 for ( std::vector< G4QMDNucleus* >::iterator 483 it = nucleuses.begin() ; it != 465 it = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 484 { 466 { 485 delete *it; 467 delete *it; 486 } 468 } 487 nucleuses.clear(); 469 nucleuses.clear(); 488 } 470 } 489 471 490 } 472 } 491 473 492 474 493 // Statical Decay Phase 475 // Statical Decay Phase 494 476 495 for ( std::vector< G4QMDNucleus* >::iterato 477 for ( std::vector< G4QMDNucleus* >::iterator it 496 = nucleuses.begin() ; it != nucleuses.e 478 = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 497 { 479 { 498 480 499 /* 481 /* 500 G4cout << "G4QMDRESULT " 482 G4cout << "G4QMDRESULT " 501 << (*it)->GetAtomicNumber() 483 << (*it)->GetAtomicNumber() 502 << " " 484 << " " 503 << (*it)->GetMassNumber() 485 << (*it)->GetMassNumber() 504 << " " 486 << " " 505 << (*it)->Get4Momentum() 487 << (*it)->Get4Momentum() 506 << " " 488 << " " 507 << (*it)->Get4Momentum().vect() 489 << (*it)->Get4Momentum().vect() 508 << " " 490 << " " 509 << (*it)->Get4Momentum().restMass 491 << (*it)->Get4Momentum().restMass() 510 << " " 492 << " " 511 << (*it)->GetNuclearMass()/GeV 493 << (*it)->GetNuclearMass()/GeV 512 << G4endl; 494 << G4endl; 513 */ 495 */ 514 496 515 meanField->SetNucleus ( *it ); 497 meanField->SetNucleus ( *it ); 516 498 517 if ( (*it)->GetAtomicNumber() == 0 // n 499 if ( (*it)->GetAtomicNumber() == 0 // neutron cluster 518 || (*it)->GetAtomicNumber() == (*it)-> 500 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() ) // proton cluster 519 { 501 { 520 // push back system 502 // push back system 521 for ( G4int i = 0 ; i < (*it)->GetTot 503 for ( G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ ) 522 { 504 { 523 G4QMDParticipant* aP = new G4QMDPa 505 G4QMDParticipant* aP = new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() ); 524 system->SetParticipant ( aP ); 506 system->SetParticipant ( aP ); 525 } 507 } 526 continue; 508 continue; 527 } 509 } 528 510 529 G4double nucleus_e = std::sqrt ( G4Pow:: 511 G4double nucleus_e = std::sqrt ( G4Pow::GetInstance()->powN ( (*it)->GetNuclearMass()/GeV , 2 ) + G4Pow::GetInstance()->powN ( (*it)->Get4Momentum().vect().mag() , 2 ) ); 530 G4LorentzVector nucleus_p4CM ( (*it)->Ge 512 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e ); 531 513 532 // std::cout << "G4QMDRESULT nucleus delt 514 // std::cout << "G4QMDRESULT nucleus deltaQ " << deltaQ << std::endl; 533 515 534 G4int ia = (*it)->GetMassNumber(); 516 G4int ia = (*it)->GetMassNumber(); 535 G4int iz = (*it)->GetAtomicNumber(); 517 G4int iz = (*it)->GetAtomicNumber(); 536 518 537 G4LorentzVector lv ( G4ThreeVector( 0.0 519 G4LorentzVector lv ( G4ThreeVector( 0.0 ) , (*it)->GetExcitationEnergy()*GeV + G4IonTable::GetIonTable()->GetIonMass( iz , ia ) ); 538 520 539 G4Fragment* aFragment = new G4Fragment( 521 G4Fragment* aFragment = new G4Fragment( ia , iz , lv ); 540 522 541 G4ReactionProductVector* rv; 523 G4ReactionProductVector* rv; 542 rv = excitationHandler->BreakItUp( *aFra 524 rv = excitationHandler->BreakItUp( *aFragment ); 543 G4bool notBreak = true; 525 G4bool notBreak = true; 544 for ( G4ReactionProductVector::iterator 526 for ( G4ReactionProductVector::iterator itt 545 = rv->begin() ; itt != rv->end() ; i 527 = rv->begin() ; itt != rv->end() ; itt++ ) 546 { 528 { 547 529 548 notBreak = false; 530 notBreak = false; 549 // Secondary from this nucleus (*it) 531 // Secondary from this nucleus (*it) 550 const G4ParticleDefinition* pd = (*i 532 const G4ParticleDefinition* pd = (*itt)->GetDefinition(); 551 533 552 G4LorentzVector p4 ( (*itt)->GetMome 534 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV ); //in nucleus(*it) rest system 553 G4LorentzVector p4_CM = CLHEP::boost 535 G4LorentzVector p4_CM = CLHEP::boostOf( p4 , -nucleus_p4CM.findBoostToCM() ); // Back to CM 554 G4LorentzVector p4_LAB = CLHEP::boos 536 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB 555 537 556 538 557 //090122 539 //090122 558 //theParticleChange.AddSecondary( dp 540 //theParticleChange.AddSecondary( dp ); 559 if ( !( pd->GetAtomicNumber() == 4 & 541 if ( !( pd->GetAtomicNumber() == 4 && pd->GetAtomicMass() == 8 ) ) 560 { 542 { 561 //G4cout << "pd out of notBreak l << 562 G4DynamicParticle* dp = new G4Dyn 543 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 563 theParticleChange.AddSecondary( d 544 theParticleChange.AddSecondary( dp ); 564 } 545 } 565 else 546 else 566 { 547 { 567 //Be8 -> Alpha + Alpha + Q 548 //Be8 -> Alpha + Alpha + Q 568 G4ThreeVector randomized_directio 549 G4ThreeVector randomized_direction( G4UniformRand() , G4UniformRand() , G4UniformRand() ); 569 randomized_direction = randomized 550 randomized_direction = randomized_direction.unit(); 570 G4double q_decay = (*itt)->GetMas 551 G4double q_decay = (*itt)->GetMass() - 2*G4Alpha::Alpha()->GetPDGMass(); 571 G4double p_decay = std::sqrt ( G4 552 G4double p_decay = std::sqrt ( G4Pow::GetInstance()->powN(G4Alpha::Alpha()->GetPDGMass()+q_decay/2,2) - G4Pow::GetInstance()->powN(G4Alpha::Alpha()->GetPDGMass() , 2 ) ); 572 G4LorentzVector p4_a1 ( p_decay*r 553 G4LorentzVector p4_a1 ( p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system 573 554 574 G4LorentzVector p4_a1_Be8 = CLHEP 555 G4LorentzVector p4_a1_Be8 = CLHEP::boostOf ( p4_a1/GeV , -p4.findBoostToCM() ); 575 G4LorentzVector p4_a1_CM = CLHEP: 556 G4LorentzVector p4_a1_CM = CLHEP::boostOf ( p4_a1_Be8 , -nucleus_p4CM.findBoostToCM() ); 576 G4LorentzVector p4_a1_LAB = CLHEP 557 G4LorentzVector p4_a1_LAB = CLHEP::boostOf ( p4_a1_CM , boostBackToLAB ); 577 558 578 G4LorentzVector p4_a2 ( -p_decay* 559 G4LorentzVector p4_a2 ( -p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system 579 560 580 G4LorentzVector p4_a2_Be8 = CLHEP 561 G4LorentzVector p4_a2_Be8 = CLHEP::boostOf ( p4_a2/GeV , -p4.findBoostToCM() ); 581 G4LorentzVector p4_a2_CM = CLHEP: 562 G4LorentzVector p4_a2_CM = CLHEP::boostOf ( p4_a2_Be8 , -nucleus_p4CM.findBoostToCM() ); 582 G4LorentzVector p4_a2_LAB = CLHEP 563 G4LorentzVector p4_a2_LAB = CLHEP::boostOf ( p4_a2_CM , boostBackToLAB ); 583 564 584 G4DynamicParticle* dp1 = new G4Dy 565 G4DynamicParticle* dp1 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a1_LAB*GeV ); 585 G4DynamicParticle* dp2 = new G4Dy 566 G4DynamicParticle* dp2 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a2_LAB*GeV ); 586 theParticleChange.AddSecondary( d 567 theParticleChange.AddSecondary( dp1 ); 587 theParticleChange.AddSecondary( d 568 theParticleChange.AddSecondary( dp2 ); 588 } 569 } 589 //090122 570 //090122 590 571 591 /* 572 /* 592 G4cout 573 G4cout 593 << "Regist Secondary " 574 << "Regist Secondary " 594 << (*itt)->GetDefinition()->Ge 575 << (*itt)->GetDefinition()->GetParticleName() 595 << " " 576 << " " 596 << (*itt)->GetMomentum()/GeV 577 << (*itt)->GetMomentum()/GeV 597 << " " 578 << " " 598 << (*itt)->GetKineticEnergy()/ 579 << (*itt)->GetKineticEnergy()/GeV 599 << " " 580 << " " 600 << (*itt)->GetMass()/GeV 581 << (*itt)->GetMass()/GeV 601 << " " 582 << " " 602 << (*itt)->GetTotalEnergy()/Ge 583 << (*itt)->GetTotalEnergy()/GeV 603 << " " 584 << " " 604 << (*itt)->GetTotalEnergy()/Ge 585 << (*itt)->GetTotalEnergy()/GeV * (*itt)->GetTotalEnergy()/GeV 605 - (*itt)->GetMomentum()/GeV * 586 - (*itt)->GetMomentum()/GeV * (*itt)->GetMomentum()/GeV 606 << " " 587 << " " 607 << nucleus_p4CM.findBoostToCM( 588 << nucleus_p4CM.findBoostToCM() 608 << " " 589 << " " 609 << p4 590 << p4 610 << " " 591 << " " 611 << p4_CM 592 << p4_CM 612 << " " 593 << " " 613 << p4_LAB 594 << p4_LAB 614 << G4endl; 595 << G4endl; 615 */ 596 */ 616 597 617 } 598 } 618 if ( notBreak == true ) 599 if ( notBreak == true ) 619 { 600 { 620 601 621 const G4ParticleDefinition* pd = G4Io 602 const G4ParticleDefinition* pd = G4IonTable::GetIonTable()->GetIon( (*it)->GetAtomicNumber() , (*it)->GetMassNumber(), (*it)->GetExcitationEnergy()*GeV ); 622 //G4cout << "pd in notBreak loop << 623 G4LorentzVector p4_CM = nucleus_p4CM; 603 G4LorentzVector p4_CM = nucleus_p4CM; 624 G4LorentzVector p4_LAB = CLHEP::boost 604 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB 625 G4DynamicParticle* dp = new G4Dynamic 605 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 626 theParticleChange.AddSecondary( dp ); 606 theParticleChange.AddSecondary( dp ); 627 607 628 } 608 } 629 609 630 for ( G4ReactionProductVector::iterator 610 for ( G4ReactionProductVector::iterator itt 631 = rv->begin() ; itt != rv->end() ; i 611 = rv->begin() ; itt != rv->end() ; itt++ ) 632 { 612 { 633 delete *itt; 613 delete *itt; 634 } 614 } 635 delete rv; 615 delete rv; 636 616 637 delete aFragment; 617 delete aFragment; 638 618 639 } 619 } 640 620 641 621 642 622 643 for ( G4int i = 0 ; i < system->GetTotalNum 623 for ( G4int i = 0 ; i < system->GetTotalNumberOfParticipant() ; i++ ) 644 { 624 { >> 625 645 // Secondary particles 626 // Secondary particles 646 627 647 const G4ParticleDefinition* pd = system- 628 const G4ParticleDefinition* pd = system->GetParticipant( i )->GetDefinition(); 648 G4LorentzVector p4_CM = system->GetParti 629 G4LorentzVector p4_CM = system->GetParticipant( i )->Get4Momentum(); 649 G4LorentzVector p4_LAB = CLHEP::boostOf( 630 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); 650 G4DynamicParticle* dp = new G4DynamicPar 631 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 651 theParticleChange.AddSecondary( dp ); 632 theParticleChange.AddSecondary( dp ); 652 //G4cout << "In the last theParticleChan << 653 633 654 /* 634 /* 655 G4cout << "G4QMDRESULT " 635 G4cout << "G4QMDRESULT " 656 << "r" << i << " " << system->GetPartici 636 << "r" << i << " " << system->GetParticipant ( i ) -> GetPosition() << " " 657 << "p" << i << " " << system->GetPartici 637 << "p" << i << " " << system->GetParticipant ( i ) -> Get4Momentum() 658 << G4endl; 638 << G4endl; 659 */ 639 */ 660 640 661 } 641 } 662 642 663 for ( std::vector< G4QMDNucleus* >::iterato 643 for ( std::vector< G4QMDNucleus* >::iterator it 664 = nucleuses.begin() ; it != nucleuses.e 644 = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 665 { 645 { 666 delete *it; // delete nulceuse 646 delete *it; // delete nulceuse 667 } 647 } 668 nucleuses.clear(); 648 nucleuses.clear(); 669 649 670 system->Clear(); 650 system->Clear(); 671 delete system; 651 delete system; 672 652 673 theParticleChange.SetStatusChange( stopAndK 653 theParticleChange.SetStatusChange( stopAndKill ); 674 654 675 for (G4int i = 0; i < G4int(theParticleChan << 676 { << 677 //G4cout << "Particle : " << theParticleC << 678 //G4cout << "KEnergy : " << theParticleCh << 679 //G4cout << "modelID : " << theParticleCh << 680 theParticleChange.GetSecondary(i)->SetCre << 681 } << 682 << 683 return &theParticleChange; 655 return &theParticleChange; 684 656 685 } 657 } 686 658 687 659 688 660 689 void G4QMDReaction::calcOffSetOfCollision( G4d 661 void G4QMDReaction::calcOffSetOfCollision( G4double b , 690 const G4ParticleDefinition* pd_proj , 662 const G4ParticleDefinition* pd_proj , 691 const G4ParticleDefinition* pd_targ , 663 const G4ParticleDefinition* pd_targ , 692 G4double ptot , G4double etot , G4double bmax 664 G4double ptot , G4double etot , G4double bmax , G4ThreeVector boostToCM ) 693 { 665 { 694 666 695 G4double mass_proj = pd_proj->GetPDGMass()/ 667 G4double mass_proj = pd_proj->GetPDGMass()/GeV; 696 G4double mass_targ = pd_targ->GetPDGMass()/ 668 G4double mass_targ = pd_targ->GetPDGMass()/GeV; 697 669 698 G4double stot = std::sqrt ( etot*etot - pto 670 G4double stot = std::sqrt ( etot*etot - ptot*ptot ); 699 671 700 G4double pstt = std::sqrt ( ( stot*stot - ( 672 G4double pstt = std::sqrt ( ( stot*stot - ( mass_proj + mass_targ ) * ( mass_proj + mass_targ ) 701 ) * ( stot*stot - ( mass_pro 673 ) * ( stot*stot - ( mass_proj - mass_targ ) * ( mass_proj - mass_targ ) ) ) 702 / ( 2.0 * stot ); 674 / ( 2.0 * stot ); 703 675 704 G4double pzcc = pstt; 676 G4double pzcc = pstt; 705 G4double eccm = stot - ( mass_proj + mass_t 677 G4double eccm = stot - ( mass_proj + mass_targ ); 706 678 707 G4int zp = 1; 679 G4int zp = 1; 708 G4int ap = 1; 680 G4int ap = 1; 709 if ( pd_proj->GetParticleType() == "nucleus 681 if ( pd_proj->GetParticleType() == "nucleus" ) 710 { 682 { 711 zp = pd_proj->GetAtomicNumber(); 683 zp = pd_proj->GetAtomicNumber(); 712 ap = pd_proj->GetAtomicMass(); 684 ap = pd_proj->GetAtomicMass(); 713 } 685 } 714 else 686 else 715 { 687 { 716 // proton, neutron, mesons 688 // proton, neutron, mesons 717 zp = int ( pd_proj->GetPDGCharge()/eplus 689 zp = int ( pd_proj->GetPDGCharge()/eplus + 0.5 ); 718 // ap = 1; 690 // ap = 1; 719 } 691 } 720 692 721 693 722 G4int zt = pd_targ->GetAtomicNumber(); 694 G4int zt = pd_targ->GetAtomicNumber(); 723 G4int at = pd_targ->GetAtomicMass(); 695 G4int at = pd_targ->GetAtomicMass(); 724 696 725 697 726 // Check the ramx0 value << 727 //G4double rmax0 = 8.0; // T.K dicide para 698 //G4double rmax0 = 8.0; // T.K dicide parameter value // for low energy 728 G4double rmax0 = bmax + 4.0; 699 G4double rmax0 = bmax + 4.0; 729 G4double rmax = std::sqrt( rmax0*rmax0 + b* 700 G4double rmax = std::sqrt( rmax0*rmax0 + b*b ); 730 701 731 G4double ccoul = 0.001439767; 702 G4double ccoul = 0.001439767; 732 G4double pcca = 1.0 - double ( zp * zt ) * 703 G4double pcca = 1.0 - double ( zp * zt ) * ccoul / eccm / rmax - ( b / rmax )*( b / rmax ); 733 704 734 G4double pccf = std::sqrt( pcca ); 705 G4double pccf = std::sqrt( pcca ); 735 706 736 //Fix for neutral particles 707 //Fix for neutral particles 737 G4double aas1 = 0.0; 708 G4double aas1 = 0.0; 738 G4double bbs = 0.0; 709 G4double bbs = 0.0; 739 710 740 if ( zp != 0 ) 711 if ( zp != 0 ) 741 { 712 { 742 G4double aas = 2.0 * eccm * b / double ( 713 G4double aas = 2.0 * eccm * b / double ( zp * zt ) / ccoul; 743 bbs = 1.0 / std::sqrt ( 1.0 + aas*aas ); 714 bbs = 1.0 / std::sqrt ( 1.0 + aas*aas ); 744 aas1 = ( 1.0 + aas * b / rmax ) * bbs; 715 aas1 = ( 1.0 + aas * b / rmax ) * bbs; 745 } 716 } 746 717 747 G4double cost = 0.0; 718 G4double cost = 0.0; 748 G4double sint = 0.0; 719 G4double sint = 0.0; 749 G4double thet1 = 0.0; 720 G4double thet1 = 0.0; 750 G4double thet2 = 0.0; 721 G4double thet2 = 0.0; 751 if ( 1.0 - aas1*aas1 <= 0 || 1.0 - bbs*bbs 722 if ( 1.0 - aas1*aas1 <= 0 || 1.0 - bbs*bbs <= 0.0 ) 752 { 723 { 753 cost = 1.0; 724 cost = 1.0; 754 sint = 0.0; 725 sint = 0.0; 755 } 726 } 756 else 727 else 757 { 728 { 758 G4double aat1 = aas1 / std::sqrt ( 1.0 - 729 G4double aat1 = aas1 / std::sqrt ( 1.0 - aas1*aas1 ); 759 G4double aat2 = bbs / std::sqrt ( 1.0 - 730 G4double aat2 = bbs / std::sqrt ( 1.0 - bbs*bbs ); 760 731 761 thet1 = std::atan ( aat1 ); 732 thet1 = std::atan ( aat1 ); 762 thet2 = std::atan ( aat2 ); 733 thet2 = std::atan ( aat2 ); 763 734 764 // TK enter to else block 735 // TK enter to else block 765 G4double theta = thet1 - thet2; 736 G4double theta = thet1 - thet2; 766 cost = std::cos( theta ); 737 cost = std::cos( theta ); 767 sint = std::sin( theta ); 738 sint = std::sin( theta ); 768 } 739 } 769 740 770 G4double rzpr = -rmax * cost * ( mass_targ 741 G4double rzpr = -rmax * cost * ( mass_targ ) / ( mass_proj + mass_targ ); 771 G4double rzta = rmax * cost * ( mass_proj 742 G4double rzta = rmax * cost * ( mass_proj ) / ( mass_proj + mass_targ ); 772 743 773 G4double rxpr = rmax / 2.0 * sint; 744 G4double rxpr = rmax / 2.0 * sint; 774 745 775 G4double rxta = -rxpr; 746 G4double rxta = -rxpr; 776 747 777 748 778 G4double pzpc = pzcc * ( cost * pccf + sin 749 G4double pzpc = pzcc * ( cost * pccf + sint * b / rmax ); 779 G4double pxpr = pzcc * ( -sint * pccf + cos 750 G4double pxpr = pzcc * ( -sint * pccf + cost * b / rmax ); 780 751 781 G4double pztc = - pzpc; 752 G4double pztc = - pzpc; 782 G4double pxta = - pxpr; 753 G4double pxta = - pxpr; 783 754 784 G4double epc = std::sqrt ( pzpc*pzpc + pxpr 755 G4double epc = std::sqrt ( pzpc*pzpc + pxpr*pxpr + mass_proj*mass_proj ); 785 G4double etc = std::sqrt ( pztc*pztc + pxta 756 G4double etc = std::sqrt ( pztc*pztc + pxta*pxta + mass_targ*mass_targ ); 786 757 787 G4double pzpr = pzpc; 758 G4double pzpr = pzpc; 788 G4double pzta = pztc; 759 G4double pzta = pztc; 789 G4double epr = epc; 760 G4double epr = epc; 790 G4double eta = etc; 761 G4double eta = etc; 791 762 792 // CM -> NN 763 // CM -> NN 793 G4double gammacm = boostToCM.gamma(); 764 G4double gammacm = boostToCM.gamma(); 794 //G4double betacm = -boostToCM.beta(); 765 //G4double betacm = -boostToCM.beta(); 795 G4double betacm = boostToCM.z(); 766 G4double betacm = boostToCM.z(); 796 pzpr = pzpc + betacm * gammacm * ( gammacm 767 pzpr = pzpc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pzpc * betacm + epc ); 797 pzta = pztc + betacm * gammacm * ( gammacm 768 pzta = pztc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pztc * betacm + etc ); 798 epr = gammacm * ( epc + betacm * pzpc ); 769 epr = gammacm * ( epc + betacm * pzpc ); 799 eta = gammacm * ( etc + betacm * pztc ); 770 eta = gammacm * ( etc + betacm * pztc ); 800 771 801 //G4double betpr = pzpr / epr; 772 //G4double betpr = pzpr / epr; 802 //G4double betta = pzta / eta; 773 //G4double betta = pzta / eta; 803 774 804 G4double gammpr = epr / ( mass_proj ); 775 G4double gammpr = epr / ( mass_proj ); 805 G4double gammta = eta / ( mass_targ ); 776 G4double gammta = eta / ( mass_targ ); 806 777 807 pzta = pzta / double ( at ); 778 pzta = pzta / double ( at ); 808 pxta = pxta / double ( at ); 779 pxta = pxta / double ( at ); 809 780 810 pzpr = pzpr / double ( ap ); 781 pzpr = pzpr / double ( ap ); 811 pxpr = pxpr / double ( ap ); 782 pxpr = pxpr / double ( ap ); 812 783 813 G4double zeroz = 0.0; 784 G4double zeroz = 0.0; 814 785 815 rzpr = rzpr -zeroz; 786 rzpr = rzpr -zeroz; 816 rzta = rzta -zeroz; 787 rzta = rzta -zeroz; 817 788 818 // Set results 789 // Set results 819 coulomb_collision_gamma_proj = gammpr; 790 coulomb_collision_gamma_proj = gammpr; 820 coulomb_collision_rx_proj = rxpr; 791 coulomb_collision_rx_proj = rxpr; 821 coulomb_collision_rz_proj = rzpr; 792 coulomb_collision_rz_proj = rzpr; 822 coulomb_collision_px_proj = pxpr; 793 coulomb_collision_px_proj = pxpr; 823 coulomb_collision_pz_proj = pzpr; 794 coulomb_collision_pz_proj = pzpr; 824 795 825 coulomb_collision_gamma_targ = gammta; 796 coulomb_collision_gamma_targ = gammta; 826 coulomb_collision_rx_targ = rxta; 797 coulomb_collision_rx_targ = rxta; 827 coulomb_collision_rz_targ = rzta; 798 coulomb_collision_rz_targ = rzta; 828 coulomb_collision_px_targ = pxta; 799 coulomb_collision_px_targ = pxta; 829 coulomb_collision_pz_targ = pzta; 800 coulomb_collision_pz_targ = pzta; 830 801 831 } 802 } 832 803 >> 804 >> 805 833 void G4QMDReaction::setEvaporationCh() 806 void G4QMDReaction::setEvaporationCh() 834 { 807 { 835 //fEvaporation - 8 default channels << 808 836 //fCombined - 8 default + 60 GEM << 809 if ( gem == true ) 837 //fGEM - 2 default + 66 GEM << 810 evaporation->SetGEMChannel(); 838 G4DeexChannelType ctype = gem ? fGEM : fComb << 811 else 839 excitationHandler->SetDeexChannelsType(ctype << 812 evaporation->SetDefaultChannel(); >> 813 840 } 814 } 841 815 842 void G4QMDReaction::ModelDescription(std::ostr 816 void G4QMDReaction::ModelDescription(std::ostream& outFile) const 843 { 817 { 844 outFile << "Lorentz covarianted Quantum Mol 818 outFile << "Lorentz covarianted Quantum Molecular Dynamics model for nucleus (particle) vs nucleus reactions\n"; 845 } 819 } 846 820