Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes
G4VRangeToEnergyConverter Class Referenceabstract

#include <G4VRangeToEnergyConverter.hh>

Inheritance diagram for G4VRangeToEnergyConverter:
G4RToEConvForElectron G4RToEConvForGamma G4RToEConvForPositron G4RToEConvForProton

Public Member Functions

 G4VRangeToEnergyConverter ()
 
 G4VRangeToEnergyConverter (const G4VRangeToEnergyConverter &right)
 
G4VRangeToEnergyConverteroperator= (const G4VRangeToEnergyConverter &right)
 
virtual ~G4VRangeToEnergyConverter ()
 
G4int operator== (const G4VRangeToEnergyConverter &right) const
 
G4int operator!= (const G4VRangeToEnergyConverter &right) const
 
virtual G4double Convert (G4double rangeCut, const G4Material *material)
 
const G4ParticleDefinitionGetParticleType () const
 
const G4PhysicsTableGetLossTable () const
 
virtual void Reset ()
 
void SetVerboseLevel (G4int value)
 
G4int GetVerboseLevel () const
 

Static Public Member Functions

static void SetEnergyRange (G4double lowedge, G4double highedge)
 
static G4double GetLowEdgeEnergy ()
 
static G4double GetHighEdgeEnergy ()
 
static G4double GetMaxEnergyCut ()
 
static void SetMaxEnergyCut (G4double value)
 

Protected Types

typedef G4PhysicsTable G4LossTable
 
typedef G4PhysicsLogVector G4LossVector
 
typedef G4PhysicsLogVector G4RangeVector
 

Protected Member Functions

virtual void BuildLossTable ()
 
virtual G4double ComputeLoss (G4double AtomicNumber, G4double KineticEnergy)=0
 
virtual void BuildRangeVector (const G4Material *aMaterial, G4RangeVector *rangeVector)
 
G4double ConvertCutToKineticEnergy (G4RangeVector *theRangeVector, G4double theCutInLength, size_t materialIndex) const
 

Protected Attributes

G4double fMaxEnergyCut
 
const G4ParticleDefinitiontheParticle
 
G4LossTabletheLossTable
 
G4int NumberOfElements
 
const G4int TotBin
 
std::vector< G4RangeVector * > fRangeVectorStore
 

Static Protected Attributes

static G4double LowestEnergy = 0.99e-3*MeV
 
static G4double HighestEnergy = 100.0e6*MeV
 
static G4double MaxEnergyCut = 10.0*GeV
 

Detailed Description

Definition at line 58 of file G4VRangeToEnergyConverter.hh.

Member Typedef Documentation

Definition at line 115 of file G4VRangeToEnergyConverter.hh.

Definition at line 119 of file G4VRangeToEnergyConverter.hh.

Definition at line 131 of file G4VRangeToEnergyConverter.hh.

Constructor & Destructor Documentation

G4VRangeToEnergyConverter::G4VRangeToEnergyConverter ( )

Definition at line 48 of file G4VRangeToEnergyConverter.cc.

References fMaxEnergyCut.

G4VRangeToEnergyConverter::G4VRangeToEnergyConverter ( const G4VRangeToEnergyConverter right)
G4VRangeToEnergyConverter::~G4VRangeToEnergyConverter ( )
virtual

Definition at line 120 of file G4VRangeToEnergyConverter.cc.

References fRangeVectorStore, NumberOfElements, and theLossTable.

121 {
122  // Reset();
123  // Comment out Reset() for MT application
124 
125  // delete loss table without deleteing vectors
126  if (theLossTable) {
127  delete theLossTable;
128  }
129  theLossTable=0;
131 
132  //clear RangeVectorStore without deleteing vectors
133  fRangeVectorStore.clear();
134 
135 }
std::vector< G4RangeVector * > fRangeVectorStore

Member Function Documentation

void G4VRangeToEnergyConverter::BuildLossTable ( )
protectedvirtual

Definition at line 296 of file G4VRangeToEnergyConverter.cc.

References ComputeLoss(), G4PhysicsVector::Energy(), G4cout, G4endl, G4Element::GetElementTable(), G4Element::GetNumberOfElements(), GetVerboseLevel(), G4PhysicsTable::insert(), LowestEnergy, MaxEnergyCut, NumberOfElements, G4PhysicsVector::PutValue(), Reset(), theLossTable, and TotBin.

Referenced by Convert().

297 {
298  if (size_t(NumberOfElements) == G4Element::GetNumberOfElements()) return;
299 
300  // clear Loss table and Range vectors
301  Reset();
302 
303  // Build dE/dx tables for elements
305  theLossTable = new G4LossTable();
307 #ifdef G4VERBOSE
308  if (GetVerboseLevel()>3) {
309  G4cout << "G4VRangeToEnergyConverter::BuildLossTable() ";
310  G4cout << "Create theLossTable[" << theLossTable << "]";
311  G4cout << " NumberOfElements=" << NumberOfElements <<G4endl;
312  }
313 #endif
314 
315 
316  // fill the loss table
317  for (size_t j=0; j<size_t(NumberOfElements); j++){
318  G4double Value;
319  G4LossVector* aVector= 0;
321  for (size_t i=0; i<=size_t(TotBin); i++) {
322  Value = ComputeLoss( (*G4Element::GetElementTable())[j]->GetZ(),
323  aVector->Energy(i)
324  );
325  aVector->PutValue(i,Value);
326  }
327  theLossTable->insert(aVector);
328  }
329 }
void insert(G4PhysicsVector *)
virtual G4double ComputeLoss(G4double AtomicNumber, G4double KineticEnergy)=0
G4GLOB_DLL std::ostream G4cout
static size_t GetNumberOfElements()
Definition: G4Element.cc:402
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
static G4ElementTable * GetElementTable()
Definition: G4Element.cc:395
void G4VRangeToEnergyConverter::BuildRangeVector ( const G4Material aMaterial,
G4RangeVector rangeVector 
)
protectedvirtual

Reimplemented in G4RToEConvForGamma.

Definition at line 334 of file G4VRangeToEnergyConverter.cc.

References G4Material::GetAtomicNumDensityVector(), G4Material::GetElementVector(), G4PhysicsVector::GetLowEdgeEnergy(), G4Material::GetNumberOfElements(), LowestEnergy, MaxEnergyCut, G4PhysicsVector::PutValue(), G4InuclParticleNames::s0, and TotBin.

Referenced by Convert().

336 {
337  // create range vector for a material
338  const G4ElementVector* elementVector = aMaterial->GetElementVector();
339  const G4double* atomicNumDensityVector = aMaterial->GetAtomicNumDensityVector();
340  G4int NumEl = aMaterial->GetNumberOfElements();
341 
342  // calculate parameters of the low energy part first
343  size_t i;
344  std::vector<G4double> lossV;
345  for ( size_t ib=0; ib<=size_t(TotBin); ib++) {
346  G4double loss=0.;
347  for (i=0; i<size_t(NumEl); i++) {
348  G4int IndEl = (*elementVector)[i]->GetIndex();
349  loss += atomicNumDensityVector[i]*
350  (*((*theLossTable)[IndEl]))[ib];
351  }
352  lossV.push_back(loss);
353  }
354 
355  // Integrate with Simpson formula with logarithmic binning
356  G4double ltt = std::log(MaxEnergyCut/LowestEnergy);
357  G4double dltau = ltt/TotBin;
358 
359  G4double s0 = 0.;
360  G4double Value;
361  for ( i=0; i<=size_t(TotBin); i++) {
362  G4double t = rangeVector->GetLowEdgeEnergy(i);
363  G4double q = t/lossV[i];
364  if (i==0) s0 += 0.5*q;
365  else s0 += q;
366 
367  if (i==0) {
368  Value = (s0 + 0.5*q)*dltau ;
369  } else {
370  Value = (s0 - 0.5*q)*dltau ;
371  }
372  rangeVector->PutValue(i,Value);
373  }
374 }
std::vector< G4Element * > G4ElementVector
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:188
int G4int
Definition: G4Types.hh:78
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:214
size_t GetNumberOfElements() const
Definition: G4Material.hh:184
double G4double
Definition: G4Types.hh:76
virtual G4double G4VRangeToEnergyConverter::ComputeLoss ( G4double  AtomicNumber,
G4double  KineticEnergy 
)
protectedpure virtual
G4double G4VRangeToEnergyConverter::Convert ( G4double  rangeCut,
const G4Material material 
)
virtual

