File indexing completed on 2025-12-01 09:26:54
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 #include "RunAction.hh"
0047
0048 #include "Run.hh"
0049
0050 #include "G4DNAChemistryManager.hh"
0051 #include "G4Run.hh"
0052 #include "G4RunManager.hh"
0053 #include "G4SystemOfUnits.hh"
0054 #include "G4UnitsTable.hh"
0055
0056
0057 RunAction::RunAction() : G4UserRunAction() {}
0058
0059
0060
0061 G4Run* RunAction::GenerateRun()
0062 {
0063 Run* run = new Run();
0064 return run;
0065 }
0066
0067
0068
0069 void RunAction::BeginOfRunAction(const G4Run* run)
0070 {
0071
0072 if (G4DNAChemistryManager::GetInstanceIfExists() != nullptr)
0073 G4DNAChemistryManager::GetInstanceIfExists()->BeginOfRunAction(run);
0074
0075
0076 G4RunManager::GetRunManager()->SetRandomNumberStore(false);
0077 }
0078
0079
0080
0081 void RunAction::EndOfRunAction(const G4Run* run)
0082 {
0083
0084 if (G4DNAChemistryManager::GetInstanceIfExists() != nullptr)
0085 G4DNAChemistryManager::GetInstanceIfExists()->EndOfRunAction(run);
0086
0087 G4int nofEvents = run->GetNumberOfEvent();
0088 if (nofEvents == 0) return;
0089
0090
0091
0092 const Run* dnadamage3Run = static_cast<const Run*>(run);
0093 G4double sumDose = dnadamage3Run->GetSumDose();
0094
0095
0096
0097 if (IsMaster()) {
0098 G4cout << G4endl << "--------------------End of Global Run-----------------------" << G4endl
0099 << " The run has " << nofEvents << " events " << G4endl;
0100
0101 ScoreSpecies* masterScorer = dynamic_cast<ScoreSpecies*>(dnadamage3Run->GetPrimitiveScorer());
0102
0103 ScoreStrandBreaks* masterSBScorer =
0104 dynamic_cast<ScoreStrandBreaks*>(dnadamage3Run->GetSBScorer());
0105
0106 G4cout << "Number of events recorded by the species scorer = "
0107 << masterScorer->GetNumberOfRecordedEvents() << G4endl;
0108
0109
0110 Run* aRun = (Run*)run;
0111 G4THitsMap<G4double>* totLET = aRun->GetLET();
0112 if (!totLET) {
0113 G4cout << "No LET data available." << G4endl;
0114 return;
0115 }
0116 G4int nOfEvent = totLET->entries();
0117 G4double LET_mean = 0;
0118 G4double LET_square = 0;
0119
0120 if (nOfEvent > 0) {
0121 for (G4int i = 0; i < nOfEvent; i++) {
0122 G4double* LET = (*totLET)[i];
0123 if (!LET) continue;
0124 LET_mean += *LET;
0125 LET_square += (*LET) * (*LET);
0126 }
0127 LET_mean /= nOfEvent;
0128 G4double variance = LET_square / nOfEvent - std::pow(LET_mean, 2);
0129 if (variance >= 0) {
0130 LET_square = std::sqrt(variance);
0131 }
0132 else {
0133 G4cerr << "Warning: Negative variance encountered. Setting LET_square to 0." << G4endl;
0134 LET_square = 0;
0135 }
0136 }
0137 else {
0138 LET_mean = 0;
0139 LET_square = 0;
0140 }
0141 masterScorer->OutputAndClear();
0142 masterSBScorer->OutputAndClear(LET_mean, LET_square);
0143 }
0144 else {
0145 G4cout << G4endl << "--------------------End of Local Run------------------------" << G4endl
0146 << " The run has " << nofEvents << " events" << G4endl;
0147 }
0148
0149 G4cout << " Total energy deposited in the world volume : " << sumDose / eV << " eV" << G4endl
0150 << " ------------------------------------------------------------" << G4endl << G4endl;
0151 }
0152
0153