Geant4  10.02.p03
G4SampleResonance Class Reference

#include <G4SampleResonance.hh>

Collaboration diagram for G4SampleResonance:

Public Types

typedef std::map< const G4ParticleDefinition *, G4double, std::less< const G4ParticleDefinition * > >::const_iterator minMassMapIterator
 
typedef std::map< const G4ParticleDefinition *, G4double, std::less< const G4ParticleDefinition * > > minMassMapType
 

Public Member Functions

G4double GetMinimumMass (const G4ParticleDefinition *p) const
 
G4double SampleMass (const G4double poleMass, const G4double gamma, const G4double minMass, const G4double maxMass) const
 
G4double SampleMass (const G4ParticleDefinition *p, const G4double maxMass) const
 

Private Member Functions

G4double BrWigInt0 (const G4double x, const G4double gamma, const G4double m0) const
 
G4double BrWigInt1 (const G4double x, const G4double gamma, const G4double m0) const
 
G4double BrWigInv (const G4double x, const G4double gamma, const G4double m0) const
 

Static Private Attributes

static G4ThreadLocal minMassMapTypeminMassCache_G4MT_TLS_ = 0
 

Detailed Description

Definition at line 43 of file G4SampleResonance.hh.

Member Typedef Documentation

◆ minMassMapIterator

typedef std::map<const G4ParticleDefinition*, G4double, std::less<const G4ParticleDefinition*> >::const_iterator G4SampleResonance::minMassMapIterator

Definition at line 67 of file G4SampleResonance.hh.

◆ minMassMapType

Definition at line 68 of file G4SampleResonance.hh.

Member Function Documentation

◆ BrWigInt0()

G4double G4SampleResonance::BrWigInt0 ( const G4double  x,
const G4double  gamma,
const G4double  m0 
) const
inlineprivate

Definition at line 56 of file G4SampleResonance.hh.

57  { return 2.0*gamma*std::atan( 2.0 * (x-m0)/ gamma ); }
Here is the caller graph for this function:

◆ BrWigInt1()

G4double G4SampleResonance::BrWigInt1 ( const G4double  x,
const G4double  gamma,
const G4double  m0 
) const
inlineprivate

Definition at line 59 of file G4SampleResonance.hh.

60  { return 0.5*gamma*gamma*G4Log( (x-m0)*(x-m0)+gamma*gamma/4.0 ) + m0*BrWigInt0(x,gamma,m0); }
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double BrWigInt0(const G4double x, const G4double gamma, const G4double m0) const
Here is the call graph for this function:

◆ BrWigInv()

G4double G4SampleResonance::BrWigInv ( const G4double  x,
const G4double  gamma,
const G4double  m0 
) const
inlineprivate

Definition at line 62 of file G4SampleResonance.hh.

63  { return 0.5*gamma*std::tan( 0.5*x/gamma )+m0; }
Here is the caller graph for this function:

◆ GetMinimumMass()

G4double G4SampleResonance::GetMinimumMass ( const G4ParticleDefinition p) const

Definition at line 46 of file G4SampleResonance.cc.