Reimplemented in G4RToEConvForProton.

Definition at line 151 of file G4VRangeToEnergyConverter.cc.

References BuildLossTable(), BuildRangeVector(), python.hepunit::cm3, ConvertCutToKineticEnergy(), density, fMaxEnergyCut, fRangeVectorStore, g(), G4cout, G4endl, G4Material::GetDensity(), G4Material::GetIndex(), G4Material::GetMaterialTable(), G4Material::GetName(), G4ParticleDefinition::GetParticleName(), GetVerboseLevel(), python.hepunit::keV, LowestEnergy, MaxEnergyCut, python.hepunit::mm, Reset(), theParticle, and TotBin.

Referenced by G4ProductionCutsTable::ConvertRangeToEnergy(), and G4ProductionCutsTable::UpdateCoupleTable().

153 {
154 #ifdef G4VERBOSE
155  if (GetVerboseLevel()>3) {
156  G4cout << "G4VRangeToEnergyConverter::Convert() ";
157  G4cout << "Convert for " << material->GetName()
158  << " with Range Cut " << rangeCut/mm << "[mm]" << G4endl;
159  }
160 #endif
161 
162  G4double theKineticEnergyCuts = 0.;
163 
164  if (fMaxEnergyCut != MaxEnergyCut) {
166  // clear loss table and renge vectors
167  Reset();
168  }
169 
170  // Build the energy loss table
171  BuildLossTable();
172 
173  // Build range vector for every material, convert cut into energy-cut,
174  // fill theKineticEnergyCuts and delete the range vector
175  static const G4double tune = 0.025*mm*g/cm3 ,lowen = 30.*keV ;
176 
177  // check density
178  G4double density = material->GetDensity() ;
179  if(density <= 0.) {
180 #ifdef G4VERBOSE
181  if (GetVerboseLevel()>0) {
182  G4cout << "G4VRangeToEnergyConverter::Convert() ";
183  G4cout << material->GetName() << "has zero density "
184  << "( " << density << ")" << G4endl;
185  }
186 #endif
187  return 0.;
188  }
189 
190  // initialize RangeVectorStore
192  G4int ext_size = table->size() - fRangeVectorStore.size();
193  for (int i=0; i<ext_size; i++) fRangeVectorStore.push_back(0);
194 
195  // Build Range Vector
196  G4int idx = material->GetIndex();
197  G4RangeVector* rangeVector = fRangeVectorStore.at(idx);
198  if (rangeVector == 0) {
199  rangeVector = new G4RangeVector(LowestEnergy, MaxEnergyCut, TotBin);
200  BuildRangeVector(material, rangeVector);
201  fRangeVectorStore.at(idx) = rangeVector;
202  }
203 
204  // Convert Range Cut ro Kinetic Energy Cut
205  theKineticEnergyCuts = ConvertCutToKineticEnergy(rangeVector, rangeCut, idx);
206 
207  if( ((theParticle->GetParticleName()=="e-")||(theParticle->GetParticleName()=="e+"))
208  && (theKineticEnergyCuts < lowen) ) {
209  // corr. should be switched on smoothly
210  theKineticEnergyCuts /= (1.+(1.-theKineticEnergyCuts/lowen)*
211  tune/(rangeCut*density));
212  }
213 
214  if(theKineticEnergyCuts < LowestEnergy) {
215  theKineticEnergyCuts = LowestEnergy ;
216  } else if(theKineticEnergyCuts > MaxEnergyCut) {
217  theKineticEnergyCuts = MaxEnergyCut;
218  }
219 
220  return theKineticEnergyCuts;
221 }
size_t GetIndex() const
Definition: G4Material.hh:260
const G4String & GetName() const
Definition: G4Material.hh:176
static G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:564
std::vector< G4Material * > G4MaterialTable
G4double GetDensity() const
Definition: G4Material.hh:178
virtual void BuildRangeVector(const G4Material *aMaterial, G4RangeVector *rangeVector)
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
G4double density
Definition: TRTMaterials.hh:39
function g(Y1, Y2, PT2)
Definition: hijing1.383.f:5205
G4GLOB_DLL std::ostream G4cout
G4double ConvertCutToKineticEnergy(G4RangeVector *theRangeVector, G4double theCutInLength, size_t materialIndex) const
std::vector< G4RangeVector * > fRangeVectorStore
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
const G4ParticleDefinition * theParticle
G4double G4VRangeToEnergyConverter::ConvertCutToKineticEnergy ( G4RangeVector theRangeVector,
G4double  theCutInLength,
size_t  materialIndex 
) const
protected

