File indexing completed on 2024-04-06 12:30:24
0001
0002
0003
0004 #include "SimG4Core/GFlash/interface/GflashHadronWrapperProcess.h"
0005
0006 #include "G4ios.hh"
0007 #include "G4GPILSelection.hh"
0008 #include "G4ProcessManager.hh"
0009 #include "G4ProcessVector.hh"
0010 #include "G4Track.hh"
0011 #include "G4VParticleChange.hh"
0012 #include "G4VProcess.hh"
0013
0014 using namespace CLHEP;
0015
0016 GflashHadronWrapperProcess::GflashHadronWrapperProcess(G4String processName)
0017 : particleChange(nullptr), pmanager(nullptr), fProcessVector(nullptr), fProcess(nullptr) {
0018 theProcessName = processName;
0019 }
0020
0021 GflashHadronWrapperProcess::~GflashHadronWrapperProcess() {}
0022
0023 G4VParticleChange *GflashHadronWrapperProcess::PostStepDoIt(const G4Track &track, const G4Step &step) {
0024
0025
0026 particleChange = pRegProcess->PostStepDoIt(track, step);
0027
0028
0029
0030
0031
0032
0033
0034 particleChange->UpdateStepForPostStep(const_cast<G4Step *>(&step));
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 G4TrackVector *fSecondary = (const_cast<G4Step *>(&step))->GetfSecondary();
0053 G4int nSecondarySave = fSecondary->size();
0054
0055 G4int num2ndaries = particleChange->GetNumberOfSecondaries();
0056 G4Track *tempSecondaryTrack;
0057
0058 for (G4int DSecLoop = 0; DSecLoop < num2ndaries; DSecLoop++) {
0059 tempSecondaryTrack = particleChange->GetSecondary(DSecLoop);
0060
0061
0062 tempSecondaryTrack->SetCreatorProcess(pRegProcess);
0063
0064
0065 fSecondary->push_back(tempSecondaryTrack);
0066
0067 }
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083 pmanager = track.GetDefinition()->GetProcessManager();
0084
0085 G4double testGPIL = DBL_MAX;
0086 G4double fStepLength = 0.0;
0087 G4ForceCondition fForceCondition = InActivated;
0088
0089 fStepLength = step.GetStepLength();
0090
0091 fProcessVector = pmanager->GetPostStepProcessVector(typeDoIt);
0092
0093
0094
0095
0096
0097 const G4TrackStatus keepStatus = track.GetTrackStatus();
0098
0099 (const_cast<G4Track *>(&track))->SetTrackStatus(fPostponeToNextEvent);
0100 int fpv_entries = fProcessVector->entries();
0101 for (G4int ipm = 0; ipm < fpv_entries; ipm++) {
0102 fProcess = (*fProcessVector)(ipm);
0103
0104 if (fProcess->GetProcessType() == fParameterisation) {
0105
0106
0107 testGPIL = fProcess->PostStepGPIL(track, fStepLength, &fForceCondition);
0108
0109
0110
0111
0112 if (fForceCondition == ExclusivelyForced) {
0113
0114
0115
0116 G4int nsec = particleChange->GetNumberOfSecondaries();
0117 for (G4int DSecLoop = 0; DSecLoop < nsec; DSecLoop++) {
0118 G4Track *tempSecondaryTrack = particleChange->GetSecondary(DSecLoop);
0119 delete tempSecondaryTrack;
0120 }
0121 particleChange->Clear();
0122
0123
0124
0125
0126 (const_cast<G4Step *>(&step))->SetStepLength(testGPIL);
0127 (const_cast<G4Track *>(&track))->SetStepLength(testGPIL);
0128
0129 step.GetPostStepPoint()->SetStepStatus(fExclusivelyForcedProc);
0130 ;
0131 step.GetPostStepPoint()->SetProcessDefinedStep(fProcess);
0132 step.GetPostStepPoint()->SetSafety(0.0);
0133
0134
0135
0136 particleChange = fProcess->PostStepDoIt(track, step);
0137
0138
0139 particleChange->UpdateStepForPostStep(const_cast<G4Step *>(&step));
0140
0141
0142 (const_cast<G4Step *>(&step))->UpdateTrack();
0143
0144
0145
0146
0147 step.GetPostStepPoint()->SetSafety(0.0);
0148
0149
0150 (const_cast<G4Track *>(&track))->SetTrackStatus(particleChange->GetTrackStatus());
0151 } else {
0152
0153 (const_cast<G4Track *>(&track))->SetTrackStatus(keepStatus);
0154 }
0155
0156 break;
0157 }
0158 }
0159
0160
0161
0162
0163
0164
0165 G4TrackVector::iterator itv = fSecondary->begin();
0166 itv += nSecondarySave;
0167
0168
0169 fSecondary->erase(itv, itv + num2ndaries);
0170
0171
0172
0173 return particleChange;
0174 }
0175
0176 void GflashHadronWrapperProcess::Print(const G4Step &step) {
0177 G4cout << " GflashHadronWrapperProcess ProcessName, PreStepPosition, preStepPoint KE, PostStepPoint KE, DeltaEnergy "
0178 "Nsec \n "
0179 << step.GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName() << " "
0180 << step.GetPostStepPoint()->GetPosition() << " " << step.GetPreStepPoint()->GetKineticEnergy() / CLHEP::GeV
0181 << " " << step.GetPostStepPoint()->GetKineticEnergy() / CLHEP::GeV << " " << step.GetDeltaEnergy() / CLHEP::GeV
0182 << " " << particleChange->GetNumberOfSecondaries() << G4endl;
0183 }