File indexing completed on 2026-03-30 07:50:44
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 "Run.hh"
0047
0048 #include "RunAction.hh"
0049 #include "ScoreSpecies.hh"
0050
0051 #include "G4Event.hh"
0052 #include "G4HCofThisEvent.hh"
0053 #include "G4RunManager.hh"
0054 #include "G4SDManager.hh"
0055 #include "G4SystemOfUnits.hh"
0056 #include "G4THitsMap.hh"
0057 #include "G4VSensitiveDetector.hh"
0058
0059 #include <map>
0060
0061
0062 Run::Run() : G4Run()
0063 {
0064 G4MultiFunctionalDetector* mfdet = dynamic_cast<G4MultiFunctionalDetector*>(
0065 G4SDManager::GetSDMpointer()->FindSensitiveDetector("mfDetector"));
0066 G4int CollectionIDspecies = G4SDManager::GetSDMpointer()->GetCollectionID("mfDetector/Species");
0067 G4int CollectionIDLET = G4SDManager::GetSDMpointer()->GetCollectionID("mfDetector/LET");
0068 G4int CollectionSB = G4SDManager::GetSDMpointer()->GetCollectionID("mfDetector/StrandBreaks");
0069
0070 fTotalLET = new G4THitsMap<G4double>("mfDetector", "LET");
0071 fScorerRun = mfdet->GetPrimitive(CollectionIDspecies);
0072 fLETScorerRun = mfdet->GetPrimitive(CollectionIDLET);
0073 fStrandBreakRun = mfdet->GetPrimitive(CollectionSB);
0074 }
0075
0076
0077
0078 void Run::RecordEvent(const G4Event* event)
0079 {
0080 if (event->IsAborted()) return;
0081
0082 G4int CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("mfDetector/Species");
0083
0084 G4int CollectionIDLET = G4SDManager::GetSDMpointer()->GetCollectionID("mfDetector/LET");
0085
0086
0087
0088 G4HCofThisEvent* HCE = event->GetHCofThisEvent();
0089 if (!HCE) return;
0090
0091 G4THitsMap<G4double>* evtMap = static_cast<G4THitsMap<G4double>*>(HCE->GetHC(CollectionID));
0092
0093 G4THitsMap<G4double>* evtLET = static_cast<G4THitsMap<G4double>*>(HCE->GetHC(CollectionIDLET));
0094
0095 G4int nOfMap = evtLET->entries();
0096
0097 G4int nOftotal = fTotalLET->entries();
0098
0099 for (G4int i = 0; i < nOfMap; i++) {
0100 G4double* LET = (*evtLET)[i];
0101 if (!LET) continue;
0102 fTotalLET->add(nOftotal + i, *LET);
0103 }
0104
0105 std::map<G4int, G4double*>::iterator itr;
0106
0107 for (itr = evtMap->GetMap()->begin(); itr != evtMap->GetMap()->end(); itr++) {
0108 G4double edep = *(itr->second);
0109 fSumEne += edep;
0110 }
0111
0112 G4Run::RecordEvent(event);
0113 }
0114
0115
0116
0117 void Run::Merge(const G4Run* aRun)
0118 {
0119 if (aRun == this) {
0120 return;
0121 }
0122
0123 const Run* localRun = static_cast<const Run*>(aRun);
0124 fSumEne += localRun->fSumEne;
0125
0126 G4int nOfMaster = fTotalLET->entries();
0127 G4int nOfLocal = localRun->fTotalLET->entries();
0128 for (G4int i = 0; i < nOfLocal; i++) {
0129 G4double* LET = (*localRun->fTotalLET)[i];
0130 if (!LET) continue;
0131 fTotalLET->add(nOfMaster + i, *LET);
0132 }
0133
0134 ScoreSpecies* masterSpeciesScorer = dynamic_cast<ScoreSpecies*>(this->fScorerRun);
0135
0136 ScoreSpecies* localSpeciesScorer = dynamic_cast<ScoreSpecies*>(localRun->fScorerRun);
0137
0138 masterSpeciesScorer->AbsorbResultsFromWorkerScorer(localSpeciesScorer);
0139
0140 ScoreStrandBreaks* masterSBScorer = dynamic_cast<ScoreStrandBreaks*>(this->fStrandBreakRun);
0141
0142 ScoreStrandBreaks* localSBScorer = dynamic_cast<ScoreStrandBreaks*>(localRun->fStrandBreakRun);
0143
0144 masterSBScorer->AbsorbResultsFromWorkerScorer(localSBScorer);
0145
0146 G4Run::Merge(aRun);
0147 }
0148
0149