Definition at line 379 of file G4VRangeToEnergyConverter.cc.

References G4cout, G4endl, G4PhysicsVector::GetLowEdgeEnergy(), G4ParticleDefinition::GetParticleName(), GetVerboseLevel(), LowestEnergy, MaxEnergyCut, python.hepunit::mm, theParticle, TotBin, and G4PhysicsVector::Value().

Referenced by Convert().

388 {
389  const G4double epsilon=0.01;
390 
391  // find max. range and the corresponding energy (rmax,Tmax)
392  G4double rmax= -1.e10*mm;
393 
394  G4double T1 = LowestEnergy;
395  G4double r1 =(*rangeVector)[0] ;
396 
397  G4double T2 = MaxEnergyCut;
398 
399  // check theCutInLength < r1
400  if ( theCutInLength <= r1 ) { return T1; }
401 
402  // scan range vector to find nearest bin
403  // ( suppose that r(Ti) > r(Tj) if Ti >Tj )
404  for (size_t ibin=0; ibin<=size_t(TotBin); ibin++) {
405  G4double T=rangeVector->GetLowEdgeEnergy(ibin);
406  G4double r=(*rangeVector)[ibin];
407  if ( r>rmax ) rmax=r;
408  if (r <theCutInLength ) {
409  T1 = T;
410  r1 = r;
411  } else if (r >theCutInLength ) {
412  T2 = T;
413  break;
414  }
415  }
416 
417  // check cut in length is smaller than range max
418  if ( theCutInLength >= rmax ) {
419 #ifdef G4VERBOSE
420  if (GetVerboseLevel()>2) {
421  G4cout << "G4VRangeToEnergyConverter::ConvertCutToKineticEnergy ";
422  G4cout << " for " << theParticle->GetParticleName() << G4endl;
423  G4cout << "The cut in range [" << theCutInLength/mm << " (mm)] ";
424  G4cout << " is too big " ;
425  G4cout << " for material idx=" << materialIndex <<G4endl;
426  }
427 #endif
428  return MaxEnergyCut;
429  }
430 
431  // convert range to energy
432  G4double T3 = std::sqrt(T1*T2);
433  G4double r3 = rangeVector->Value(T3);
434  while ( std::fabs(1.-r3/theCutInLength)>epsilon ) {
435  if ( theCutInLength <= r3 ) {
436  T2 = T3;
437  } else {
438  T1 = T3;
439  }
440  T3 = std::sqrt(T1*T2);
441  r3 = rangeVector->Value(T3);
442  }
443 
444  return T3;
445 }
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
const G4ParticleDefinition * theParticle
G4double G4VRangeToEnergyConverter::GetHighEdgeEnergy ( )
static

Definition at line 252 of file G4VRangeToEnergyConverter.cc.

References HighestEnergy.

Referenced by G4ProductionCutsTable::GetHighEdgeEnergy().