48 
49  G4double minResonanceMass = DBL_MAX;
50 
51  if ( p->IsShortLived() )
52  {
53  minMassMapIterator iter = minMassCache.find(p);
54  if ( iter!=minMassCache.end() )
55  {
56  minResonanceMass = (*iter).second;
57  }
58  else
59  {
60  // G4cout << "--> request for " << p->GetParticleName() << G4endl;
61 
62  const G4DecayTable* theDecays = p->GetDecayTable();
63  const G4int nDecays = theDecays->entries();
64 
65  for (G4int i=0; i<nDecays; i++)
66  {
67  const G4VDecayChannel* aDecay = theDecays->GetDecayChannel(i);
68  const G4int nDaughters = aDecay->GetNumberOfDaughters();
69 
70  G4double minChannelMass = 0;
71 
72  for (G4int j=0; j<nDaughters; j++)
73  {
74  const G4ParticleDefinition* aDaughter = const_cast<G4VDecayChannel*>(aDecay)->GetDaughter(j);
75  G4double minMass = GetMinimumMass(aDaughter);
76  if (!minMass) minMass = DBL_MAX; // exclude gamma channel;
77  minChannelMass+=minMass;
78  }
79  // G4cout << "channel mass for the above is " << minChannelMass/MeV << G4endl;
80  if (minChannelMass < minResonanceMass) minResonanceMass = minChannelMass;
81 
82  }
83  // replace this as soon as the compiler supports mutable!!
84  G4SampleResonance* self = const_cast<G4SampleResonance*>(this);
85  //Andrea Dotti (13Jan2013): Change needed for G4MT
86  //(self->minMassCache)[p] = minResonanceMass;
87  self->minMassCache_G4MT_TLS_->operator[](p) = minResonanceMass;
88 
89  }
90  }
91  else
92  {
93 
94  minResonanceMass = p->GetPDGMass();
95 
96  }
97  // G4cout << "minimal mass for " << p->GetParticleName() << " is " << minResonanceMass/MeV << G4endl;
98 
99  return minResonanceMass;
100 }
static G4ThreadLocal minMassMapType * minMassCache_G4MT_TLS_
int G4int
Definition: G4Types.hh:78
G4int GetNumberOfDaughters() const
G4double GetMinimumMass(const G4ParticleDefinition *p) const
G4DecayTable * GetDecayTable() const
G4int entries() const
std::map< const G4ParticleDefinition *, G4double, std::less< const G4ParticleDefinition * > >::const_iterator minMassMapIterator
G4VDecayChannel * GetDecayChannel(G4int index) const
double G4double
Definition: G4Types.hh:76
std::map< const G4ParticleDefinition *, G4double, std::less< const G4ParticleDefinition * > > minMassMapType
#define DBL_MAX
Definition: templates.hh:83
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SampleMass() [1/2]

G4double G4SampleResonance::SampleMass ( const G4double  poleMass,
const G4double  gamma,
const G4double  minMass,
const G4double  maxMass 
) const

Definition at line 110 of file G4SampleResonance.cc.

115  // Chooses a mass randomly between minMass and maxMass
116  // according to a Breit-Wigner function with constant
117  // width gamma and pole poleMass
118 
119  if ( minMass > maxMass )
120  {
121  throw G4HadronicException(__FILE__, __LINE__,
122  "SampleResonanceMass: mass range negative (minMass>maxMass)");
123  }
124 
125  G4double returnMass;
126 
127  if ( gamma < DBL_EPSILON )
128  {
129  returnMass = std::max(minMass, std::min(maxMass, poleMass));
130  }
131  else
132  {
133  double fmin = BrWigInt0(minMass, gamma, poleMass);
134  double fmax = BrWigInt0(maxMass, gamma, poleMass);
135  double f = fmin + (fmax-fmin)*G4UniformRand();
136  returnMass = BrWigInv(f, gamma, poleMass);
137  }
138 
139  return returnMass;
140 }
static G4ThreadLocal minMassMapType * minMassCache_G4MT_TLS_
G4double BrWigInv(const G4double x, const G4double gamma, const G4double m0) const
#define G4UniformRand()
Definition: Randomize.hh:97
#define DBL_EPSILON
Definition: templates.hh:87
double G4double
Definition: G4Types.hh:76
std::map< const G4ParticleDefinition *, G4double, std::less< const G4ParticleDefinition * > > minMassMapType
G4double BrWigInt0(const G4double x, const G4double gamma, const G4double m0) const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SampleMass() [2/2]

G4double G4SampleResonance::SampleMass ( const G4ParticleDefinition p,
const G4double  maxMass 
) const

Definition at line 104 of file G4SampleResonance.cc.

106  return SampleMass(p->GetPDGMass(), p->GetPDGWidth(), GetMinimumMass(p), maxMass);
107 }
static G4ThreadLocal minMassMapType * minMassCache_G4MT_TLS_
G4double SampleMass(const G4double poleMass, const G4double gamma, const G4double minMass, const G4double maxMass) const
G4double GetMinimumMass(const G4ParticleDefinition *p) const
G4double GetPDGWidth() const
std::map< const G4ParticleDefinition *, G4double, std::less< const G4ParticleDefinition * > > minMassMapType
Here is the call graph for this function:

Member Data Documentation

◆ minMassCache_G4MT_TLS_

G4ThreadLocal G4SampleResonance::minMassMapType * G4SampleResonance::minMassCache_G4MT_TLS_ = 0
staticprivate

Definition at line 72 of file G4SampleResonance.hh.


The documentation for this class was generated from the following files: