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: G4LightIonQMDPhysics 30 // 31 // Author: Yoshihide Sato - November 2023 32 // 33 // Description: Variant of G4IonQMDPhysics in which G4LightIonQMDReaction 34 // is used in the interval [30 MeV, 510 MeV]/nucleon 35 // (G4BinaryLightIonReaction is used below 40 MeV/nucleon, 36 // and G4QMDReaction is used in the interval 37 // [500 MeV, 6 GeV]/nucleon). 38 // 39 // Modified: 40 // 41 //---------------------------------------------------------------------------- 42 // 43 44 #include "G4LightIonQMDPhysics.hh" 45 46 #include "G4SystemOfUnits.hh" 47 48 #include "G4Deuteron.hh" 49 #include "G4Triton.hh" 50 #include "G4He3.hh" 51 #include "G4Alpha.hh" 52 #include "G4GenericIon.hh" 53 #include "G4IonConstructor.hh" 54 55 #include "G4HadronInelasticProcess.hh" 56 #include "G4BinaryLightIonReaction.hh" 57 #include "G4LightIonQMDReaction.hh" 58 #include "G4QMDReaction.hh" 59 60 #include "G4PreCompoundModel.hh" 61 #include "G4ExcitationHandler.hh" 62 #include "G4FTFBuilder.hh" 63 #include "G4HadronicInteraction.hh" 64 #include "G4BuilderType.hh" 65 66 #include "G4ComponentGGNuclNuclXsc.hh" 67 #include "G4CrossSectionInelastic.hh" 68 69 #include "G4ParticleDefinition.hh" 70 #include "G4ParticleTable.hh" 71 #include "G4ProcessManager.hh" 72 73 // Nuclei 74 #include "G4IonConstructor.hh" 75 #include "G4BuilderType.hh" 76 #include "G4HadronicInteractionRegistry.hh" 77 #include "G4HadronicParameters.hh" 78 #include "G4DeexPrecoParameters.hh" 79 #include "G4NuclearLevelData.hh" 80 81 #include "G4HadronicParameters.hh" 82 83 // factory 84 #include "G4PhysicsConstructorFactory.hh" 85 // 86 G4_DECLARE_PHYSCONSTR_FACTORY(G4LightIonQMDPhysics); 87 88 G4LightIonQMDPhysics::G4LightIonQMDPhysics(G4int ver) 89 : G4LightIonQMDPhysics("LightIonQMD", ver) 90 {} 91 92 G4LightIonQMDPhysics::G4LightIonQMDPhysics(const G4String& nname, G4int ver) 93 : G4VPhysicsConstructor(nname), verbose(ver) 94 { 95 eminLIQMD = 30.*MeV; 96 emaxLIQMD = 500.*MeV; 97 eminQMD = 500.*MeV; 98 emaxQMD = 10.*GeV; 99 overlap = 10*MeV; 100 SetPhysicsType(bIons); 101 G4DeexPrecoParameters* param = G4NuclearLevelData::GetInstance()->GetParameters(); 102 param->SetDeexChannelsType(fCombined); 103 if(verbose > 1) { G4cout << "### IonPhysics: " << nname << G4endl; } 104 } 105 106 G4LightIonQMDPhysics::~G4LightIonQMDPhysics() 107 {} 108 109 void G4LightIonQMDPhysics::ConstructProcess() 110 { 111 G4HadronicInteraction* p = 112 G4HadronicInteractionRegistry::Instance()->FindModel("PRECO"); 113 G4PreCompoundModel* thePreCompound = static_cast<G4PreCompoundModel*>(p); 114 if(!thePreCompound) { thePreCompound = new G4PreCompoundModel; } 115 116 G4BinaryLightIonReaction* theIonBC = new G4BinaryLightIonReaction(thePreCompound); 117 theIonBC->SetMaxEnergy(eminLIQMD + overlap); 118 119 G4LightIonQMDReaction* theLIQMD = new G4LightIonQMDReaction(); 120 theLIQMD->SetMinEnergy(eminLIQMD); 121 theLIQMD->SetMaxEnergy(emaxLIQMD + overlap); 122 123 G4double emax = G4HadronicParameters::Instance()->GetMaxEnergy(); 124 emaxQMD = G4HadronicParameters::Instance()->GetMaxEnergyTransitionFTF_Cascade(); 125 G4HadronicInteraction* theFTFP = nullptr; 126 if(emax > emaxQMD) { 127 G4FTFBuilder theFTFPBuilder("FTFP",thePreCompound); 128 theFTFP = theFTFPBuilder.GetModel(); 129 theFTFP->SetMinEnergy(emaxQMD - overlap); 130 theFTFP->SetMaxEnergy(emax); 131 } 132 133 G4QMDReaction* theQMD = new G4QMDReaction(); 134 theQMD->SetMinEnergy(eminQMD); 135 theQMD->SetMaxEnergy(emaxQMD); 136 137 G4VCrossSectionDataSet* theNuclNuclData = 138 new G4CrossSectionInelastic( new G4ComponentGGNuclNuclXsc() ); 139 140 AddProcess("protonInelastic", G4Proton::Proton(), theIonBC, theQMD, theLIQMD, theFTFP, theNuclNuclData); 141 AddProcess("dInelastic", G4Deuteron::Deuteron(), theIonBC, theQMD, theLIQMD, theFTFP, theNuclNuclData); 142 AddProcess("tInelastic", G4Triton::Triton(), theIonBC, theQMD, theLIQMD, theFTFP, theNuclNuclData); 143 AddProcess("He3Inelastic", G4He3::He3(), theIonBC, theQMD, theLIQMD, theFTFP, theNuclNuclData); 144 AddProcess("alphaInelastic", G4Alpha::Alpha(), theIonBC, theQMD, theLIQMD, theFTFP, theNuclNuclData); 145 AddProcess("ionInelastic", G4GenericIon::GenericIon(), theIonBC, theQMD, theLIQMD, theFTFP, theNuclNuclData); 146 } 147 148 void G4LightIonQMDPhysics::AddProcess(const G4String& name, 149 G4ParticleDefinition* p, 150 G4BinaryLightIonReaction* BIC, 151 G4QMDReaction* QMD, 152 G4LightIonQMDReaction* LIQMD, 153 G4HadronicInteraction* FTFP, 154 G4VCrossSectionDataSet* theNuclNuclData) 155 { 156 G4HadronInelasticProcess* hadi = new G4HadronInelasticProcess(name, p); 157 G4ProcessManager* pManager = p->GetProcessManager(); 158 pManager->AddDiscreteProcess(hadi); 159 160 hadi->AddDataSet(theNuclNuclData); 161 162 hadi->RegisterMe(BIC); 163 hadi->RegisterMe(LIQMD); 164 hadi->RegisterMe(QMD); 165 if(FTFP) { hadi->RegisterMe(FTFP); } 166 167 if(verbose > 1) { 168 G4cout << "Register " << hadi->GetProcessName() 169 << " for " << p->GetParticleName() << G4endl 170 << " Binary Cascade for E(MeV)= 0 - " 171 << eminLIQMD+overlap; 172 G4cout << " LIQMD for E(MeV)= " << eminLIQMD << " - " << emaxLIQMD+overlap; 173 G4cout << " QMD for E(MeV)= " << eminQMD << " - " << emaxQMD; 174 if(FTFP) { 175 G4cout << " FTFP for E(MeV)= " << emaxQMD-overlap << " - " << FTFP->GetMaxEnergy(); 176 } 177 G4cout << G4endl; 178 } 179 } 180 181 void G4LightIonQMDPhysics::ConstructParticle() 182 { 183 // Construct light ions 184 G4IonConstructor pConstructor; 185 pConstructor.ConstructParticle(); 186 } 187