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

Last change on this file since 1201 was 819, checked in by garnier, 16 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.