File indexing completed on 2025-02-23 09:21:56
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 #include "TrackerSD.hh"
0040
0041 #include "G4AnalysisManager.hh"
0042 #include "G4SDManager.hh"
0043 #include "G4SystemOfUnits.hh"
0044 #include "Randomize.hh"
0045
0046
0047
0048 TrackerSD::TrackerSD(const G4String& name, const G4String& hitsCollectionName)
0049 : G4VSensitiveDetector(name), fHitsCollection(NULL)
0050 {
0051 collectionName.insert(hitsCollectionName);
0052 }
0053
0054
0055
0056 TrackerSD::~TrackerSD() {}
0057
0058
0059
0060 void TrackerSD::Initialize(G4HCofThisEvent* hce)
0061 {
0062
0063 fHitsCollection = new TrackerHitsCollection(SensitiveDetectorName, collectionName[0]);
0064
0065
0066 G4int hcID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
0067
0068 hce->AddHitsCollection(hcID, fHitsCollection);
0069 }
0070
0071
0072
0073 G4bool TrackerSD::ProcessHits(G4Step* aStep, G4TouchableHistory*)
0074 {
0075
0076 G4double edep = aStep->GetTotalEnergyDeposit();
0077
0078 if (edep == 0.) return false;
0079
0080 TrackerHit* newHit = new TrackerHit();
0081
0082 newHit->SetTrackID(aStep->GetTrack()->GetTrackID());
0083 newHit->SetEdep(edep);
0084 newHit->SetPos(aStep->GetPostStepPoint()->GetPosition());
0085
0086 if (aStep->GetTrack()->GetTrackID() == 1 && aStep->GetTrack()->GetParentID() == 0)
0087 newHit->SetIncidentEnergy(aStep->GetTrack()->GetVertexKineticEnergy());
0088
0089 fHitsCollection->insert(newHit);
0090
0091
0092
0093
0094 return true;
0095 }
0096
0097
0098 void TrackerSD::EndOfEvent(G4HCofThisEvent*)
0099 {
0100 G4int nofHits = fHitsCollection->entries();
0101
0102 G4double Einc = 0;
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119 G4double minRadius = 0.1 * nm;
0120
0121 G4double maxRadius = 10000 * nm;
0122 G4int nRadiusSteps = 101;
0123
0124
0125
0126 auto analysisManager = G4AnalysisManager::Instance();
0127
0128 G4double radius(minRadius);
0129 G4double stpRadius(std::pow(maxRadius / radius, 1. / static_cast<G4double>(nRadiusSteps - 1)));
0130 G4int step(nRadiusSteps);
0131 G4int noRadius(0);
0132
0133
0134
0135 while (step > 0) {
0136 step--;
0137 noRadius = nRadiusSteps - step;
0138
0139
0140
0141
0142
0143 G4double tNum = 0.;
0144 G4double tDenom = 0.;
0145 G4int nbEdep = 0;
0146
0147
0148
0149 for (G4int k = 0; k < nofHits; k++) {
0150 G4ThreeVector hitPos = (*fHitsCollection)[k]->GetPos();
0151 G4double hitNrj = (*fHitsCollection)[k]->GetEdep();
0152
0153
0154
0155
0156
0157
0158
0159 G4double localSum = 0.;
0160
0161 for (G4int i = 0; i < nofHits; i++) {
0162 if ((*fHitsCollection)[i]->GetIncidentEnergy() > 0)
0163 Einc = (*fHitsCollection)[i]->GetIncidentEnergy();
0164
0165 G4ThreeVector localPosi = (*fHitsCollection)[i]->GetPos();
0166
0167 if (((localPosi.x() - hitPos.x()) * (localPosi.x() - hitPos.x())
0168 + (localPosi.y() - hitPos.y()) * (localPosi.y() - hitPos.y())
0169 + (localPosi.z() - hitPos.z()) * (localPosi.z() - hitPos.z())
0170 < radius * stpRadius * radius * stpRadius)
0171 && ((localPosi.x() - hitPos.x()) * (localPosi.x() - hitPos.x())
0172 + (localPosi.y() - hitPos.y()) * (localPosi.y() - hitPos.y())
0173 + (localPosi.z() - hitPos.z()) * (localPosi.z() - hitPos.z())
0174 >= radius * radius))
0175
0176 {
0177 localSum = localSum + (*fHitsCollection)[i]->GetEdep();
0178 nbEdep = nbEdep + 1;
0179 }
0180 }
0181
0182 tNum = tNum + localSum * hitNrj;
0183 tDenom = tDenom + hitNrj;
0184
0185 }
0186
0187
0188
0189
0190 analysisManager->FillNtupleDColumn(0, 0, radius / nm);
0191 analysisManager->FillNtupleIColumn(0, 1, noRadius);
0192 analysisManager->FillNtupleDColumn(0, 2, nofHits);
0193 analysisManager->FillNtupleDColumn(0, 3, nbEdep);
0194 analysisManager->FillNtupleDColumn(0, 4, (tNum / tDenom) / eV);
0195 analysisManager->FillNtupleDColumn(0, 5, (stpRadius * radius) / nm);
0196 analysisManager->FillNtupleDColumn(0, 6, Einc / eV);
0197 analysisManager->AddNtupleRow();
0198
0199
0200
0201
0202 radius *= stpRadius;
0203
0204 }
0205 }
0206
0207