#include "PHASIC++/Main/Helicity_Integrator.H" #include "ATOOLS/Math/Random.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Phys/Blob.H" #include "ATOOLS/Org/My_File.H" using namespace PHASIC; using namespace ATOOLS; std::ostream &PHASIC::operator<<(std::ostream &str,const hls::scheme &s) { switch (s) { case hls::unknown: return str<<""; case hls::sum: return str<<"sum"; case hls::sample: return str<<"sample"; } return str<<""; } std::map hls::HelicitySchemeTags() { std::map tags; tags["UNKNOWN"]=ToString((int)hls::unknown); tags["SUM"]=ToString((int)hls::sum); tags["SAMPLE"]=ToString((int)hls::sample); return tags; } Helicity_Integrator::Helicity_Integrator(): m_iter(1), m_on(1) {} Helicity_Integrator::~Helicity_Integrator() { } bool Helicity_Integrator::CheckChirs(const Int_Vector &chirs) { size_t p(0), m(0); Int_Vector q(94,0); for (size_t i(0);i0) ++p; else if (chirs[i]<0) ++m; else THROW(fatal_error,"Invalid helicities"); } for (size_t i(0);i1 && m>1; } void Helicity_Integrator::Construct(Int_Vector chirs,const size_t i) { if (i==m_chirs.size()) { if (CheckChirs(chirs)) { size_t id(MakeId(chirs)); msg_Debugging()<<"adding helicity configuration " < "<(m_chirs.size(),0),0); double sum(0.0), asum(0.0); for (size_t i(0);iprecision(14); msg_Debugging()< "<precision(14); msg_Debugging()<>m_weights[i]>>m_sum[i]>>m_sum2[i]>>m_n[i]; m_asum[i]=sum+=m_weights[i]; msg_Debugging()<<" "< "<Get()), a(m_asum[i]); while (r-l>1) { if (disc0 && m_weights[r]==0.0) --r; msg_Debugging()<<"selected "< "<m_weights.size()) THROW(fatal_error,"Invalid identifier"); return 1.0/(m_valid*m_weights[m_id])*m_weight; } void Helicity_Integrator::AddPoint(const double &weight) { if (!m_new) return; m_new=false; m_sum[m_id]+=weight; m_sum2[m_id]+=sqr(weight); ++m_n[m_id]; } void Helicity_Integrator::Optimize() { size_t generated(0); double norm(0.0), oldnorm(0.0); for (size_t i(0);i0.0)) THROW(fatal_error,"Invalid weight."); m_weights[i]=alpha; norm+=alpha; ++generated; } norm/=oldnorm; oldnorm=0.0; if (generated==0) THROW(fatal_error,"No channel generated."); for (size_t i(0);i0) id+=1< "<