00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "globals.hh"
00027 #include "G4ios.hh"
00028 #include "G4PhysicalConstants.hh"
00029 #include "G4XAnnihilationChannel.hh"
00030 #include "G4KineticTrack.hh"
00031 #include "G4ParticleDefinition.hh"
00032 #include "G4ResonanceWidth.hh"
00033 #include "G4ResonancePartialWidth.hh"
00034 #include "G4PhysicsVector.hh"
00035 #include "G4PartialWidthTable.hh"
00036
00037 G4XAnnihilationChannel::G4XAnnihilationChannel(): resonance(0)
00038 {
00039
00040
00041 lowLimit = 0.;
00042 highLimit = DBL_MAX;
00043 widthTable = 0;
00044 partWidthTable = 0;
00045 }
00046
00047 G4XAnnihilationChannel::G4XAnnihilationChannel(const G4ParticleDefinition* resDefinition,
00048 const G4ResonanceWidth& resWidths,
00049 const G4ResonancePartialWidth& resPartWidths,
00050 const G4String& partWidthLabel)
00051 : resonance(resDefinition)
00052 {
00053
00054 G4String resName = resonance->GetParticleName();
00055
00056 G4String shortName = theNames.ShortName(resName);
00057
00058
00059
00060 widthTable = resWidths.MassDependentWidth(shortName);
00061 partWidthTable = resPartWidths.MassDependentWidth(partWidthLabel);
00062
00063
00064
00065 lowLimit = 0.;
00066 highLimit = DBL_MAX;
00067 }
00068
00069
00070 G4XAnnihilationChannel::~G4XAnnihilationChannel()
00071 {
00072 if (widthTable) delete widthTable;
00073 widthTable = 0;
00074 if (partWidthTable) delete partWidthTable;
00075 partWidthTable = 0;
00076 }
00077
00078
00079 G4bool G4XAnnihilationChannel::operator==(const G4XAnnihilationChannel &right) const
00080 {
00081 return (this == (G4XAnnihilationChannel *) &right);
00082 }
00083
00084
00085 G4bool G4XAnnihilationChannel::operator!=(const G4XAnnihilationChannel &right) const
00086 {
00087 return (this != (G4XAnnihilationChannel *) &right);
00088 }
00089
00090
00091 G4double G4XAnnihilationChannel::CrossSection(const G4KineticTrack& trk1,
00092 const G4KineticTrack& trk2) const
00093 {
00094 G4double sigma = 0.;
00095 G4double eCM = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
00096
00097 G4ParticleDefinition* def1 = trk1.GetDefinition();
00098 G4ParticleDefinition* def2 = trk2.GetDefinition();
00099
00100 G4int J1 = def1->GetPDGiSpin();
00101 G4int J2 = def2->GetPDGiSpin();
00102 G4double m_1 = def1->GetPDGMass();
00103 G4double m_2 = def2->GetPDGMass();
00104
00105 G4int JRes = resonance->GetPDGiSpin();
00106 G4double mRes = resonance->GetPDGMass();
00107
00108 G4double branch = Branch(trk1,trk2);
00109 G4double width = VariableWidth(trk1,trk2);
00110 G4double cleb = NormalizedClebsch(trk1,trk2);
00111
00112 G4double S = eCM * eCM;
00113 if (S == 0.) throw G4HadronicException(__FILE__, __LINE__, "G4XAnnihilationChannel::CrossSection - eCM = 0");
00114
00115 G4double pCM = std::sqrt((S-(m_1+m_2)*(m_1+m_2))*(S-(m_1-m_2)*(m_1-m_2))/(4.*S));
00116
00117 sigma = ( (JRes + 1.) / ( (J1 + 1) * (J2 + 1) )
00118 * pi / (pCM * pCM) * branch * width * width /
00119 ( (eCM - mRes) * (eCM - mRes) + width * width / 4.0) * cleb * hbarc_squared);
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 return sigma;
00133 }
00134
00135
00136 G4String G4XAnnihilationChannel::Name() const
00137 {
00138 G4String name("XAnnihilationChannelCrossSection");
00139 return name;
00140 }
00141
00142
00143
00144 G4bool G4XAnnihilationChannel::IsValid(G4double e) const
00145 {
00146 G4bool answer = InLimits(e,lowLimit,highLimit);
00147
00148 return answer;
00149 }
00150
00151
00152 G4double G4XAnnihilationChannel::Branch(const G4KineticTrack& trk1,
00153 const G4KineticTrack& trk2) const
00154 {
00155 G4double w=VariableWidth(trk1,trk2);
00156 if(w==0) return 0;
00157 return VariablePartialWidth(trk1,trk2) / VariableWidth(trk1,trk2);
00158 }
00159
00160 G4double G4XAnnihilationChannel::VariableWidth(const G4KineticTrack& trk1,
00161 const G4KineticTrack& trk2) const
00162 {
00163
00164
00165 G4double width = resonance->GetPDGWidth();
00166 G4bool dummy = false;
00167 G4double sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
00168 if (widthTable != 0)
00169 {
00170 width = widthTable->GetValue(sqrtS,dummy);
00171 }
00172 return width;
00173 }
00174
00175
00176 G4double G4XAnnihilationChannel::VariablePartialWidth(const G4KineticTrack& trk1,
00177 const G4KineticTrack& trk2) const
00178 {
00179
00180
00181
00182 G4double width(0);
00183
00184 if (partWidthTable != 0)
00185 {
00186 G4double sqrtS = 0;
00187 G4bool dummy = false;
00188 sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
00189 width = partWidthTable->GetValue(sqrtS,dummy);
00190 }
00191 else
00192 {
00193 width = resonance->GetPDGWidth();
00194 }
00195 return width;
00196 }
00197
00198
00199 G4double G4XAnnihilationChannel::NormalizedClebsch(const G4KineticTrack& trk1,
00200 const G4KineticTrack& trk2) const
00201 {
00202 G4double cleb = 0.;
00203 G4ParticleDefinition* def1 = trk1.GetDefinition();
00204 G4ParticleDefinition* def2 = trk2.GetDefinition();
00205
00206 G4int iso31 = def1->GetPDGiIsospin3();
00207 G4int iso32 = def2->GetPDGiIsospin3();
00208 G4int iso3 = iso31 + iso32;
00209 G4int iso1 = def1->GetPDGiIsospin();
00210 G4int iso2 = def2->GetPDGiIsospin();
00211
00212 G4int isoRes = resonance->GetPDGiIsospin();
00213
00214 if (isoRes < iso3) return 0.;
00215 if ((iso1*iso2) == 0) return 1.;
00216
00217 cleb = clebsch.NormalizedClebschGordan(isoRes,iso3,iso1,iso2,iso31,iso32);
00218
00219
00220 G4String type1 = def1->GetParticleType();
00221 G4String type2 = def2->GetParticleType();
00222 G4int anti = def1->GetPDGEncoding() * def2->GetPDGEncoding();
00223 G4int strangeness = resonance->GetQuarkContent(3) + resonance->GetAntiQuarkContent(3);
00224 if ( ((type1 == "baryon" && type2 == "baryon") ||(type1 == "meson" && type2 == "meson")) &&
00225 anti < 0 && strangeness == 0)
00226 {
00227 if (def1->GetPDGEncoding() != -(def2->GetPDGEncoding())) cleb = 0.5 * cleb;
00228 }
00229
00230 return cleb;
00231 }
00232
00233
00234
00235
00236