Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 //--------------------------------------------------------------------------- 28 // 29 // ClassName: G4StoppingPhysics 30 // 31 // Author: Alberto Ribon 32 // 33 // Date: 27 July 2012 34 // 35 // Modified: 36 // 20120921 M. Kelsey -- Move MuonMinusCapture.hh here; replace G4MMCAtRest 37 // with new G4MuonMinusCapture. 38 // 16-Oct-2012 A. Ribon: renamed G4BertiniAndFritiofStoppingPhysics as 39 // G4StoppingPhysics. 40 // 17-Oct-2012 A. Ribon: added nuclear capture at rest of anti-nuclei with 41 // Fritof/Precompound. 42 // 22-May-2019 A. Ribon: added annihilation at rest with Fritiof/Precompound 43 // for neutral anti-hadrons: anti-neutron, anti-lambda 44 // anti-sigma0 nd anti-xi0. 45 // 46 //---------------------------------------------------------------------------- 47 48 #include "G4StoppingPhysics.hh" 49 #include "G4SystemOfUnits.hh" 50 #include "G4HadronicAbsorptionBertini.hh" 51 #include "G4HadronicAbsorptionFritiof.hh" 52 #include "G4MuonMinusCapture.hh" 53 #include "G4ParticleDefinition.hh" 54 #include "G4ProcessManager.hh" 55 #include "G4LeptonConstructor.hh" 56 #include "G4MesonConstructor.hh" 57 #include "G4BaryonConstructor.hh" 58 #include "G4MuonMinus.hh" 59 #include "G4PionMinus.hh" 60 #include "G4BuilderType.hh" 61 62 // factory 63 #include "G4PhysicsConstructorFactory.hh" 64 // 65 G4_DECLARE_PHYSCONSTR_FACTORY(G4StoppingPhysics); 66 67 G4StoppingPhysics::G4StoppingPhysics( G4int ver ) : 68 G4StoppingPhysics("stopping", ver) 69 {} 70 71 G4StoppingPhysics::G4StoppingPhysics(const G4String& name, G4int ver, 72 G4bool useMuCapture) : 73 G4VPhysicsConstructor( name ), 74 verbose( ver ), 75 useMuonMinusCapture( useMuCapture ) 76 { 77 SetPhysicsType(bStopping); 78 if ( verbose > 1 ) G4cout << "### G4StoppingPhysics" << G4endl; 79 } 80 81 G4StoppingPhysics::~G4StoppingPhysics() {} 82 83 void G4StoppingPhysics::ConstructParticle() { 84 // G4cout << "G4StoppingPhysics::ConstructParticle" << G4endl; 85 G4LeptonConstructor pLeptonConstructor; 86 pLeptonConstructor.ConstructParticle(); 87 88 G4MesonConstructor pMesonConstructor; 89 pMesonConstructor.ConstructParticle(); 90 91 G4BaryonConstructor pBaryonConstructor; 92 pBaryonConstructor.ConstructParticle(); 93 } 94 95 void G4StoppingPhysics::ConstructProcess() { 96 if ( verbose > 1 ) G4cout << "### G4StoppingPhysics::ConstructProcess " 97 << G4endl; 98 99 G4MuonMinusCapture* muProcess = nullptr; 100 G4HadronicAbsorptionBertini* hBertiniProcess = nullptr; 101 G4HadronicAbsorptionFritiof* hFritiofProcess = nullptr; 102 103 if ( useMuonMinusCapture ) { 104 muProcess = new G4MuonMinusCapture(); 105 } 106 107 hBertiniProcess = new G4HadronicAbsorptionBertini(); 108 hFritiofProcess = new G4HadronicAbsorptionFritiof(); 109 110 G4double mThreshold = 130.0*MeV; 111 112 // Add Stopping Process 113 G4ParticleDefinition* particle = 0; 114 G4ProcessManager* pmanager = 0; 115 116 auto myParticleIterator=GetParticleIterator(); 117 myParticleIterator->reset(); 118 119 while ( (*myParticleIterator)() ) { 120 121 particle = myParticleIterator->value(); 122 pmanager = particle->GetProcessManager(); 123 124 if (useMuonMinusCapture && particle == G4MuonMinus::MuonMinus()) { 125 pmanager->AddRestProcess( muProcess ); 126 if ( verbose > 1 ) { 127 G4cout << "### G4StoppingPhysics added G4MuonMinusCapture for " 128 << particle->GetParticleName() << G4endl; 129 } 130 } 131 132 if ( particle->GetPDGCharge() <= 0.0 && 133 particle->GetPDGMass() > mThreshold && 134 ! particle->IsShortLived() ) { 135 136 // Use Fritiof/Precompound for: anti-proton, anti-neutron, anti-lambda, 137 // anti-sigma0, anti-sigma+, anti-xi0 and anti-nuclei. 138 if ( particle == G4AntiProton::Definition() || 139 particle == G4AntiNeutron::Definition() || 140 particle == G4AntiLambda::Definition() || 141 particle == G4AntiSigmaZero::Definition() || 142 particle == G4AntiSigmaPlus::Definition() || 143 particle == G4AntiXiZero::Definition() || 144 particle->GetBaryonNumber() < -1 ) { // Anti-nuclei 145 if ( hFritiofProcess->IsApplicable( *particle ) ) { 146 pmanager->AddRestProcess( hFritiofProcess ); 147 if ( verbose > 1 ) { 148 G4cout << "### G4HadronicAbsorptionFritiof added for " 149 << particle->GetParticleName() << G4endl; 150 } 151 } 152 153 // Use Bertini/Precompound for pi-, K-, Sigma-, Xi-, and Omega- 154 } else if ( particle == G4PionMinus::Definition() || 155 particle == G4KaonMinus::Definition() || 156 particle == G4SigmaMinus::Definition() || 157 particle == G4XiMinus::Definition() || 158 particle == G4OmegaMinus::Definition() ) { 159 if ( hBertiniProcess->IsApplicable( *particle ) ) { 160 pmanager->AddRestProcess( hBertiniProcess ); 161 if ( verbose > 1 ) { 162 G4cout << "### G4HadronicAbsorptionBertini added for " 163 << particle->GetParticleName() << G4endl; 164 } 165 } 166 167 } else { 168 if ( verbose > 1 ) { 169 G4cout << "WARNING in G4StoppingPhysics::ConstructProcess: \ 170 not able to deal with nuclear stopping of " 171 << particle->GetParticleName() << G4endl; 172 } 173 } 174 } 175 176 } // end of while loop 177 } 178