Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
extended/radioactivedecay/rdecay01/src/TrackingAction.cc
이 파일의 문서화 페이지로 가기
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
28 //
29 // $Id: TrackingAction.cc 105733 2017-08-16 12:56:18Z gcosmo $
30 //
31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33 
34 #include "TrackingAction.hh"
35 
36 #include "HistoManager.hh"
37 #include "Run.hh"
38 #include "EventAction.hh"
39 #include "TrackingMessenger.hh"
40 
41 #include "G4Track.hh"
42 #include "G4ParticleTypes.hh"
43 #include "G4IonTable.hh"
44 #include "G4RunManager.hh"
45 
46 #include "G4SystemOfUnits.hh"
47 #include "G4UnitsTable.hh"
48 
49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
50 
53  fEvent(EA),fTrackMessenger(0),
54  fFullChain(true)
55 
56 {
58 
60 }
61 
62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
63 
65 {
66  delete fTrackMessenger;
67 }
68 
69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
70 
72 {
73  fTimeWindow1 = t1;
75 }
76 
77 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
78 
80 {
81  Run* run
83 
84  G4ParticleDefinition* particle = track->GetDefinition();
85  G4String name = particle->GetParticleName();
86  fCharge = particle->GetPDGCharge();
87  fMass = particle->GetPDGMass();
88 
89  G4double Ekin = track->GetKineticEnergy();
90  G4int ID = track->GetTrackID();
91 
92  G4bool condition = false;
93 
94  // check LifeTime
95  //
96  G4double meanLife = particle->GetPDGLifeTime();
97 
98  //count particles
99  //
100  run->ParticleCount(name, Ekin, meanLife);
101 
102  //energy spectrum
103  //
104  G4int ih = 0;
105  if (particle == G4Electron::Electron()||
106  particle == G4Positron::Positron()) ih = 1;
107  else if (particle == G4NeutrinoE::NeutrinoE()||
108  particle == G4AntiNeutrinoE::AntiNeutrinoE()) ih = 2;
109  else if (particle == G4Gamma::Gamma()) ih = 3;
110  else if (particle == G4Alpha::Alpha()) ih = 4;
111  else if (fCharge > 2.) ih = 5;
112  if (ih) G4AnalysisManager::Instance()->FillH1(ih, Ekin);
113 
114  //Ion
115  //
116  if (fCharge > 2.) {
117  //build decay chain
118  if (ID == 1) fEvent->AddDecayChain(name);
119  else fEvent->AddDecayChain(" ---> " + name);
120  //
121  //full chain: put at rest; if not: kill secondary
122  G4Track* tr = (G4Track*) track;
124  else if (ID>1) tr->SetTrackStatus(fStopAndKill);
125  //
126  fTime_birth = track->GetGlobalTime();
127  }
128 
129  //example of saving random number seed of this fEvent, under condition
130  //
133 }
134 
135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
136 
138 {
139  //keep only ions
140  //
141  if (fCharge < 3. ) return;
142 
143  Run* run
145 
146  G4AnalysisManager* analysis = G4AnalysisManager::Instance();
147 
148  //get time
149  //
150  G4double time = track->GetGlobalTime();
151  G4int ID = track->GetTrackID();
152  if (ID == 1) run->PrimaryTiming(time); //time of life of primary ion
153  fTime_end = time;
154 
155  //energy and momentum balance (from secondaries)
156  //
157  const std::vector<const G4Track*>* secondaries
158  = track->GetStep()->GetSecondaryInCurrentStep();
159  size_t nbtrk = (*secondaries).size();
160  if (nbtrk) {
161  //there are secondaries --> it is a decay
162  //
163  //balance
164  G4double EkinTot = 0., EkinVis = 0.;
165  G4ThreeVector Pbalance = - track->GetMomentum();
166  for (size_t itr=0; itr<nbtrk; itr++) {
167  const G4Track* trk = (*secondaries)[itr];
168  G4ParticleDefinition* particle = trk->GetDefinition();
169  G4double Ekin = trk->GetKineticEnergy();
170  EkinTot += Ekin;
171  G4bool visible = !((particle == G4NeutrinoE::NeutrinoE())||
172  (particle == G4AntiNeutrinoE::AntiNeutrinoE()));
173  if (visible) EkinVis += Ekin;
174  //exclude gamma desexcitation from momentum balance
175  if (particle != G4Gamma::Gamma()) Pbalance += trk->GetMomentum();
176  }
177  G4double Pbal = Pbalance.mag();
178  run->Balance(EkinTot,Pbal);
179  analysis->FillH1(6,EkinTot);
180  analysis->FillH1(7,Pbal);
181  fEvent->AddEvisible(EkinVis);
182  }
183 
184  //no secondaries --> end of chain
185  //
186  if (!nbtrk) {
187  run->EventTiming(time); //total time of life
188  analysis->FillH1(8,time);
189  fTime_end = DBL_MAX;
190  }
191 
192  //count activity in time window
193  //
195 
196  G4String name = track->GetDefinition()->GetParticleName();
197  G4bool life1(false), life2(false), decay(false);
198  if ((fTime_birth <= fTimeWindow1)&&(fTime_end > fTimeWindow1)) life1 = true;
199  if ((fTime_birth <= fTimeWindow2)&&(fTime_end > fTimeWindow2)) life2 = true;
200  if ((fTime_end > fTimeWindow1)&&(fTime_end < fTimeWindow2)) decay = true;
201  if (life1||life2||decay) run->CountInTimeWindow(name,life1,life2,decay);
202 }
203 
204 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
205 
static G4RunManager * GetRunManager()
Definition: G4RunManager.cc:80
G4double GetKineticEnergy() const
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
const XML_Char * name
Definition: expat.h:151
TTree * t1
Definition: plottest35.C:26
G4double GetPDGLifeTime() const
void Balance(G4double)
const std::vector< const G4Track * > * GetSecondaryInCurrentStep() const
Definition: G4Step.cc:193
const G4String & GetParticleName() const
G4int GetTrackID() const
G4double GetPDGCharge() const
G4double condition(const G4ErrorSymMatrix &m)
G4ParticleDefinition * GetDefinition() const
void ParticleCount(G4String, G4double)
G4double GetPDGMass() const
void PostUserTrackingAction(const G4Track *)
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
G4ThreeVector GetMomentum() const
double G4double
Definition: G4Types.hh:76
bool G4bool
Definition: G4Types.hh:79
static G4AntiNeutrinoE * AntiNeutrinoE()
G4double GetGlobalTime() const
static G4Alpha * Alpha()
Definition: G4Alpha.cc:89
static G4Positron * Positron()
Definition: G4Positron.cc:94
G4CsvAnalysisManager G4AnalysisManager
Definition: g4csv_defs.hh:77
const G4Step * GetStep() const
void CountInTimeWindow(G4String, G4bool, G4bool, G4bool)
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4Run * GetNonConstCurrentRun() const
void SetTimeWindow(G4double, G4double)
double mag() const
int G4int
Definition: G4Types.hh:78
static G4NeutrinoE * NeutrinoE()
Definition: G4NeutrinoE.cc:85
virtual void rndmSaveThisEvent()
void SetTrackStatus(const G4TrackStatus aTrackStatus)
#define DBL_MAX
Definition: templates.hh:83
Definition of the TrackingMessenger class.
void PreUserTrackingAction(const G4Track *)