#include "PHASIC++/Channels/BBar_Emission_Generator.H" #include "PHASIC++/Channels/CS_Dipoles.H" #include "PHASIC++/Main/Process_Integrator.H" #include "PHASIC++/Main/Phase_Space_Handler.H" #include "ATOOLS/Org/Integration_Info.H" #include "ATOOLS/Phys/NLO_Subevt.H" #include "ATOOLS/Math/Random.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Math/MathTools.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/Data_Reader.H" #include "ATOOLS/Org/Data_Writer.H" #include "ATOOLS/Org/Scoped_Settings.H" #include "PHASIC++/Channels/Vegas.H" #include "ATOOLS/Org/My_MPI.H" using namespace ATOOLS; using namespace PHASIC; const size_t s_noptmin(10); BBar_Emission_Generator::BBar_Emission_Generator(): m_opt(5) { auto& s = Settings::GetMainSettings(); m_omode = s["EEG"]["OMODE"].SetDefault(2).Get(); m_opt = s["EEG"]["OSTEP"].SetDefault(5).Get(); m_Q2min = s["EEG"]["Q2MIN"].SetDefault(1e-6).Get(); m_amin = s["DIPOLES"]["AMIN"].Get(); } BBar_Emission_Generator::~BBar_Emission_Generator() { for (size_t i(0);i (dip->GetSubEvt()->p_proc)); Flavour_Vector cfl (dip->GetSubEvt()->p_fl, &dip->GetSubEvt()->p_fl[dip->GetSubEvt()->m_n]); Process_Base *bproc(NULL); for (size_t i(0);iSize();++i) { if ((*bviproc)[i]->Flavours()==cfl) { if (bproc) THROW(fatal_error,"Doubled Born process"); bproc=(*bviproc)[i]; } } if (bproc==NULL) THROW(fatal_error, "Missing Born process for '"+sproc->Name()+"'"); for (size_t i(0);iIsMapped(m_dipoles[i])) { m_pmap[m_dipoles[i]][bproc].push_back(sproc); delete dip; return false; } dip->InitVegas(""); dip->SetAMin(m_amin); dip->SetQ2Min(m_Q2min); m_dipoles.push_back(dip); m_pmap[dip][bproc].push_back(sproc); return true; } bool BBar_Emission_Generator::InitDipoles (Process_Base *const bviproc,Process_Base *const sproc, Phase_Space_Handler *const psh) { m_nin=sproc->NIn(); for (size_t i(0);iSize();++i) { NLO_subevtlist *subs((*sproc)[i]->GetSubevtList()); for (size_t j(0);jsize()-1;++j) { NLO_subevt *sub((*subs)[j]); if (sub->m_stype==sbt::qed) continue; if (sub->m_im_km_kSetAlpha(1.0/m_dipoles.size()); if (msg_LevelIsDebugging()) { for (size_t i(0);i &pmap(m_pmap[m_dipoles[i]]); for (std::map::const_iterator pit(pmap.begin());pit!=pmap.end();++pit) { msg_Debugging()<first->Name()<<" {\n"; for (size_t j(0);jsecond.size();++j) msg_Debugging()<<" "<second[j]->Name()<<"\n"; msg_Debugging()<<"}\n"; } } } for (size_t i(0);iSize();++i) for (std::map >:: iterator pit(m_pmap.begin());pit!=m_pmap.end();++pit) if (pit->second.find((*bviproc)[i])==pit->second.end()) { msg_Debugging()<<"Add process "<<(*bviproc)[i]->Name() <<" in dipole "<first->Id()<<"\n"; pit->second[(*bviproc)[i]]=Process_Vector(); } return true; } Dipole_Params BBar_Emission_Generator::Active (Process_Base *const bviproc) const { if (p_active==NULL) return Dipole_Params(); return Dipole_Params(p_active,m_pmap.find(p_active) ->second.find(bviproc)->second, m_p,m_weight); } bool BBar_Emission_Generator::GeneratePoint (const Vec4D_Vector &p,Cut_Data *const cuts) { DEBUG_FUNC(""); m_p.clear(); p_active=NULL; double rns[4]; for (size_t i(0);i<4;++i) rns[i]=ran->Get(); msg_Debugging()<<"in EEG: "; msg_Debugging()<<"#1 = "<ValidPoint(p)) { msg_Debugging()<<"invalid for "<Id()<<"\n"; continue; } cdips.push_back(m_dipoles[i]); asum+=cdips.back()->Alpha(1); } if (cdips.empty()) return false; double disc(rns[0]*asum), psum(0.0); for (size_t i(0);iAlpha(1))>=disc) { p_active=cdips[i]; break; } if (p_active==NULL) THROW(fatal_error,"Internal error"); msg_Debugging()<<"selected "<Id()<<"\n"; m_p=p_active->GeneratePoint(p,cuts,&rns[1]); return true; } bool BBar_Emission_Generator::GenerateWeight (Cut_Data *const cuts,bool activeonly) { DEBUG_FUNC(""); if (p_active==NULL) { msg_Debugging()<<"Invalid Born\n"; return false; } msg_Debugging()<<"Dipole "<Id()<<" {\n"; double wgt(p_active->GenerateWeight(m_p,cuts)); msg_Debugging()<<"} -> w = "<On()) asum+=m_dipoles[i]->Alpha(1); m_weight=wgt*asum/p_active->Alpha(1); return true; } void BBar_Emission_Generator::AddPoint(const double &value) { double rssum(0.0); const std::map &procs(m_pmap[p_active]); for (std::map::const_iterator pit(procs.begin());pit!=procs.end();++pit) for (Process_Vector::const_iterator spit(pit->second.begin()); spit!=pit->second.end();++spit) rssum-=(*spit)->Last()*m_weight; p_active->AddPoint(value*rssum,m_weight,1); for (size_t i(0);iAddPoint(0.0,m_weight,0); } void BBar_Emission_Generator::Optimize() { msg_Tracking()<<"Optimize EEG ("<N()N()<<" vs. "<Id()<<" : alpha = "<Alpha()<Alpha()<=0.0) ++off; else { if (m_opt==1 && (m_omode&2)) v->Optimize(); if ((m_omode&1) && aopt) { v->SetOldAlpha(v->Alpha()); v->SetAlpha(v->Alpha()*sqrt(dabs(v->Mean()))); csum+=v->Alpha(); wmean+=dabs(v->Mean()); ++nc; } } } wmean/=nc; if (aopt) { msg_Tracking()<Alpha()>0.0) { if (nc>0.0) v->SetAlpha(v->Alpha()/csum); double dev(int((v->Alpha()/v->OldAlpha()-1.0)*10000)/100.0); double re(int(v->Sigma()/v->Mean()*10000)/100.0); if (v->N()<2) re=100.0; if (v->Alpha()) { msg_Tracking()<Id() <<": n = "<N()<<" w' = "<0.0?v->Mean()/wmean:v->Mean()) <<" +- "< a = "<OldAlpha() <<" -> "<Alpha() <<" ( "<Reset(); } } msg_Tracking()<1) --m_opt; } void BBar_Emission_Generator::EndOptimize() { for (size_t i(0);iEndOptimize(); m_opt=0; } void BBar_Emission_Generator::MPISync() { #ifdef USING__MPI std::vector sv; for (size_t i(0), j(0);iMPICollect(sv,j); if (mpi->Size()) mpi->Allreduce(&sv[0],sv.size(),MPI_DOUBLE,MPI_SUM); for (size_t i(0), j(0);iMPIReturn(sv,j); #endif for (size_t i(0);iMPISync(); } void BBar_Emission_Generator::WriteOut(std::string pid) { MakeDir(pid,false); pid+="_CS"; std::vector > pvds(m_dipoles.size()); for (size_t i(0);iWriteOut(pid,pvds[i]); pvds.push_back(std::vector(1,ToString(m_opt))); Data_Writer writer; writer.SetOutputPath(pid); writer.SetOutputFile("_EEG_PV"); writer.MatrixToFile(pvds); } bool BBar_Emission_Generator::ReadIn(std::string pid) { pid+="_CS"; Data_Reader reader; reader.SetInputPath(pid); reader.SetInputFile("_EEG_PV"); std::vector > pvds; reader.MatrixFromFile(pvds); if (m_dipoles.size()>pvds.size()-1) THROW(fatal_error,"Corrupted input file"); for (size_t i(0);iReadIn(pid,pvds[i]); if (pvds.back().size()!=1) THROW(fatal_error,"Corrupted input file"); m_opt=ToType(pvds.back().front()); return true; } void BBar_Emission_Generator::Print() { msg_Tracking()<<"EEG with "<Id()<<" : " <Alpha()<<"\n"; } msg_Tracking()<<"----------------------------------------------\n"; } namespace PHASIC { std::ostream &operator<<(std::ostream &ostr,const Dipole_Params &dp) { ostr<<*dp.p_dip<<"\n"; for (size_t i(0);iName()<<"\n"; for (size_t i(0);i "<