253 {
254  return HighestEnergy;
255 }
const G4PhysicsTable* G4VRangeToEnergyConverter::GetLossTable ( ) const
G4double G4VRangeToEnergyConverter::GetLowEdgeEnergy ( )
static

Definition at line 246 of file G4VRangeToEnergyConverter.cc.

References LowestEnergy.

Referenced by G4ProductionCutsTable::GetLowEdgeEnergy().

247 {
248  return LowestEnergy;
249 }
G4double G4VRangeToEnergyConverter::GetMaxEnergyCut ( )
static

Definition at line 260 of file G4VRangeToEnergyConverter.cc.

References MaxEnergyCut.

Referenced by G4ProductionCutsTable::GetMaxEnergyCut().

261 {
262  return MaxEnergyCut;
263 }
const G4ParticleDefinition * G4VRangeToEnergyConverter::GetParticleType ( ) const
inline

Definition at line 172 of file G4VRangeToEnergyConverter.hh.

References theParticle.

173 {
174  return theParticle;
175 }
const G4ParticleDefinition * theParticle
G4int G4VRangeToEnergyConverter::GetVerboseLevel ( ) const
inline
G4int G4VRangeToEnergyConverter::operator!= ( const G4VRangeToEnergyConverter right) const

Definition at line 142 of file G4VRangeToEnergyConverter.cc.

References right.

143 {
144  return this != &right;
145 }
G4VRangeToEnergyConverter & G4VRangeToEnergyConverter::operator= ( const G4VRangeToEnergyConverter right)

Definition at line 66 of file G4VRangeToEnergyConverter.cc.

References G4PhysicsTable::clearAndDestroy(), fMaxEnergyCut, fRangeVectorStore, G4Element::GetNumberOfElements(), HighestEnergy, G4PhysicsTable::insert(), LowestEnergy, MaxEnergyCut, NumberOfElements, G4PhysicsVector::PutValue(), theLossTable, theParticle, and TotBin.

67 {
68  if (this == &right) return *this;
69  if (theLossTable) {
71  delete theLossTable;
72  theLossTable=0;
73  }
74 
75  LowestEnergy = right.LowestEnergy;
77  MaxEnergyCut = right.MaxEnergyCut;
80  theParticle = right.theParticle;
81  verboseLevel = right.verboseLevel;
82 
83  // create the loss table
84  theLossTable = new G4LossTable();
86  // fill the loss table
87  for (size_t j=0; j<size_t(NumberOfElements); j++){
89  for (size_t i=0; i<=size_t(TotBin); i++) {
90  G4double Value = (*((*right.theLossTable)[j]))[i];
91  aVector->PutValue(i,Value);
92  }
93  theLossTable->insert(aVector);
94  }
95 
96  // clean up range vector store
97  for (size_t idx=0; idx<fRangeVectorStore.size(); idx++){
98  delete fRangeVectorStore.at(idx);
99  }
100  fRangeVectorStore.clear();
101 
102  // copy range vector store
103  for (size_t j=0; j<((right.fRangeVectorStore).size()); j++){
104  G4RangeVector* vector = (right.fRangeVectorStore).at(j);
105  G4RangeVector* rangeVector = 0;
106  if (vector !=0 ) {
107  rangeVector = new G4RangeVector(LowestEnergy, MaxEnergyCut, TotBin);
109  for (size_t i=0; i<=size_t(TotBin); i++) {
110  G4double Value = (*vector)[i];
111  rangeVector->PutValue(i,Value);
112  }
113  }
114  fRangeVectorStore.push_back(rangeVector);
115  }
116  return *this;
117 }
void insert(G4PhysicsVector *)
static size_t GetNumberOfElements()
Definition: G4Element.cc:402
std::vector< G4RangeVector * > fRangeVectorStore
double G4double
Definition: G4Types.hh:76
void clearAndDestroy()
const G4ParticleDefinition * theParticle
G4int G4VRangeToEnergyConverter::operator== ( const G4VRangeToEnergyConverter right) const

Definition at line 137 of file G4VRangeToEnergyConverter.cc.

References right.

