source: trunk/source/processes/hadronic/models/im_r_matrix/src/G4XAnnihilationChannel.cc@ 1036

Last change on this file since 1036 was 819, checked in by garnier, 17 years ago

import all except CVS

File size: 7.2 KB
Line 
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#include "globals.hh"
27#include "G4ios.hh"
28#include "G4XAnnihilationChannel.hh"
29#include "G4KineticTrack.hh"
30#include "G4ParticleDefinition.hh"
31#include "G4ResonanceWidth.hh"
32#include "G4ResonancePartialWidth.hh"
33#include "G4PhysicsVector.hh"
34#include "G4PartialWidthTable.hh"
35
36G4XAnnihilationChannel::G4XAnnihilationChannel(): resonance(0)
37{ }
38
39G4XAnnihilationChannel::G4XAnnihilationChannel(const G4ParticleDefinition* resDefinition,
40 const G4ResonanceWidth& resWidths,
41 const G4ResonancePartialWidth& resPartWidths,
42 const G4String& partWidthLabel)
43 : resonance(resDefinition)
44{
45 // Get the tabulated mass-dependent widths for the resonance
46 G4String resName = resonance->GetParticleName();
47 // cout << "HPW "<<resName<<endl;
48 G4String shortName = theNames.ShortName(resName);
49 // cout << "HPW "<<shortName<<endl;
50 // cout << "HPW "<<partWidthLabel<<endl;
51
52 widthTable = resWidths.MassDependentWidth(shortName);
53 partWidthTable = resPartWidths.MassDependentWidth(partWidthLabel);
54
55 // As a first approximation the model is assumed to be valid over
56 // the entire energy range
57 lowLimit = 0.;
58 highLimit = DBL_MAX;
59}
60
61
62G4XAnnihilationChannel::~G4XAnnihilationChannel()
63{
64 delete widthTable;
65 widthTable = 0;
66 delete partWidthTable;
67 partWidthTable = 0;
68 }
69
70
71G4bool G4XAnnihilationChannel::operator==(const G4XAnnihilationChannel &right) const
72{
73 return (this == (G4XAnnihilationChannel *) &right);
74}
75
76
77G4bool G4XAnnihilationChannel::operator!=(const G4XAnnihilationChannel &right) const
78{
79 return (this != (G4XAnnihilationChannel *) &right);
80}
81
82
83G4double G4XAnnihilationChannel::CrossSection(const G4KineticTrack& trk1,
84 const G4KineticTrack& trk2) const
85{
86 G4double sigma = 0.;
87 G4double eCM = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
88
89 G4ParticleDefinition* def1 = trk1.GetDefinition();
90 G4ParticleDefinition* def2 = trk2.GetDefinition();
91
92 G4int J1 = def1->GetPDGiSpin();
93 G4int J2 = def2->GetPDGiSpin();
94 G4double m1 = def1->GetPDGMass();
95 G4double m2 = def2->GetPDGMass();
96
97 G4int JRes = resonance->GetPDGiSpin();
98 G4double mRes = resonance->GetPDGMass();
99
100 G4double branch = Branch(trk1,trk2);
101 G4double width = VariableWidth(trk1,trk2);
102 G4double cleb = NormalizedClebsch(trk1,trk2);
103
104 G4double s = eCM * eCM;
105 if (s == 0.) throw G4HadronicException(__FILE__, __LINE__, "G4XAnnihilationChannel::CrossSection - eCM = 0");
106
107 G4double pCM = std::sqrt((s-(m1+m2)*(m1+m2))*(s-(m1-m2)*(m1-m2))/(4.*s));
108
109 sigma = ( (JRes + 1.) / ( (J1 + 1) * (J2 + 1) )
110 * pi / (pCM * pCM) * branch * width * width /
111 ( (eCM - mRes) * (eCM - mRes) + width * width / 4.0) * cleb * hbarc_squared);
112
113// G4cout << "SS " << branch<<" "<<sigma<<" "
114// << J1 <<" "
115// <<J2<<" "
116// <<m1<<" "
117// <<m2<<" "
118// <<JRes<<" "
119// <<mRes<<" "
120// <<wRes<<" "
121// <<width<<" "
122// <<cleb<<" "
123// <<G4endl;
124 return sigma;
125}
126
127
128G4String G4XAnnihilationChannel::Name() const
129{
130 G4String name("XAnnihilationChannelCrossSection");
131 return name;
132}
133
134
135
136G4bool G4XAnnihilationChannel::IsValid(G4double e) const
137{
138 G4bool answer = InLimits(e,lowLimit,highLimit);
139
140 return answer;
141}
142
143
144G4double G4XAnnihilationChannel::Branch(const G4KineticTrack& trk1,
145 const G4KineticTrack& trk2) const
146{
147 G4double w=VariableWidth(trk1,trk2);
148 if(w==0) return 0;
149 return VariablePartialWidth(trk1,trk2) / VariableWidth(trk1,trk2);
150}
151
152G4double G4XAnnihilationChannel::VariableWidth(const G4KineticTrack& trk1,
153 const G4KineticTrack& trk2) const
154{
155 // actual production width of resonance, depending on available energy.
156
157 G4double width = resonance->GetPDGWidth();
158 G4bool dummy = false;
159 G4double sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
160 if (widthTable != 0)
161 {
162 width = widthTable->GetValue(sqrtS,dummy);
163 }
164 return width;
165}
166
167
168G4double G4XAnnihilationChannel::VariablePartialWidth(const G4KineticTrack& trk1,
169 const G4KineticTrack& trk2) const
170{
171 // Calculate mass dependent partial width of resonance,
172 // based on UrQMD tabulations
173
174 G4double width(0);
175
176 if (partWidthTable != 0)
177 {
178 G4double sqrtS = 0;
179 G4bool dummy = false;
180 sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
181 width = partWidthTable->GetValue(sqrtS,dummy);
182 }
183 else
184 {
185 width = resonance->GetPDGWidth();
186 }
187 return width;
188}
189
190
191G4double G4XAnnihilationChannel::NormalizedClebsch(const G4KineticTrack& trk1,
192 const G4KineticTrack& trk2) const
193{
194 G4double cleb = 0.;
195 G4ParticleDefinition* def1 = trk1.GetDefinition();
196 G4ParticleDefinition* def2 = trk2.GetDefinition();
197
198 G4int iso31 = def1->GetPDGiIsospin3();
199 G4int iso32 = def2->GetPDGiIsospin3();
200 G4int iso3 = iso31 + iso32;
201 G4int iso1 = def1->GetPDGiIsospin();
202 G4int iso2 = def2->GetPDGiIsospin();
203
204 G4int isoRes = resonance->GetPDGiIsospin();
205
206 if (isoRes < iso3) return 0.;
207 if ((iso1*iso2) == 0) return 1.;
208
209 cleb = clebsch.NormalizedClebschGordan(isoRes,iso3,iso1,iso2,iso31,iso32);
210
211 // Special case: particle-antiparticle, charge-conjugated states have the same weight
212 G4String type1 = def1->GetParticleType();
213 G4String type2 = def2->GetParticleType();
214 G4int anti = def1->GetPDGEncoding() * def2->GetPDGEncoding();
215 G4int strangeness = resonance->GetQuarkContent(3) + resonance->GetAntiQuarkContent(3);
216 if ( ((type1 == "baryon" && type2 == "baryon") ||(type1 == "meson" && type2 == "meson")) &&
217 anti < 0 && strangeness == 0)
218 {
219 if (def1->GetPDGEncoding() != -(def2->GetPDGEncoding())) cleb = 0.5 * cleb;
220 }
221
222 return cleb;
223}
224
225
226
227
228
Note: See TracBrowser for help on using the repository browser.