Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4CrossSectionPatch.cc
Go to the documentation of this file.
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// GEANT4 Class file
29//
30// For information related to this code contact:
31//
32// File name: G4CrossSectionPatch
33//
34// Author:
35//
36// Creation date: 15 April 1999
37//
38// Modifications:
39//
40// -------------------------------------------------------------------
41
42#include "globals.hh"
45#include "G4KineticTrack.hh"
47
49{ }
50
51
53{ }
54
55
57{
58 return (this == (G4CrossSectionPatch*) &right);
59}
60
61
63{
64 return (this != (G4CrossSectionPatch*) &right);
65}
66
67
69 const G4KineticTrack& trk2) const
70{
71 // The cross section is provided by one of the components, according to their energy
72 // validity range
73
74 G4double crossSection = 0.;
75 G4double ecm = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
76
77 const G4CrossSectionVector* components = GetComponents();
78 if (components != 0)
79 {
80 G4int nComponents = this->GetComponents()->size();
81// G4int nValid = 0;
82
83 G4int i;
84 for (i=0; i<nComponents; i++)
85 {
86 G4CrossSectionSourcePtr componentPtr = (*components)[i];
87 G4VCrossSectionSource* component = componentPtr();
88 if (component->IsValid(ecm))
89 {
90 crossSection = component->CrossSection(trk1,trk2);
91 }
92 else if (i < (nComponents - 1) )
93 {
94 G4CrossSectionSourcePtr nextPtr = (*components)[i+1];
95 G4VCrossSectionSource* next = nextPtr();
96 if (ecm > component->HighLimit() && ecm < next->LowLimit())
97 {
98 // Merge cross-sections in transition region between two validity ranges
99 crossSection = Transition(trk1,trk2,component,next);
100 }
101 }
102 }
103 }
104
105 return crossSection;
106}
107
108
110{
111 // The Patch is valid if any of its components are valid
112 G4bool answer = false;
113 const G4CrossSectionVector* components = GetComponents();
114 if (components != 0)
115 {
116 G4int n = components->size();
117 G4int i;
118 for (i=0; i<n; i++)
119 {
120 G4CrossSectionSourcePtr componentPtr = (*components)[i];
121 G4VCrossSectionSource* component = componentPtr();
122 if (component->IsValid(e))
123 {
124 answer = true;
125 break;
126 }
127 }
128 }
129 return answer;
130}
131
132
134 const G4VCrossSectionSource* comp1,
135 const G4VCrossSectionSource* comp2) const
136{
137 //Merge two cross sections in the transition region between their validity ranges
138
139 G4double crossSection = 0.;
140
141 G4double ecm = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
142 G4double sigma1 = comp1->CrossSection(trk1,trk2);
143 G4double sigma2 = comp2->CrossSection(trk1,trk2);
144 G4double denom = comp2->LowLimit() - comp1->HighLimit();
145 G4double diff = ecm - comp1->HighLimit();
146 if (denom > 0. && diff > 0.)
147 {
148 G4double ratio = diff / denom;
149 crossSection = (1.- ratio) * sigma1 + ratio * sigma2;
150 }
151
152 return crossSection;
153}
154
155
157 G4double sigma1, G4double sigma2,
158 G4double e1, G4double e2) const
159{
160 //Merge two cross sections in the transition region between their validity ranges
161
162 G4double crossSection = 0.;
163
164 G4double denom = e2 - e1;
165 G4double diff = ecm - e1;
166 if (denom > 0. && diff > 0.)
167 {
168 G4double ratio = diff / denom;
169 crossSection = (1.- ratio) * sigma1 + ratio * sigma2;
170 }
171
172 return crossSection;
173}
174
std::vector< G4CrossSectionSourcePtr > G4CrossSectionVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4bool operator!=(const G4CrossSectionPatch &right) const
G4double Transition(const G4KineticTrack &trk1, const G4KineticTrack &trk2, const G4VCrossSectionSource *comp1, const G4VCrossSectionSource *comp2) const
virtual G4bool IsValid(G4double e) const
virtual G4double CrossSection(const G4KineticTrack &trk1, const G4KineticTrack &trk2) const
G4bool operator==(const G4CrossSectionPatch &right) const
virtual const G4CrossSectionVector * GetComponents() const =0
const G4LorentzVector & Get4Momentum() const
virtual G4double LowLimit() const
virtual G4double CrossSection(const G4KineticTrack &trk1, const G4KineticTrack &trk2) const =0
virtual G4double HighLimit() const
virtual G4bool IsValid(G4double e) const