65   :
G4VEmModel(nam),fParticleChange(0),fParticle(0),
 
   66    isInitialised(false),energyGrid(0),  
 
   67    XSTableElectron(0),XSTablePositron(0),fPenelopeFSHelper(0),
 
   68    fPenelopeAngular(0),fLocalTable(false)
 
   71   fIntrinsicLowEnergyLimit = 100.0*
eV;
 
   72   fIntrinsicHighEnergyLimit = 100.0*
GeV;
 
  103       if (fPenelopeFSHelper)
 
  104     delete fPenelopeFSHelper;   
 
  107   if (fPenelopeAngular)
 
  108     delete fPenelopeAngular;
 
  116   if (verboseLevel > 3)
 
  117     G4cout << 
"Calling G4PenelopeBremsstrahlungModel::Initialise()" << 
G4endl;
 
  124       if (!fPenelopeFSHelper)
 
  126       if (!fPenelopeAngular)
 
  132       if (fPenelopeAngular)
 
  137       nBins = 
std::max(nBins,(
size_t)100);
 
  143       XSTableElectron = 
new  
  145       XSTablePositron = 
new  
  146     std::map< std::pair<const G4Material*,G4double>, G4PenelopeCrossSection*>;    
 
  159       BuildXSTable(theMat,theCuts.at(i));
 
  164       if (verboseLevel > 2) {
 
  165     G4cout << 
"Penelope Bremsstrahlung model v2008 is initialized " << G4endl
 
  173   if(isInitialised) 
return;
 
  175   isInitialised = 
true;
 
  182   if (verboseLevel > 3)
 
  183     G4cout << 
"Calling  G4PenelopeBremsstrahlungModel::InitialiseLocal()" << 
G4endl;
 
  196       energyGrid = theModel->energyGrid;
 
  197       XSTableElectron = theModel->XSTableElectron;
 
  198       XSTablePositron = theModel->XSTablePositron;
 
  199       fPenelopeFSHelper = theModel->fPenelopeFSHelper;
 
  204       if (!fPenelopeAngular)
 
  207       if (fPenelopeAngular)
 
  222       nBins = theModel->nBins;
 
  225       verboseLevel = theModel->verboseLevel;
 
  240   if (verboseLevel > 3)
 
  241     G4cout << 
"Calling CrossSectionPerVolume() of G4PenelopeBremsstrahlungModel" << 
G4endl;
 
  256   if (verboseLevel > 3)
 
  257     G4cout << 
"Material " << material->
GetName() << 
" has " << atPerMol <<
 
  258       "atoms per molecule" << 
G4endl;
 
  262     moleculeDensity = atomDensity/atPerMol;
 
  264   G4double crossPerVolume = crossPerMolecule*moleculeDensity;
 
  266   if (verboseLevel > 2)
 
  269     G4cout << 
"Mean free path for gamma emission > " << cutEnergy/
keV << 
" keV at " <<
 
  270       energy/
keV << 
" keV = " << (1./crossPerVolume)/
mm << 
" mm" << G4endl;
 
  273   return crossPerVolume;
 
  288   G4cout << 
"*** G4PenelopeBremsstrahlungModel -- WARNING ***" << 
G4endl;
 
  289   G4cout << 
"Penelope Bremsstrahlung model v2008 does not calculate cross section _per atom_ " << 
G4endl;
 
  290   G4cout << 
"so the result is always zero. For physics values, please invoke " << 
G4endl;
 
  291   G4cout << 
"GetCrossSectionPerVolume() or GetMeanFreePath() via the G4EmCalculator" << 
G4endl;
 
  302   if (verboseLevel > 3)
 
  303     G4cout << 
"Calling ComputeDEDX() of G4PenelopeBremsstrahlungModel" << 
G4endl;
 
  317     moleculeDensity = atomDensity/atPerMol;
 
  319   G4double sPowerPerVolume = sPowerPerMolecule*moleculeDensity;
 
  321   if (verboseLevel > 2)
 
  324       G4cout << 
"Stopping power < " << cutEnergy/
keV << 
" keV at " <<
 
  325         kineticEnergy/
keV << 
" keV = " << 
 
  326         sPowerPerVolume/(
keV/
mm) << 
" keV/mm" << G4endl;
 
  328   return sPowerPerVolume;
 
  339   if (verboseLevel > 3)
 
  340     G4cout << 
"Calling SampleSecondaries() of G4PenelopeBremsstrahlungModel" << 
G4endl;
 
  345   if (kineticEnergy <= fIntrinsicLowEnergyLimit)
 
  357   if (kineticEnergy < cutG)
 
  360   if (verboseLevel > 3)
 
  361     G4cout << 
"Going to sample gamma energy for: " <<material->
GetName() << 
" " << 
 
  362       "energy = " << kineticEnergy/
keV << 
", cut = " << cutG/
keV << 
G4endl;
 
  368   if (verboseLevel > 3)
 
  369     G4cout << 
"Sampled gamma energy: " << gammaEnergy/
keV << 
" keV" << 
G4endl;
 
  374      fPenelopeAngular->
SampleDirection(aDynamicParticle,gammaEnergy,0,material);
 
  376   if (verboseLevel > 3)
 
  379   G4double residualPrimaryEnergy = kineticEnergy-gammaEnergy;
 
  380   if (residualPrimaryEnergy < 0)
 
  383       gammaEnergy += residualPrimaryEnergy;
 
  384       residualPrimaryEnergy = 0.0;
 
  388   G4ThreeVector particleDirection1 = initialMomentum - gammaEnergy*gammaDirection1;
 
  389   particleDirection1 = particleDirection1.
unit(); 
 
  392   if (residualPrimaryEnergy > 0.)
 
  406   fvect->push_back(theGamma);
 
  408   if (verboseLevel > 1)
 
  410       G4cout << 
"-----------------------------------------------------------" << 
G4endl;
 
  411       G4cout << 
"Energy balance from G4PenelopeBremsstrahlung" << 
G4endl;
 
  412       G4cout << 
"Incoming primary energy: " << kineticEnergy/
keV << 
" keV" << 
G4endl;
 
  413       G4cout << 
"-----------------------------------------------------------" << 
G4endl;
 
  414       G4cout << 
"Outgoing primary energy: " << residualPrimaryEnergy/
keV << 
" keV" << 
G4endl;
 
  415       G4cout << 
"Bremsstrahlung photon " << gammaEnergy/
keV << 
" keV" << 
G4endl;
 
  416       G4cout << 
"Total final state: " << (residualPrimaryEnergy+gammaEnergy)/
keV  
  418       G4cout << 
"-----------------------------------------------------------" << 
G4endl;
 
  421   if (verboseLevel > 0)
 
  423       G4double energyDiff = std::fabs(residualPrimaryEnergy+gammaEnergy-kineticEnergy);
 
  424       if (energyDiff > 0.05*
keV)
 
  425         G4cout << 
"Warning from G4PenelopeBremsstrahlung: problem with energy conservation: "  
  427           (residualPrimaryEnergy+gammaEnergy)/
keV <<
 
  428           " keV (final) vs. " <<
 
  429           kineticEnergy/
keV << 
" keV (initial)" << G4endl;
 
  436 void G4PenelopeBremsstrahlungModel::ClearTables()
 
  440     G4Exception(
"G4PenelopeBremsstrahlungModel::ClearTables()",
 
  446       for (i=XSTableElectron->begin(); i != XSTableElectron->end(); i++)
 
  451       delete XSTableElectron;
 
  456       for (i=XSTablePositron->begin(); i != XSTablePositron->end(); i++)
 
  461       delete XSTablePositron;
 
  468   if (fPenelopeFSHelper)
 
  471   if (verboseLevel > 2)
 
  472     G4cout << 
"G4PenelopeBremsstrahlungModel: cleared tables" << 
G4endl;
 
  482   return fIntrinsicLowEnergyLimit;
 
  491     G4Exception(
"G4PenelopeBremsstrahlungModel::BuildXSTable()",
 
  495   std::pair<const G4Material*,G4double> theKey = std::make_pair(mat,cut);  
 
  498   if (XSTableElectron->count(theKey) && XSTablePositron->count(theKey))
 
  506   if (verboseLevel > 2)
 
  508       G4cout << 
"G4PenelopeBremsstrahlungModel: going to build cross section table " << 
G4endl;
 
  509       G4cout << 
"for e+/e- in " << mat->
GetName() << 
" for Ecut(gamma)= " << 
 
  517       ed << 
"Energy Grid looks not initialized" << 
G4endl;
 
  519       G4Exception(
"G4PenelopeBremsstrahlungModel::BuildXSTable()",
 
  545        size_t nBinsX = fPenelopeFSHelper->
GetNBinsX();       
 
  548        for (
size_t ix=0;ix<nBinsX;ix++) 
 
  551        G4double val = (*table)[ix]->Value(logene);     
 
  552        tempData[ix] = std::exp(val); 
 
  556        if (restrictedCut <= 1) 
 
  564        if (restrictedCut <=1)
 
  576        XS2 = XS2A*fact*energy*
energy;
 
  577        XH2 = XH2A*fact*energy*
energy;
 
  582        G4double posCorrection = GetPositronXSCorrection(mat,energy);
 
  592   XSTableElectron->insert(std::make_pair(theKey,XSEntry));
 
  593   XSTablePositron->insert(std::make_pair(theKey,XSEntry2));
 
  610       G4Exception(
"G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
 
  619       if (!XSTableElectron)
 
  623           G4String excep = 
"The Cross Section Table for e- was not initialized correctly!";
 
  624           G4Exception(
"G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
 
  627       XSTableElectron = 
new 
  633       if (!fPenelopeFSHelper)
 
  636       std::pair<const G4Material*,G4double> theKey = std::make_pair(mat,cut);
 
  637       if (XSTableElectron->count(theKey)) 
 
  638         return XSTableElectron->find(theKey)->second;
 
  644       ed << 
"Unable to find e- table for " << mat->
GetName() << 
" at Ecut(gamma)= "  
  646       ed << 
"This can happen only in Unit Tests or via G4EmCalculator" << 
G4endl;
 
  647       G4Exception(
"G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
 
  650       G4AutoLock lock(&PenelopeBremsstrahlungModelMutex);
 
  652       BuildXSTable(mat,cut);
 
  655       return XSTableElectron->find(theKey)->second;
 
  663       if (!XSTablePositron)
 
  665       G4String excep = 
"The Cross Section Table for e+ was not initialized correctly!";
 
  666           G4Exception(
"G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
 
  669       XSTablePositron = 
new  
  670         std::map< std::pair<const G4Material*,G4double>, G4PenelopeCrossSection*>;
 
  675       if (!fPenelopeFSHelper)
 
  678       std::pair<const G4Material*,G4double> theKey = std::make_pair(mat,cut);
 
  679       if (XSTablePositron->count(theKey)) 
 
  680         return XSTablePositron->find(theKey)->second;
 
  686       ed << 
"Unable to find e+ table for " << mat->
GetName() << 
" at Ecut(gamma)= "  
  688       ed << 
"This can happen only in Unit Tests or via G4EmCalculator" << 
G4endl;
 
  689       G4Exception(
"G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
 
  692       G4AutoLock lock(&PenelopeBremsstrahlungModelMutex);
 
  694       BuildXSTable(mat,cut);
 
  697       return XSTablePositron->find(theKey)->second;            
 
  707 G4double G4PenelopeBremsstrahlungModel::GetPositronXSCorrection(
const G4Material* mat,
 
  717   G4double corr = 1.0-std::exp(-t*(1.2359e-1-t*(6.1274e-2-t*
 
  718                        (3.1516e-2-t*(7.7446e-3-t*(1.0595e-3-t*
 
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
 
G4double LowEnergyLimit() const 
 
G4double GetEffectiveZSquared(const G4Material *mat) const 
 
G4double GetMomentumIntegral(G4double *y, G4double up, G4int momOrder) const 
 
G4ParticleChangeForLoss * GetParticleChangeForLoss()
 
G4double GetSoftStoppingPower(G4double energy) const 
Returns the total stopping power due to soft collisions. 
 
std::ostringstream G4ExceptionDescription
 
G4double GetKineticEnergy() const 
 
G4double HighEnergyLimit() const 
 
const G4String & GetName() const 
 
const G4ParticleDefinition * fParticle
 
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double SampleGammaEnergy(G4double energy, const G4Material *, const G4double cut) const 
 
G4double GetHardCrossSection(G4double energy) const 
Returns hard cross section at the given energy. 
 
void PrepareTables(const G4Material *material, G4bool isMaster)
Reserved for Master Model. 
 
size_t GetVectorLength() const 
 
G4double GetLowEdgeEnergy(size_t binNumber) const 
 
G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double out_energy, G4int Z, const G4Material *mat=0)
Samples the direction of the outgoing photon (in global coordinates). 
 
#define G4MUTEX_INITIALIZER
 
const G4String & GetParticleName() const 
 
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
 
void AddCrossSectionPoint(size_t binNumber, G4double energy, G4double XH0, G4double XH1, G4double XH2, G4double XS0, G4double XS1, G4double XS2)
 
void SetHighEnergyLimit(G4double)
 
virtual void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *)
 
G4GLOB_DLL std::ostream G4cout
 
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *theParticle, G4double kinEnergy, G4double Z, G4double A=0, G4double cut=0, G4double emax=DBL_MAX)
 
size_t GetTableSize() const 
 
void BuildScaledXSTable(const G4Material *material, G4double cut, G4bool isMaster)
 
void ClearTables(G4bool isMaster=true)
Reserved for the master model: they build and handle tables. 
 
G4PenelopeBremsstrahlungModel(const G4ParticleDefinition *p=0, const G4String &processName="PenBrem")
 
std::ostream & tab(std::ostream &)
 
const G4ThreeVector & GetMomentumDirection() const 
 
void SetProposedKineticEnergy(G4double proposedKinEnergy)
 
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *theParticle, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy=DBL_MAX)
 
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
 
static G4PenelopeOscillatorManager * GetOscillatorManager()
 
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
 
virtual ~G4PenelopeBremsstrahlungModel()
 
G4double GetTotNbOfAtomsPerVolume() const 
 
static G4ProductionCutsTable * GetProductionCutsTable()
 
static G4Positron * Positron()
 
virtual G4double MinEnergyCut(const G4ParticleDefinition *, const G4MaterialCutsCouple *)
 
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const 
 
T max(const T t1, const T t2)
brief Return the largest of the two arguments 
 
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy)
 
static G4Electron * Electron()
 
G4ParticleChangeForLoss * fParticleChange
 
void SetDeexcitationFlag(G4bool val)
 
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
 
G4double GetAtomsPerMolecule(const G4Material *)
Returns the total number of atoms per molecule. 
 
const G4PhysicsTable * GetScaledXSTable(const G4Material *, const G4double cut) const 
 
G4ThreeVector GetMomentum() const 
 
const G4Material * GetMaterial() const