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 // $Id: G4MuonMinusAtomicCapture.cc $ 26 // 27 // 27 //-------------------------------------------- 28 //--------------------------------------------------------------------- 28 // 29 // 29 // GEANT4 Class 30 // GEANT4 Class 30 // 31 // 31 // GEANT4 Class header file 32 // GEANT4 Class header file 32 // 33 // 33 // File name: G4MuonMinusAtomicCapture 34 // File name: G4MuonMinusAtomicCapture 34 // 35 // 35 // 20160912 K.L. Genser - New process using G4 << 36 // 20160701 K.L. Genser - New process using G4MuonicAtom somewhat based on G4HadronStoppingProcess 36 // based on G4HadronSto << 37 // 37 // 38 // Class Description: 38 // Class Description: 39 // 39 // 40 // Stopping of mu- 40 // Stopping of mu- 41 // 41 // 42 // G4VParticleChange will contain gammas from 42 // G4VParticleChange will contain gammas from G4EmCaptureCascade and 43 // resulting G4MuonicAtom 43 // resulting G4MuonicAtom 44 // 44 // 45 // 45 // 46 //-------------------------------------------- 46 //------------------------------------------------------------------------ 47 47 48 #include "G4MuonMinusAtomicCapture.hh" 48 #include "G4MuonMinusAtomicCapture.hh" 49 #include "G4ParticleDefinition.hh" 49 #include "G4ParticleDefinition.hh" 50 #include "G4HadronicProcessType.hh" 50 #include "G4HadronicProcessType.hh" 51 #include "G4MuonMinusBoundDecay.hh" 51 #include "G4MuonMinusBoundDecay.hh" 52 #include "G4HadronicInteraction.hh" 52 #include "G4HadronicInteraction.hh" 53 #include "G4HadProjectile.hh" << 54 #include "G4HadronicProcessStore.hh" 53 #include "G4HadronicProcessStore.hh" 55 #include "G4EmCaptureCascade.hh" 54 #include "G4EmCaptureCascade.hh" 56 #include "G4MuonMinus.hh" 55 #include "G4MuonMinus.hh" 57 #include "G4IonTable.hh" 56 #include "G4IonTable.hh" 58 #include "G4RandomDirection.hh" 57 #include "G4RandomDirection.hh" 59 #include "G4HadSecondary.hh" 58 #include "G4HadSecondary.hh" 60 59 61 //....oooOO0OOooo........oooOO0OOooo........oo 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 62 61 63 G4MuonMinusAtomicCapture::G4MuonMinusAtomicCap 62 G4MuonMinusAtomicCapture::G4MuonMinusAtomicCapture(const G4String& name) 64 : G4VRestProcess(name, fHadronic), << 63 : G4HadronicProcess(name, fHadronAtRest),// name, process type 65 fElementSelector(new G4ElementSelector()), 64 fElementSelector(new G4ElementSelector()), 66 fEmCascade(new G4EmCaptureCascade()), // << 65 fEmCascade(new G4EmCaptureCascade()) // Owned by InteractionRegistry 67 theTotalResult(new G4ParticleChange()), << 68 result(nullptr) << 69 { 66 { 70 SetProcessSubType(fMuAtomicCapture); << 67 // Modify G4VProcess flags to emulate G4VRest instead of G4VDiscrete >> 68 enableAtRestDoIt = true; >> 69 enablePostStepDoIt = false; 71 G4HadronicProcessStore::Instance()->Register 70 G4HadronicProcessStore::Instance()->RegisterExtraProcess(this); 72 } 71 } 73 72 74 //....oooOO0OOooo........oooOO0OOooo........oo 73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 75 74 76 G4MuonMinusAtomicCapture::~G4MuonMinusAtomicCa 75 G4MuonMinusAtomicCapture::~G4MuonMinusAtomicCapture() 77 { << 76 {} 78 G4HadronicProcessStore::Instance()->DeRegist << 79 delete theTotalResult; << 80 } << 81 77 82 //....oooOO0OOooo........oooOO0OOooo........oo 78 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 83 79 84 G4bool G4MuonMinusAtomicCapture::IsApplicable( 80 G4bool G4MuonMinusAtomicCapture::IsApplicable(const G4ParticleDefinition& p) 85 { 81 { 86 return (&p == G4MuonMinus::MuonMinus()); 82 return (&p == G4MuonMinus::MuonMinus()); 87 } 83 } 88 //....oooOO0OOooo........oooOO0OOooo........oo 84 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 89 85 90 void 86 void 91 G4MuonMinusAtomicCapture::PreparePhysicsTable( 87 G4MuonMinusAtomicCapture::PreparePhysicsTable(const G4ParticleDefinition& p) 92 { 88 { 93 G4HadronicProcessStore::Instance()->Register 89 G4HadronicProcessStore::Instance()->RegisterParticleForExtraProcess(this,&p); 94 } 90 } 95 91 96 //....oooOO0OOooo........oooOO0OOooo........oo 92 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 97 93 98 void G4MuonMinusAtomicCapture::BuildPhysicsTab 94 void G4MuonMinusAtomicCapture::BuildPhysicsTable(const G4ParticleDefinition& p) 99 { 95 { 100 G4HadronicProcessStore::Instance()->PrintInf 96 G4HadronicProcessStore::Instance()->PrintInfo(&p); 101 } 97 } 102 98 103 //....oooOO0OOooo........oooOO0OOooo........oo 99 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 104 100 105 G4double G4MuonMinusAtomicCapture::AtRestGetPh 101 G4double G4MuonMinusAtomicCapture::AtRestGetPhysicalInteractionLength( 106 102 const G4Track&, G4ForceCondition* condition) 107 { 103 { 108 *condition = NotForced; 104 *condition = NotForced; 109 return 0.0; 105 return 0.0; 110 } 106 } 111 107 112 //....oooOO0OOooo........oooOO0OOooo........oo 108 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 113 109 >> 110 G4double G4MuonMinusAtomicCapture::PostStepGetPhysicalInteractionLength( >> 111 const G4Track&, G4double, G4ForceCondition* condition) >> 112 { >> 113 *condition = NotForced; >> 114 return DBL_MAX; >> 115 } >> 116 >> 117 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 118 114 G4VParticleChange* G4MuonMinusAtomicCapture::A 119 G4VParticleChange* G4MuonMinusAtomicCapture::AtRestDoIt(const G4Track& track, 115 120 const G4Step&) 116 { 121 { 117 // if primary is not Alive then do nothing ( 122 // if primary is not Alive then do nothing (how?) 118 theTotalResult->Initialize(track); 123 theTotalResult->Initialize(track); 119 124 120 G4Nucleus* nucleus = &targetNucleus; << 125 G4Nucleus* nucleus = GetTargetNucleusPointer(); 121 // the call below actually sets the nucleus 126 // the call below actually sets the nucleus params; 122 // G4Nucleus targetNucleus; is a member of G 127 // G4Nucleus targetNucleus; is a member of G4HadronicProcess 123 // G4Element* elm = 128 // G4Element* elm = 124 fElementSelector->SelectZandA(track, nucleus 129 fElementSelector->SelectZandA(track, nucleus); 125 130 126 thePro.Initialise(track); // thePro was G4Ha << 131 G4HadFinalState* result = 0; >> 132 thePro.Initialise(track); // thePro is G4HadProjectile from G4HadronicProcess 127 133 128 // save track time an dstart capture from ze 134 // save track time an dstart capture from zero time 129 thePro.SetGlobalTime(0.0); 135 thePro.SetGlobalTime(0.0); 130 G4double time0 = track.GetGlobalTime(); 136 G4double time0 = track.GetGlobalTime(); 131 137 132 // Do the electromagnetic cascade in the nuc 138 // Do the electromagnetic cascade in the nuclear field. 133 // EM cascade should keep G4HadFinalState ob 139 // EM cascade should keep G4HadFinalState object, 134 // because it will not be deleted at the end 140 // because it will not be deleted at the end of this method 135 // 141 // 136 result = fEmCascade->ApplyYourself(thePro, * 142 result = fEmCascade->ApplyYourself(thePro, *nucleus); 137 G4double ebound = result->GetLocalEnergyDepo 143 G4double ebound = result->GetLocalEnergyDeposit(); // may need to carry this over; review 138 G4double edep = 0.0; 144 G4double edep = 0.0; 139 G4int nSecondaries = (G4int)result->GetNumbe << 145 G4int nSecondaries = result->GetNumberOfSecondaries(); 140 thePro.SetBoundEnergy(ebound); 146 thePro.SetBoundEnergy(ebound); 141 147 142 // creating the muonic atom 148 // creating the muonic atom 143 ++nSecondaries; 149 ++nSecondaries; 144 150 145 G4IonTable* itp = G4IonTable::GetIonTable(); 151 G4IonTable* itp = G4IonTable::GetIonTable(); 146 G4ParticleDefinition* muonicAtom = itp->GetM 152 G4ParticleDefinition* muonicAtom = itp->GetMuonicAtom(nucleus->GetZ_asInt(), 147 153 nucleus->GetA_asInt()); 148 154 149 G4DynamicParticle* dp = new G4DynamicParticl 155 G4DynamicParticle* dp = new G4DynamicParticle(muonicAtom,G4RandomDirection(),0.); 150 G4HadSecondary hadSec(dp); 156 G4HadSecondary hadSec(dp); 151 hadSec.SetTime(time0); 157 hadSec.SetTime(time0); 152 result->AddSecondary(hadSec); 158 result->AddSecondary(hadSec); 153 159 154 // Fill results 160 // Fill results 155 // 161 // 156 theTotalResult->ProposeTrackStatus(fStopAndK 162 theTotalResult->ProposeTrackStatus(fStopAndKill); 157 theTotalResult->ProposeLocalEnergyDeposit(ed 163 theTotalResult->ProposeLocalEnergyDeposit(edep); 158 theTotalResult->SetNumberOfSecondaries(nSeco 164 theTotalResult->SetNumberOfSecondaries(nSecondaries); 159 G4double w = track.GetWeight(); 165 G4double w = track.GetWeight(); 160 theTotalResult->ProposeWeight(w); 166 theTotalResult->ProposeWeight(w); 161 167 162 #ifdef G4VERBOSE << 168 G4cout << __func__ 163 if (GetVerboseLevel() > 1) { << 169 << " nSecondaries " 164 G4cout << __func__ << 170 << nSecondaries 165 << " nSecondaries " << 171 << G4endl; 166 << nSecondaries << 167 << G4endl; << 168 } << 169 #endif << 170 172 171 for(G4int i=0; i<nSecondaries; ++i) { 173 for(G4int i=0; i<nSecondaries; ++i) { 172 G4HadSecondary* sec = result->GetSecondary 174 G4HadSecondary* sec = result->GetSecondary(i); 173 175 174 // add track global time to the reaction t 176 // add track global time to the reaction time 175 G4double time = sec->GetTime(); 177 G4double time = sec->GetTime(); 176 if(time < 0.0) { time = 0.0; } 178 if(time < 0.0) { time = 0.0; } 177 time += time0; 179 time += time0; 178 180 179 #ifdef G4VERBOSE << 181 G4cout << __func__ 180 if (GetVerboseLevel() > 1) { << 182 << " " 181 G4cout << __func__ << 183 << i 182 << " " << 184 << " Resulting secondary " 183 << i << 185 << sec->GetParticle()->GetPDGcode() 184 << " Resulting secondary " << 186 << " " 185 << sec->GetParticle()->GetPDGcode << 187 << sec->GetParticle()->GetDefinition()->GetParticleName() 186 << " " << 188 << G4endl; 187 << sec->GetParticle()->GetDefinit << 188 << G4endl; << 189 } << 190 #endif << 191 189 192 // create secondary track 190 // create secondary track 193 G4Track* t = new G4Track(sec->GetParticle( 191 G4Track* t = new G4Track(sec->GetParticle(), 194 time, 192 time, 195 track.GetPosition()); 193 track.GetPosition()); 196 t->SetWeight(w*sec->GetWeight()); 194 t->SetWeight(w*sec->GetWeight()); 197 195 198 t->SetTouchableHandle(track.GetTouchableHa 196 t->SetTouchableHandle(track.GetTouchableHandle()); 199 theTotalResult->AddSecondary(t); 197 theTotalResult->AddSecondary(t); 200 } 198 } 201 result->Clear(); 199 result->Clear(); 202 200 203 // fixme: needs to be done at the MuonicAtom 201 // fixme: needs to be done at the MuonicAtom level 204 // if (epReportLevel != 0) { // G4HadronicPr 202 // if (epReportLevel != 0) { // G4HadronicProcess:: 205 // CheckEnergyMomentumConservation(track, 203 // CheckEnergyMomentumConservation(track, *nucleus); 206 // } 204 // } 207 return theTotalResult; 205 return theTotalResult; 208 } 206 } 209 207 210 //....oooOO0OOooo........oooOO0OOooo........oo 208 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 211 209 212 void G4MuonMinusAtomicCapture::ProcessDescript 210 void G4MuonMinusAtomicCapture::ProcessDescription(std::ostream& outFile) const 213 { 211 { 214 outFile << "Stopping of mu- using default el 212 outFile << "Stopping of mu- using default element selector, EM cascade" >> 213 << " sampling and bound decay sampling.\n" >> 214 << "Bertini model is used for nuclear capture\n" 215 << "G4MuonicAtom is created\n"; 215 << "G4MuonicAtom is created\n"; 216 } 216 } 217 217 218 //....oooOO0OOooo........oooOO0OOooo........oo 218 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 219 219