ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4EmBiasingManager.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4EmBiasingManager.hh
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 //
26 //
27 // -------------------------------------------------------------------
28 //
29 // GEANT4 Class header file
30 //
31 //
32 // File name: G4EmBiasingManager
33 //
34 // Author: Vladimir Ivanchenko
35 //
36 // Creation date: 28.07.2011
37 //
38 // Modifications:
39 //
40 // Class Description:
41 //
42 // It is a class providing step limit for forced process biasing
43 
44 // -------------------------------------------------------------------
45 //
46 
47 #ifndef G4EmBiasingManager_h
48 #define G4EmBiasingManager_h 1
49 
50 #include "globals.hh"
51 #include "G4ParticleDefinition.hh"
52 #include "G4DynamicParticle.hh"
53 #include "Randomize.hh"
54 #include <vector>
55 
56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
57 
58 class G4Region;
59 class G4Track;
61 class G4VEmModel;
65 
67 {
68 public:
69 
71 
73 
75  const G4String& procName, G4int verbose);
76 
77  // default parameters are possible
79  const G4String& r = "");
80 
81  // no default parameters
82  void ActivateSecondaryBiasing(const G4String& region, G4double factor,
83  G4double energyLimit);
84 
85  // return forced step limit
86  G4double GetStepLimit(G4int coupleIdx, G4double previousStep);
87 
88  // return weight of splitting or Russian roulette
89  // G4DynamicParticle may be deleted
90  // two functions are required because of the different ParticleChange
91  // ApplySecondaryBiasing() are wrappers
92 
93  // for G4VEmProcess
94  G4double ApplySecondaryBiasing(std::vector<G4DynamicParticle*>&,
95  const G4Track& track,
96  G4VEmModel* currentModel,
97  G4ParticleChangeForGamma* pParticleChange,
98  G4double& eloss,
99  G4int coupleIdx,
100  G4double tcut,
101  G4double safety = 0.0);
102 
103  // for G4VEnergyLossProcess
104  G4double ApplySecondaryBiasing(std::vector<G4DynamicParticle*>&,
105  const G4Track& track,
106  G4VEmModel* currentModel,
107  G4ParticleChangeForLoss* pParticleChange,
108  G4double& eloss,
109  G4int coupleIdx,
110  G4double tcut,
111  G4double safety = 0.0);
112 
113  // for G4VEnergyLossProcess
114  G4double ApplySecondaryBiasing(std::vector<G4Track*>&,
115  G4int coupleIdx);
116 
117  inline G4bool SecondaryBiasingRegion(G4int coupleIdx);
118 
119  inline G4bool ForcedInteractionRegion(G4int coupleIdx);
120 
121  inline void ResetForcedInteraction();
122 
124 
127 
133 
134 private:
135 
136  void ApplyRangeCut(std::vector<G4DynamicParticle*>& vd,
137  const G4Track& track,
138  G4double& eloss,
139  G4double safety);
140 
141  G4double ApplySplitting(std::vector<G4DynamicParticle*>& vd,
142  const G4Track& track,
143  G4VEmModel* currentModel,
144  G4int index,
145  G4double tcut);
146 
147  G4double ApplyDirectionalSplitting(std::vector<G4DynamicParticle*>& vd,
148  const G4Track& track,
149  G4VEmModel* currentModel,
150  G4int index,
151  G4double tcut,
152  G4ParticleChangeForGamma* partChange);
153 
154  G4double ApplyDirectionalSplitting(std::vector<G4DynamicParticle*>& vd,
155  const G4Track& track,
156  G4VEmModel* currentModel,
157  G4int index,
158  G4double tcut);
159 
160  inline G4double ApplyRussianRoulette(std::vector<G4DynamicParticle*>& vd,
161  G4int index);
162 
163  // hide copy constructor and assignment operator
166 
169  std::vector<const G4Region*> forcedRegions;
170  std::vector<G4double> lengthForRegion;
171  std::vector<const G4Region*> secBiasedRegions;
172  std::vector<G4double> secBiasedWeight;
173  std::vector<G4double> secBiasedEnegryLimit;
174  std::vector<G4int> nBremSplitting;
175 
176  std::vector<G4int> idxForcedCouple;
177  std::vector<G4int> idxSecBiasedCouple;
178 
179  std::vector<G4DynamicParticle*> tmpSecondaries;
180 
182 
185 
189 
193  std::vector<G4double> fDirectionalSplittingWeights;
194 };
195 
196 inline G4bool
198 {
199  G4bool res = false;
200  if(nSecBiasedRegions > 0) {
201  if(idxSecBiasedCouple[coupleIdx] >= 0) { res = true; }
202  }
203  return res;
204 }
205 
207 {
208  G4bool res = false;
209  if(nForcedRegions > 0) {
210  if(idxForcedCouple[coupleIdx] >= 0) { res = true; }
211  }
212  return res;
213 }
214 
216 {
217  startTracking = true;
218 }
219 
220 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
221 
222 inline G4double
223 G4EmBiasingManager::ApplyRussianRoulette(std::vector<G4DynamicParticle*>& vd,
224  G4int index)
225 {
226  size_t n = vd.size();
228  for(size_t k=0; k<n; ++k) {
229  if(G4UniformRand()*weight > 1.0) {
230  const G4DynamicParticle* dp = vd[k];
231  delete dp;
232  vd[k] = nullptr;
233  }
234  }
235  return weight;
236 }
237 
238 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
239 
240 #endif