#include "SHRiMPS/Cross_Sections/Sigma_SD.H" #include "SHRiMPS/Tools/Special_Functions.H" #include "ATOOLS/Math/Gauss_Integrator.H" #include "ATOOLS/Math/Random.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/Run_Parameter.H" using namespace SHRIMPS; using namespace ATOOLS; double Sigma_SD::dSigma_dt_Kernel::operator()(double B) { // msg_Out()<Eikonals()), p_sigma_el(sigma_el), m_Bmin(p_sigma_el->Bmin()), m_Bmax(p_sigma_el->Bmax()), m_Qmax(p_sigma_el->Qmax()), m_logQsteps(p_sigma_el->Steps()), m_logdelta(p_sigma_el->Delta()) { FillGrids(); } void Sigma_SD::FillGrids() { msg_Tracking()<<"In "<::iterator eikiter=p_eikonals->begin(); eikiter!=p_eikonals->end();eikiter++) { if ((*eikiter)->FF1()->Number()>noFF) noFF = (*eikiter)->FF1()->Number(); } noFF++; std::vector > eikonals; std::vector prefs; eikonals.resize(noFF); prefs.resize(noFF); for (int i=0;i::iterator eikiter=p_eikonals->begin(); eikiter!=p_eikonals->end();eikiter++) { if ((*eikiter)->FF1()->Number()==i && (*eikiter)->FF2()->Number()==j) eikonals[i][j] = (*eikiter); if ((*eikiter)->FF1()->Number()==i) prefs[i] = (*eikiter)->FF1()->Prefactor(); } } } dSigma_dt_Kernel differential; ATOOLS::Gauss_Integrator integrator(&differential); double pref1(0.), cumul1(0.), value1(0.); double pref2(0.), cumul2(0.), value2(0.); double prefQ(0.), Q(0.), sigmael(p_sigma_el->Sigma()); std::vector > values; values.resize(noFF); for (int i=0;i1 && (value1-pref1)/(value1+pref1)>1.e-12 && (value2-pref2)/(value2+pref2)>1.e-12)) { Q = m_Qmax*exp(-double(step)/m_logdelta); differential.SetQ(Q); for (int i=0;iPicobarn()/(4.*M_PI); value2 *= ATOOLS::rpa->Picobarn()/(4.*M_PI); m_diffgrid_SD1.push_back(value1); m_diffgrid_SD2.push_back(value2); msg_Tracking()<<" Q = "< dsigma/dt = " <<(value1/1.e9)<<"/"<<(value2/1.e9)<<" mbarn."<0) { cumul1 += (value1+pref1)/2. * (prefQ-Q)*(prefQ+Q); cumul2 += (value2+pref2)/2. * (prefQ-Q)*(prefQ+Q); m_intgrid_SD1.push_back(cumul1); m_intgrid_SD2.push_back(cumul2); } prefQ = Q; pref1 = value1; pref2 = value2; step++; } Q = 0.; differential.SetQ(Q); for (int i=0;iPicobarn()/(4.*M_PI); value2 *= ATOOLS::rpa->Picobarn()/(4.*M_PI); m_diffgrid_SD1.push_back(value1); m_diffgrid_SD2.push_back(value2); cumul1 += (value1+pref1)/2. * (prefQ-Q)*(prefQ+Q); cumul2 += (value2+pref2)/2. * (prefQ-Q)*(prefQ+Q); m_intgrid_SD1.push_back(cumul1); m_intgrid_SD2.push_back(cumul2); m_sigma_SD1 = cumul1-sigmael; m_sigma_SD2 = cumul2-sigmael; m_sigma = m_sigma_SD1+m_sigma_SD2; msg_Tracking()<<"Sigma_{el} = "<<(sigmael/1.e9)<<", " <<"Sigma_{SD} = "<<(m_sigma_SD1/1.e9)<<" + " <<(m_sigma_SD2/1.e9)<<", total = "<<(cumul1+cumul2)/1.e9<<" mbarn."< & grid = *p_sigma_el->Grid(); for (size_t i=0;i " <::iterator eikonal1=p_eikonals->begin(); eikonal1!=p_eikonals->end(); eikonal1++) { for (std::list::iterator eikonal2=p_eikonals->begin(); eikonal2!=p_eikonals->end(); eikonal2++) { if ((*eikonal1)->GetSingleTerm(0)->FF1()->Number()== (*eikonal2)->GetSingleTerm(0)->FF1()->Number()) { sdvalue += (*eikonal1)->Prefactor()*(1.-exp(-(**eikonal1)(B)/2.)) * (*eikonal2)->Prefactor()*(1.-exp(-(**eikonal2)(B)/2.)) / ATOOLS::sqr((*eikonal1)->GetSingleTerm(0)->FF1()->Prefactor()); } if ((*eikonal1)->GetSingleTerm(0)->FF2()->Number()== (*eikonal2)->GetSingleTerm(0)->FF2()->Number()) { sdvalue += (*eikonal1)->Prefactor()*(1.-exp(-(**eikonal1)(B)/2.)) * (*eikonal2)->Prefactor()*(1.-exp(-(**eikonal2)(B)/2.)) / ATOOLS::sqr((*eikonal1)->GetSingleTerm(0)->FF2()->Prefactor()); } } } double value(0.); for (std::list::iterator eikonal=p_eikonals->begin(); eikonal!=p_eikonals->end(); eikonal++) { value += (*eikonal)->Prefactor()*(1.-exp(-(**eikonal)(B)/2.)); } elvalue = 2.*ATOOLS::sqr(value); return sdvalue-elvalue; } void Sigma_SD::PrintDifferentialElasticAndSDXsec(const bool & onscreen,std::string dirname) { std::ofstream was; std::string Estring(ATOOLS::ToString(2.*m_Qmax)); std::string filename(dirname+std::string("/Dsigma_SD_by_dt_"+Estring+".dat")); was.open(filename.c_str()); double Q(m_Qmax); if (onscreen) msg_Out()<<"---------------------------------------------\n"; for (size_t i=0;i & grid = m_intgrid_SD1; if (m_sigma_SD1/m_sigma>ATOOLS::ran->Get()) mode = false; else mode = true; double random(ran->Get()); size_t i(0); while (random-grid[i]>=0) i++; double Q1(sqr(m_Qmax*exp(-double(i-1)/m_logdelta))); double Q2(sqr(i==grid.size()-1?0.:m_Qmax*exp(-double(i)/m_logdelta))); return ((Q2*(grid[i-1]-random)+Q1*(random-grid[i]))/(grid[i-1]-grid[i])); }