138 {
139  return this == &right;
140 }
void G4VRangeToEnergyConverter::Reset ( )
virtual

Reimplemented in G4RToEConvForProton.

Definition at line 273 of file G4VRangeToEnergyConverter.cc.

References G4PhysicsTable::clearAndDestroy(), fRangeVectorStore, NumberOfElements, and theLossTable.

Referenced by BuildLossTable(), Convert(), and G4ProductionCutsTable::ResetConverters().

274 {
275  // delete loss table
276  if (theLossTable) {
278  delete theLossTable;
279  }
280  theLossTable=0;
282 
283  //clear RangeVectorStore
284  for (size_t idx=0; idx<fRangeVectorStore.size(); idx++){
285  delete fRangeVectorStore.at(idx);
286  }
287  fRangeVectorStore.clear();
288 }
std::vector< G4RangeVector * > fRangeVectorStore
void clearAndDestroy()
void G4VRangeToEnergyConverter::SetEnergyRange ( G4double  lowedge,
G4double  highedge 
)
static

Definition at line 226 of file G4VRangeToEnergyConverter.cc.

References G4cerr, G4endl, G4Exception(), python.hepunit::GeV, HighestEnergy, JustWarning, and LowestEnergy.

Referenced by G4ProductionCutsTable::SetEnergyRange().

228 {
229  // check LowestEnergy/ HighestEnergy
230  if ( (lowedge<0.0)||(highedge<=lowedge) ){
231 #ifdef G4VERBOSE
232  G4cerr << "Error in G4VRangeToEnergyConverter::SetEnergyRange";
233  G4cerr << " : illegal energy range" << "(" << lowedge/GeV;
234  G4cerr << "," << highedge/GeV << ") [GeV]" << G4endl;
235 #endif
236  G4Exception( "G4VRangeToEnergyConverter::SetEnergyRange()",
237  "ProcCuts101",
238  JustWarning, "Illegal energy range ");
239  } else {
240  LowestEnergy = lowedge;
241  HighestEnergy = highedge;
242  }
243 }
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define G4endl
Definition: G4ios.hh:61
G4GLOB_DLL std::ostream G4cerr
void G4VRangeToEnergyConverter::SetMaxEnergyCut ( G4double  value)
static

Definition at line 265 of file G4VRangeToEnergyConverter.cc.

References MaxEnergyCut.

Referenced by G4ProductionCutsTable::SetMaxEnergyCut().

266 {
268 }
const XML_Char int const XML_Char * value
void G4VRangeToEnergyConverter::SetVerboseLevel ( G4int  value)
inline

Definition at line 159 of file G4VRangeToEnergyConverter.hh.

Referenced by G4ProductionCutsTable::SetVerboseLevel(), and G4ProductionCutsTable::UpdateCoupleTable().

160 {
161  verboseLevel = value;
162 }
const XML_Char int const XML_Char * value

Field Documentation

G4double G4VRangeToEnergyConverter::fMaxEnergyCut
protected

Definition at line 112 of file G4VRangeToEnergyConverter.hh.

Referenced by Convert(), G4VRangeToEnergyConverter(), and operator=().

std::vector< G4RangeVector* > G4VRangeToEnergyConverter::fRangeVectorStore
protected
G4double G4VRangeToEnergyConverter::HighestEnergy = 100.0e6*MeV
staticprotected

Definition at line 110 of file G4VRangeToEnergyConverter.hh.

Referenced by GetHighEdgeEnergy(), operator=(), and SetEnergyRange().

G4double G4VRangeToEnergyConverter::LowestEnergy = 0.99e-3*MeV
staticprotected
G4double G4VRangeToEnergyConverter::MaxEnergyCut = 10.0*GeV
staticprotected
G4int G4VRangeToEnergyConverter::NumberOfElements
protected
G4LossTable* G4VRangeToEnergyConverter::theLossTable
protected
const G4ParticleDefinition* G4VRangeToEnergyConverter::theParticle
protected
const G4int G4VRangeToEnergyConverter::TotBin
protected

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