Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 //-------------------------------------------- 28 // 29 // GEANT4 Class 30 // 31 // GEANT4 Class header file 32 // 33 // File name: G4MuonMinusAtomicCapture 34 // 35 // 20160912 K.L. Genser - New process using G4 36 // based on G4HadronSto 37 // 38 // Class Description: 39 // 40 // Stopping of mu- 41 // 42 // G4VParticleChange will contain gammas from 43 // resulting G4MuonicAtom 44 // 45 // 46 //-------------------------------------------- 47 48 #include "G4MuonMinusAtomicCapture.hh" 49 #include "G4ParticleDefinition.hh" 50 #include "G4HadronicProcessType.hh" 51 #include "G4MuonMinusBoundDecay.hh" 52 #include "G4HadronicInteraction.hh" 53 #include "G4HadProjectile.hh" 54 #include "G4HadronicProcessStore.hh" 55 #include "G4EmCaptureCascade.hh" 56 #include "G4MuonMinus.hh" 57 #include "G4IonTable.hh" 58 #include "G4RandomDirection.hh" 59 #include "G4HadSecondary.hh" 60 61 //....oooOO0OOooo........oooOO0OOooo........oo 62 63 G4MuonMinusAtomicCapture::G4MuonMinusAtomicCap 64 : G4VRestProcess(name, fHadronic), 65 fElementSelector(new G4ElementSelector()), 66 fEmCascade(new G4EmCaptureCascade()), // 67 theTotalResult(new G4ParticleChange()), 68 result(nullptr) 69 { 70 SetProcessSubType(fMuAtomicCapture); 71 G4HadronicProcessStore::Instance()->Register 72 } 73 74 //....oooOO0OOooo........oooOO0OOooo........oo 75 76 G4MuonMinusAtomicCapture::~G4MuonMinusAtomicCa 77 { 78 G4HadronicProcessStore::Instance()->DeRegist 79 delete theTotalResult; 80 } 81 82 //....oooOO0OOooo........oooOO0OOooo........oo 83 84 G4bool G4MuonMinusAtomicCapture::IsApplicable( 85 { 86 return (&p == G4MuonMinus::MuonMinus()); 87 } 88 //....oooOO0OOooo........oooOO0OOooo........oo 89 90 void 91 G4MuonMinusAtomicCapture::PreparePhysicsTable( 92 { 93 G4HadronicProcessStore::Instance()->Register 94 } 95 96 //....oooOO0OOooo........oooOO0OOooo........oo 97 98 void G4MuonMinusAtomicCapture::BuildPhysicsTab 99 { 100 G4HadronicProcessStore::Instance()->PrintInf 101 } 102 103 //....oooOO0OOooo........oooOO0OOooo........oo 104 105 G4double G4MuonMinusAtomicCapture::AtRestGetPh 106 107 { 108 *condition = NotForced; 109 return 0.0; 110 } 111 112 //....oooOO0OOooo........oooOO0OOooo........oo 113 114 G4VParticleChange* G4MuonMinusAtomicCapture::A 115 116 { 117 // if primary is not Alive then do nothing ( 118 theTotalResult->Initialize(track); 119 120 G4Nucleus* nucleus = &targetNucleus; 121 // the call below actually sets the nucleus 122 // G4Nucleus targetNucleus; is a member of G 123 // G4Element* elm = 124 fElementSelector->SelectZandA(track, nucleus 125 126 thePro.Initialise(track); // thePro was G4Ha 127 128 // save track time an dstart capture from ze 129 thePro.SetGlobalTime(0.0); 130 G4double time0 = track.GetGlobalTime(); 131 132 // Do the electromagnetic cascade in the nuc 133 // EM cascade should keep G4HadFinalState ob 134 // because it will not be deleted at the end 135 // 136 result = fEmCascade->ApplyYourself(thePro, * 137 G4double ebound = result->GetLocalEnergyDepo 138 G4double edep = 0.0; 139 G4int nSecondaries = (G4int)result->GetNumbe 140 thePro.SetBoundEnergy(ebound); 141 142 // creating the muonic atom 143 ++nSecondaries; 144 145 G4IonTable* itp = G4IonTable::GetIonTable(); 146 G4ParticleDefinition* muonicAtom = itp->GetM 147 148 149 G4DynamicParticle* dp = new G4DynamicParticl 150 G4HadSecondary hadSec(dp); 151 hadSec.SetTime(time0); 152 result->AddSecondary(hadSec); 153 154 // Fill results 155 // 156 theTotalResult->ProposeTrackStatus(fStopAndK 157 theTotalResult->ProposeLocalEnergyDeposit(ed 158 theTotalResult->SetNumberOfSecondaries(nSeco 159 G4double w = track.GetWeight(); 160 theTotalResult->ProposeWeight(w); 161 162 #ifdef G4VERBOSE 163 if (GetVerboseLevel() > 1) { 164 G4cout << __func__ 165 << " nSecondaries " 166 << nSecondaries 167 << G4endl; 168 } 169 #endif 170 171 for(G4int i=0; i<nSecondaries; ++i) { 172 G4HadSecondary* sec = result->GetSecondary 173 174 // add track global time to the reaction t 175 G4double time = sec->GetTime(); 176 if(time < 0.0) { time = 0.0; } 177 time += time0; 178 179 #ifdef G4VERBOSE 180 if (GetVerboseLevel() > 1) { 181 G4cout << __func__ 182 << " " 183 << i 184 << " Resulting secondary " 185 << sec->GetParticle()->GetPDGcode 186 << " " 187 << sec->GetParticle()->GetDefinit 188 << G4endl; 189 } 190 #endif 191 192 // create secondary track 193 G4Track* t = new G4Track(sec->GetParticle( 194 time, 195 track.GetPosition()); 196 t->SetWeight(w*sec->GetWeight()); 197 198 t->SetTouchableHandle(track.GetTouchableHa 199 theTotalResult->AddSecondary(t); 200 } 201 result->Clear(); 202 203 // fixme: needs to be done at the MuonicAtom 204 // if (epReportLevel != 0) { // G4HadronicPr 205 // CheckEnergyMomentumConservation(track, 206 // } 207 return theTotalResult; 208 } 209 210 //....oooOO0OOooo........oooOO0OOooo........oo 211 212 void G4MuonMinusAtomicCapture::ProcessDescript 213 { 214 outFile << "Stopping of mu- using default el 215 << "G4MuonicAtom is created\n"; 216 } 217 218 //....oooOO0OOooo........oooOO0OOooo........oo 219