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 // Header: G4IonPhysicsPHP 30 // 31 // Author: A.Ribon 24-May-2016 32 // 33 // Modified: 34 // 35 //--------------------------------------------------------------------------- 36 // 37 38 #include "G4IonPhysicsPHP.hh" 39 #include "G4SystemOfUnits.hh" 40 #include "G4ParticleDefinition.hh" 41 #include "G4ProcessManager.hh" 42 #include "G4Deuteron.hh" 43 #include "G4Triton.hh" 44 #include "G4He3.hh" 45 #include "G4Alpha.hh" 46 #include "G4GenericIon.hh" 47 #include "G4IonConstructor.hh" 48 49 #include "G4HadronInelasticProcess.hh" 50 #include "G4BinaryLightIonReaction.hh" 51 #include "G4ComponentGGNuclNuclXsc.hh" 52 #include "G4CrossSectionInelastic.hh" 53 54 #include "G4PreCompoundModel.hh" 55 #include "G4ExcitationHandler.hh" 56 #include "G4FTFBuilder.hh" 57 #include "G4HadronicInteraction.hh" 58 #include "G4BuilderType.hh" 59 #include "G4HadronicInteractionRegistry.hh" 60 61 #include "G4ParticleHPInelastic.hh" 62 #include "G4ParticleHPInelasticData.hh" 63 64 #include "G4HadronicParameters.hh" 65 #include "G4DeexPrecoParameters.hh" 66 #include "G4NuclearLevelData.hh" 67 68 using namespace std; 69 70 // factory 71 #include "G4PhysicsConstructorFactory.hh" 72 73 G4_DECLARE_PHYSCONSTR_FACTORY( G4IonPhysicsPHP ); 74 75 G4IonPhysicsPHP::G4IonPhysicsPHP( G4int ver ) 76 : G4IonPhysicsPHP( "ionInelasticFTFP_BIC_PHP", ver) 77 {} 78 79 G4IonPhysicsPHP::G4IonPhysicsPHP( const G4String& nname, G4int ver ) 80 : G4VPhysicsConstructor( nname ), verbose( ver ) 81 { 82 SetPhysicsType( bIons ); 83 G4DeexPrecoParameters* param = G4NuclearLevelData::GetInstance()->GetParameters(); 84 param->SetDeexChannelsType(fCombined); 85 if ( verbose > 1 ) G4cout << "### G4IonPhysics: " << nname << G4endl; 86 } 87 88 G4IonPhysicsPHP::~G4IonPhysicsPHP() { 89 } 90 91 void G4IonPhysicsPHP::ConstructParticle() { 92 // Construct ions 93 G4IonConstructor pConstructor; 94 pConstructor.ConstructParticle(); 95 } 96 97 void G4IonPhysicsPHP::ConstructProcess() { 98 99 const G4double maxPHP = 200.0*MeV; 100 const G4double overlapPHP_BIC = 10.0*MeV; 101 const G4double maxBIC = G4HadronicParameters::Instance()->GetMaxEnergyTransitionFTF_Cascade(); 102 const G4double minFTF = G4HadronicParameters::Instance()->GetMinEnergyTransitionFTF_Cascade(); 103 const G4double maxFTF = G4HadronicParameters::Instance()->GetMaxEnergy(); 104 105 G4HadronicInteraction* p = 106 G4HadronicInteractionRegistry::Instance()->FindModel( "PRECO" ); 107 G4PreCompoundModel* thePreCompound = static_cast< G4PreCompoundModel* >(p); 108 if ( ! thePreCompound ) thePreCompound = new G4PreCompoundModel; 109 110 // Binary Cascade 111 G4HadronicInteraction* theIonBC1 = new G4BinaryLightIonReaction( thePreCompound ); 112 theIonBC1->SetMinEnergy( 0.0 ); // Used for generic ions 113 theIonBC1->SetMaxEnergy( maxBIC ); 114 115 G4HadronicInteraction* theIonBC2 = new G4BinaryLightIonReaction( thePreCompound ); 116 theIonBC2->SetMinEnergy( maxPHP - overlapPHP_BIC ); // Used for d, t, He3, alpha 117 theIonBC2->SetMaxEnergy( maxBIC ); 118 119 // FTFP 120 G4HadronicInteraction* theFTFP = nullptr; 121 if(maxFTF > maxBIC) { 122 G4FTFBuilder theBuilder( "FTFP", thePreCompound ); 123 theFTFP = theBuilder.GetModel(); 124 theFTFP->SetMinEnergy( minFTF ); 125 theFTFP->SetMaxEnergy( maxFTF ); 126 } 127 128 G4CrossSectionInelastic* theNuclNuclData = 129 new G4CrossSectionInelastic( new G4ComponentGGNuclNuclXsc() ); 130 131 // ParticleHP : deuteron 132 G4HadronicInteraction* modelDeuteronPHP = 133 new G4ParticleHPInelastic( G4Deuteron::Deuteron(), "ParticleHPInelastic" ); 134 modelDeuteronPHP->SetMinEnergy( 0.0 ); 135 modelDeuteronPHP->SetMaxEnergy( maxPHP ); 136 G4ParticleHPInelasticData* theDeuteronHPInelasticData = 137 new G4ParticleHPInelasticData( G4Deuteron::Deuteron() ); 138 theDeuteronHPInelasticData->SetMinKinEnergy( 0.0 ); 139 theDeuteronHPInelasticData->SetMaxKinEnergy( maxPHP ); 140 141 // ParticleHP : triton 142 G4HadronicInteraction* modelTritonPHP = 143 new G4ParticleHPInelastic( G4Triton::Triton(), "ParticleHPInelastic" ); 144 modelTritonPHP->SetMinEnergy( 0.0 ); 145 modelTritonPHP->SetMaxEnergy( maxPHP ); 146 G4ParticleHPInelasticData* theTritonHPInelasticData = 147 new G4ParticleHPInelasticData( G4Triton::Triton() ); 148 theTritonHPInelasticData->SetMinKinEnergy( 0.0 ); 149 theTritonHPInelasticData->SetMaxKinEnergy( maxPHP ); 150 151 // ParticleHP : 3He 152 G4HadronicInteraction* modelHe3PHP = 153 new G4ParticleHPInelastic( G4He3::He3(), "ParticleHPInelastic" ); 154 modelHe3PHP->SetMinEnergy( 0.0 ); 155 modelHe3PHP->SetMaxEnergy( maxPHP ); 156 G4ParticleHPInelasticData* theHe3HPInelasticData = 157 new G4ParticleHPInelasticData( G4He3::He3() ); 158 theHe3HPInelasticData->SetMinKinEnergy( 0.0 ); 159 theHe3HPInelasticData->SetMaxKinEnergy( maxPHP ); 160 161 // ParticleHP : alpha 162 G4HadronicInteraction* modelAlphaPHP = 163 new G4ParticleHPInelastic( G4Alpha::Alpha(), "ParticleHPInelastic" ); 164 modelAlphaPHP->SetMinEnergy( 0.0 ); 165 modelAlphaPHP->SetMaxEnergy( maxPHP ); 166 G4ParticleHPInelasticData* theAlphaHPInelasticData = 167 new G4ParticleHPInelasticData( G4Alpha::Alpha() ); 168 theAlphaHPInelasticData->SetMinKinEnergy( 0.0 ); 169 theAlphaHPInelasticData->SetMaxKinEnergy( maxPHP ); 170 171 AddProcess( "dInelastic", G4Deuteron::Deuteron(), theDeuteronHPInelasticData, 172 modelDeuteronPHP, theIonBC2, theFTFP, theNuclNuclData); 173 AddProcess( "tInelastic", G4Triton::Triton(), theTritonHPInelasticData, 174 modelTritonPHP, theIonBC2, theFTFP, theNuclNuclData); 175 AddProcess( "He3Inelastic", G4He3::He3(), theHe3HPInelasticData, 176 modelHe3PHP, theIonBC2, theFTFP, theNuclNuclData); 177 AddProcess( "alphaInelastic", G4Alpha::Alpha(), theAlphaHPInelasticData, 178 modelAlphaPHP, theIonBC2, theFTFP, theNuclNuclData); 179 AddProcess( "ionInelastic", G4GenericIon::GenericIon(), nullptr, 180 nullptr, theIonBC1, theFTFP, theNuclNuclData); 181 182 if ( verbose > 1 ) G4cout << "G4IonPhysicsPHP::ConstructProcess done! " << G4endl; 183 } 184 185 void G4IonPhysicsPHP::AddProcess( const G4String& name, G4ParticleDefinition* part, 186 G4ParticleHPInelasticData* xsecPHP, G4HadronicInteraction* aPHP, 187 G4HadronicInteraction* aBIC, 188 G4HadronicInteraction* aFTFP, 189 G4VCrossSectionDataSet* theNuclNuclData) 190 { 191 G4HadronInelasticProcess* hadi = new G4HadronInelasticProcess( name, part ); 192 G4ProcessManager* pManager = part->GetProcessManager(); 193 pManager->AddDiscreteProcess( hadi ); 194 hadi->AddDataSet( theNuclNuclData ); 195 if ( aPHP ) { 196 hadi->RegisterMe( aPHP ); 197 if ( xsecPHP ) { 198 hadi->AddDataSet( xsecPHP ); 199 } 200 } 201 hadi->RegisterMe( aBIC ); 202 if(aFTFP) { hadi->RegisterMe( aFTFP ); } 203 } 204 205