19#include "CLHEP/Units/SystemOfUnits.h"
43 for (
int k=0; k<Nelem; k++ ) {
47 rho += w * pe->getDensity(tempK);
48 Aeff += w * pe->getAtomicA();
49 Zeff += w * pe->getAtomicZ();
66 std::vector<float> tempv;
67 for (
int k=0; k<Nelem; k++ ) {
69 tempv = pe->getLnELvls();
78 std::vector<float>::iterator vit;
103 for (
int i=0; i<NLvls; i++ ) {
106 for (
int k=0; k<Nelem; k++ ) {
108 if (
m_lnELvls[i] >= pe->getLnELvls()[0] ) {
116 fosc = std::clamp(fosc, 1e-300,1e+300);
127 for (
int i=NLvls-1; i>=0; --i) {
136 lnSigma = std::log(sigma);
141 for (
int i=0; i<NLvls; i++) {
146 double cnst = std::log(M_PI_2*
m_Wp2);
147 for (
int i=0; i<NLvls; i++) {
166 xsig = std::max(xsig,-99.);
167 xsig = std::exp( xsig + lnE );
178 fp = std::exp(std::max(fp, -99.0));
184 fm = std::exp(std::max(fm, -99.0));
187 double x = std::exp(lnD);
188 return x/(
x*
x-1.)*(fp-fm);
197 double extraParameter ) {
205 const double U[M]={-.8611363,-.3399810, .3399810 ,.8611363};
206 const double W[M]={ .3478548, .6521452, .6521452, .3478548};
211 double Dt = 0.5*(lnHi-lnLo);
217 for (
int i=1; i<=N; i++) {
218 for (
int k=0; k<M; k++) {
219 double arg = lnLo + D*(2*i-1+U[k]);
220 OTB += W[k] * (this->*pt2Func)(arg, extraParameter );
227 ATH_MSG_WARNING(
"effectiveGas::XGInt: integrate Divergence! " << std::abs(OTB-Y) <<
" " << std::abs(eps*OTB) );
230 }
while ( (std::abs(OTB-Y) > std::abs(eps*OTB)) && (eps>0) );
242 double E = std::exp(lnE);
243 double gammaSq = gamma*gamma;
244 double betaSq = 1.-1./gammaSq;
249 std::complex<double> Ceps1(er/(E*E), std::exp(ei));
250 std::complex<double> C1 = 1./gammaSq - Ceps1*betaSq;
251 std::complex<double> C2 = C1/(1.+Ceps1) * std::log(2.*betaSq*
MeeV/(E*C1));
255 x =
m_S2/betaSq * E * ( -2.*imag(C2)/(
m_Wp2*
M_PI) + (1.-std::exp(
x))/(E*E) );
263 std::vector<float>& lnEarray,
264 std::vector< std::vector<float> >& fnArray,
265 std::vector<float>& dndx)
274 int nGamVals = gamvec.size();
278 double lnEs = -99999999.;
280 fnArray.resize(nGamVals);
284 for (
int ig=0; ig<nGamVals; ++ig ) {
285 fnArray[ig].push_back(0.);
290 for (
int ie=NLvls-1; ie>=0; --ie ) {
293 for (
int ig=0; ig<nGamVals; ++ig ) {
296 fnArray[ig][nEVals] += ds;
298 if ( std::abs(lnEs-lnEi) > Rener || ie==0 ) {
300 lnEarray.push_back( lnEs );
302 for (
int ig=0; ig<nGamVals; ++ig ) {
303 fnArray[ig].push_back( fnArray[ig][nEVals] );
311 dndx.resize(nGamVals);
312 for (
int ig = 0; ig < nGamVals; ++ig ) {
313 dndx[ig] = fnArray[ig][nEVals-1];
#define ATH_MSG_WARNING(x)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
std::vector< float > m_lnEpsI
double XFReal(double lnD, double lnE)
double XGInt(double(TRT_PAI_effectiveGas::*pt2Func)(double, double), double lnLo, double lnHi, const double eps, double extraParameter)
std::vector< float > m_lnELvls
double XSigma(double lnE, double dummy)
std::vector< float > m_lnIntegratedSigmas
void GasTab(const std::vector< float > &gamvec, std::vector< float > &EArray, std::vector< std::vector< float > > &fnArray, std::vector< float > &dndx)
Tabulate double differential distribution.
std::vector< float > m_lnEpsR
std::vector< float > m_lnFosc
double dndedx(double lgE, double gamma)
TRT_PAI_effectiveGas(TRT_PAI_gasMixture *gm, double Emin, double Emax, double tempK, double eps)
Gas mixture = mixture of gas components.
TRT_PAI_element * getElement(unsigned int n)
Get element no.
double getElemWeight(unsigned int n)
Get weight of element no.
int getNElements()
Get number of different element in this gas mixture.
const double erg
1 ev to erg {erg}
const double mb
1mb to cm2
const double MeeV
same in ev
const double Nav
Avagadro constant.
const double he
same in ev
const double Qe
Electron charge{ESU}.
const double r0
electron radius{cm}
float Interpolate(const float &xval, const std::vector< float > &xtabulated, const std::vector< float > &ytabulated)
Interpolation function.