ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4CrossSectionPatch.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4CrossSectionPatch.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 //
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"
43 #include "G4CrossSectionPatch.hh"
44 #include "G4VCrossSectionSource.hh"
45 #include "G4KineticTrack.hh"
46 #include "G4CrossSectionVector.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 
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;
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