#include "AMEGIC++/DipoleSubtraction/Single_LOProcess.H" #include "MODEL/Main/Running_AlphaS.H" #include "PHASIC++/Main/Process_Integrator.H" #include "PHASIC++/Main/Phase_Space_Handler.H" #include "AMEGIC++/Phasespace/Phase_Space_Generator.H" #include "BEAM/Main/Beam_Spectra_Handler.H" #include "PDF/Main/ISR_Handler.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/My_File.H" #include "ATOOLS/Org/My_MPI.H" #include "ATOOLS/Org/Scoped_Settings.H" #include using namespace AMEGIC; using namespace PHASIC; using namespace MODEL; using namespace PDF; using namespace BEAM; using namespace ATOOLS; using namespace std; /*---------------------------------------------------------------------------- Constructors ----------------------------------------------------------------------------*/ Single_LOProcess::Single_LOProcess(const Process_Info &pi, BEAM::Beam_Spectra_Handler *const beam, PDF::ISR_Handler *const isr, const ATOOLS::sbt::subtype& st) : m_gen_str(2), m_ptypename(""), m_libname(""), m_pslibname(""), m_stype(st), m_emit(-1), m_spect(-1), p_hel(0), p_BS(0), p_ampl(0), p_shand(0), p_partner(this), m_pspissplscheme(0), m_pspfssplscheme(0), m_maxcpliqcd(2,99.), m_mincpliqcd(2,0.), m_maxcpliew(2,99.), m_mincpliew(2,0.), p_sub(NULL) { auto& s = Settings::GetMainSettings(); auto amegicsettings = s["AMEGIC"]; m_nin=pi.m_ii.NExternal(); m_nout=pi.m_fi.NExternal(); const std::vector flavrest = s["DIPOLES"]["BORN_FLAVOUR_RESTRICTIONS"].GetVector(); if (flavrest.size()%2) THROW(fatal_error,"Syntax error in DIPOLES:BORN_FLAVOUR_RESTRICTIONS."); for (size_t i(0);i() }; static bool print(false); if (!print && !ord) { print=true; msg_Info()<=0) m_srmap[m_rsmap[i]]=i; } vector fi_tags; m_pinfo.m_fi.GetTags(fi_tags); if (fi_tags.size()!=m_nout) THROW(fatal_error, "Internal error."); for (size_t i(0);i=0) m_srmap[m_rsmap[m_nin+i]]=m_nin+i; } m_newlib = false; m_pslibname = m_libname = ToString(m_nin)+"_"+ToString(m_nout); if (m_gen_str>1) m_ptypename = "P"+m_libname; else m_ptypename = "N"+m_libname; int cnt=0; for (size_t i(0);igen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/" +m_ptypename+"/"+m_name+".alt"; if (FileExists(altname)) return; My_Out_File to(altname); to.Open(); *to<::const_iterator fit =p_ampl->GetFlavourmap().begin(); fit!=p_ampl->GetFlavourmap().end();fit++) { *to<first<<" "<<(long int)fit->second<& links, string procname) { std::string altname = rpa->gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/" +m_ptypename+"/"+procname+".alt"; if (FileExists(altname)) { double factor; string name,dummy; My_In_File from(altname); from.Open(); *from>>name>>factor; m_sfactor *= factor; for (size_t j=0;jType()) { if (links[j]->Name()==name) { Single_LOProcess *pp=dynamic_cast(links[j]); if (Type()==10) { if (m_emit!=pp->m_emit || m_spect!=pp->m_spect || p_sub->m_ijt!=pp->p_sub->m_ijt || p_sub->m_kt!=pp->p_sub->m_kt || p_sub->m_i!=pp->p_sub->m_i || p_sub->m_j!=pp->p_sub->m_j || p_sub->m_k!=pp->p_sub->m_k) continue; } p_mapproc = p_partner = (Single_LOProcess*)links[j]; m_iresult = p_partner->Result()*m_sfactor; m_maxcpl=p_partner->MaxOrders(); m_mincpl=p_partner->MinOrders(); m_stype=p_partner->GetSubType(); msg_Tracking()<<"Found Alternative process: "<>f1>>f2; AddtoFlavmap(f1,Flavour(abs(f2),f2<0)); } } from.Close(); InitFlavmap(p_partner); FillCombinations(); return true; } } from.Close(); if (name!=procname && CheckAlternatives(links,name)) return true; } m_sfactor = 1.; return false; } int AMEGIC::Single_LOProcess::InitAmplitude(Amegic_Model * model,Topology* top, vector & links, vector & errs) { THROW(fatal_error,"Invalid function call"); } int AMEGIC::Single_LOProcess::InitAmplitude(Amegic_Model * model,Topology* top, vector & links, vector & errs, int checkloopmap) { DEBUG_FUNC("loop"); m_type = 20; if (!model->p_model->CheckFlavours(m_nin,m_nout,&m_flavs.front())) return 0; model->p_model->GetCouplings(m_cpls); msg_Debugging()<=m_nin && m_pspfssplscheme==0) continue; m_partonlistqed.push_back(i); } } } msg_Debugging()<<"QCD parton list: "<()) { msg_Info()<<"Enforce full library check. This may take some time." <gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/" +m_ptypename+"/"+m_libname; string hstr2 = rpa->gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/" +m_ptypename+"/"+m_name+".map"; p_BS = new Basic_Sfuncs(m_nin+m_nout,m_nin+m_nout,&m_flavs.front(),p_b, hstr,hstr2); } else p_BS = new Basic_Sfuncs(m_nin+m_nout,m_nin+m_nout,&m_flavs.front(),p_b); p_BS->Setk0(s_gauge); p_shand = new String_Handler(m_gen_str,p_BS,model->p_model->GetCouplings()); const bool cvp{ amegicsettings["CUT_MASSIVE_VECTOR_PROPAGATORS"].Get() }; p_ampl = new Amplitude_Handler(m_nin+m_nout,&m_flavs.front(),p_b,p_pinfo, model,top,m_maxcpl,m_mincpl, m_pinfo.m_ntchan,m_pinfo.m_mtchan,&m_cpls, p_BS,p_shand,m_print_graphs,!directload,cvp, m_ptypename+"/"+m_libname); if (p_ampl->GetGraphNumber()==0) { msg_Tracking()<PossibleConfigsExist(m_maxcpliqcd,m_mincpliqcd)) { msg_Tracking()<PossibleConfigsExist(m_maxcpliew,m_mincpliew)) { msg_Tracking()< cplmap; for (size_t j=0;jType()) { cplmap.clear(); if (checkloopmap && !NaiveMapping(links[j])) continue; if (checkloopmap==2 || m_pinfo.m_special.find("MapOff")!=std::string::npos) continue; if (m_allowmap && FlavCompare(links[j]) && p_ampl->CompareAmplitudes(links[j]->GetAmplitudeHandler(),m_sfactor,cplmap)) { if (p_hel->Compare(links[j]->GetHelicity(),m_nin+m_nout)) { m_sfactor = sqr(m_sfactor); msg_Tracking()<<"AMEGIC::Single_LOProcess::InitAmplitude : Found compatible process for "<Name()<gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+links[j]->Name(); string mnname = rpa->gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+Name(); if (FileExists(mlname+string(".map"))) { if (m_sfactor==1.) My_In_File::CopyInDB(mlname+".map",mnname+".map"); else { UpdateMappingFile(mlname,cplmap); CreateMappingFile((Single_LOProcess*)links[j]); } My_In_File::CopyInDB(mlname+".col",mnname+".col"); for (size_t i=0;i::const_iterator fit=p_ampl->GetFlavourmap().begin(); fit!=p_ampl->GetFlavourmap().end();fit++) AddtoFlavmap(fit->first,fit->second); InitFlavmap(p_partner); FillCombinations(); WriteAlternativeName(p_partner->Name()); m_iresult = p_partner->Result()*m_sfactor; Minimize(); return 1; } } } } if (directload) { p_ampl->CompleteLibAmplitudes(m_nin+m_nout,m_ptypename+string("/")+m_name, m_ptypename+string("/")+m_libname,127,127, &m_flavs.front()); if (p_partner==this) links.push_back(this); if (!p_shand->SearchValues(m_gen_str,m_libname,p_BS)) return 0; if (!TestLib()) return 0; FillCombinations(); Minimize(); return 1; } p_ampl->CompleteAmplitudes(m_nin+m_nout,&m_flavs.front(),p_b,&m_pol, top,p_BS,m_ptypename+string("/")+m_name,127,127); m_pol.Add_Extern_Polarisations(p_BS,&m_flavs.front(),p_hel); p_BS->Initialize(); FillCombinations(); int result(Tests()); switch (result) { case 2 : if (p_partner==this) links.push_back(this); Minimize(); WriteAlternativeName(p_partner->Name()); return 1; case 1 : if (p_partner==this) links.push_back(this); if (CheckLibraries()) return 1; for (size_t j=0;jType()) { if (links[j]->NewLibs()) { if (CheckStrings((Single_LOProcess*)links[j])) return 1; } } if (p_partner!=this) links.push_back(this); if (m_gen_str<2) return 1; if (p_partner!=this) { msg_Tracking()<<"AMEGIC::Single_LOProcess::InitAmplitude : "<Name()<<" did not fit."<0.) SetUpIntegrator(); return 1; case -3: return -1; default : msg_Error()<<"ERROR in AMEGIC::Single_LOProcess::InitAmplitude : "< & links, vector & errs, std::vector* epol, std::vector * pfactors) { DEBUG_FUNC("real"); m_type = 10; model->p_model->GetCouplings(m_cpls); m_name+= "__S"+ToString((int)m_emit)+"_"+ToString((int)m_spect) +"_"+ToString(m_stype); // FIXMEforQED if (m_flavs[m_emit].IsGluon() || m_flavs[m_emit].IsPhoton()) { p_pl[m_emit]=Pol_Info(); p_pl[m_emit].Init(2); p_pl[m_emit].pol_type = 'e'; p_pl[m_emit].type[0] = 90; p_pl[m_emit].type[1] = 91; p_pl[m_emit].factor[0] = 1.; p_pl[m_emit].factor[1] = 1.; } m_epol.resize(epol->size()); for (size_t i=0;isize();i++) m_epol[i]=(*epol)[i]; if (CheckAlternatives(links,Name())) return 1; p_hel = new Helicity(m_nin,m_nout,&m_flavs.front(),p_pl); bool directload = true; Scoped_Settings amegicsettings{ Settings::GetMainSettings()["AMEGIC"] }; if (amegicsettings["ME_LIBCHECK"].Get()) { msg_Info()<<"Enforce full library check. This may take some time." <gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+m_libname; string hstr2=rpa->gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+m_name+".map"; p_BS = new Basic_Sfuncs(m_nin+m_nout,m_nin+m_nout,&m_flavs.front(),p_b,hstr,hstr2); } else p_BS = new Basic_Sfuncs(m_nin+m_nout,m_nin+m_nout,&m_flavs.front(),p_b); p_BS->Setk0(s_gauge); p_BS->SetEPol(&m_epol); p_shand = new String_Handler(m_gen_str,p_BS,model->p_model->GetCouplings()); const bool cvp{ amegicsettings["CUT_MASSIVE_VECTOR_PROPAGATORS"].Get() }; p_ampl = new Amplitude_Handler(m_nin+m_nout,&m_flavs.front(),p_b,p_pinfo,model,top,m_maxcpl,m_mincpl, m_pinfo.m_ntchan,m_pinfo.m_mtchan, &m_cpls,p_BS,p_shand,m_print_graphs,!directload,cvp,m_ptypename+"/"+m_libname); if (p_ampl->GetGraphNumber()==0) { msg_Tracking()<PossibleConfigsExist(m_maxcpl,m_mincpl)) { msg_Tracking()<(links[j]); if (m_emit!=pp->m_emit || m_spect!=pp->m_spect || p_sub->m_ijt!=pp->p_sub->m_ijt || p_sub->m_kt!=pp->p_sub->m_kt || p_sub->m_i!=pp->p_sub->m_i || p_sub->m_j!=pp->p_sub->m_j || p_sub->m_k!=pp->p_sub->m_k) continue; if (m_allowmap && FlavCompare(links[j]) && p_ampl->CompareAmplitudes(links[j]->GetAmplitudeHandler(),m_sfactor,cplmap)) { if (p_hel->Compare(links[j]->GetHelicity(),m_nin+m_nout)) { m_sfactor = sqr(m_sfactor); msg_Tracking()<Name()<gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+links[j]->Name(); string mnname = rpa->gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+Name(); msg_Debugging()<(links[j]); for (std::map::const_iterator fit=p_ampl->GetFlavourmap().begin(); fit!=p_ampl->GetFlavourmap().end();fit++) AddtoFlavmap(fit->first,fit->second); InitFlavmap(p_partner); FillCombinations(); WriteAlternativeName(p_partner->Name()); m_iresult = p_partner->Result()*m_sfactor; Minimize(); return 1; } } } } if (directload) { p_ampl->CompleteLibAmplitudes(m_nin+m_nout,m_ptypename+string("/")+m_name, m_ptypename+string("/")+m_libname, em,sp,&m_flavs.front()); if (p_partner==this) links.push_back(this); if (!p_shand->SearchValues(m_gen_str,m_libname,p_BS)) return 1; if (!TestLib(pfactors)) return 0; FillCombinations(); Minimize(); return 1; } p_ampl->CompleteAmplitudes(m_nin+m_nout,&m_flavs.front(),p_b,&m_pol, top,p_BS,m_ptypename+string("/")+m_name, em,sp); m_pol.Add_Extern_Polarisations(p_BS,&m_flavs.front(),p_hel); p_BS->Initialize(); FillCombinations(); int tr=Tests(pfactors); switch (tr) { case 2 : if (p_partner==this) links.push_back(this); return 1; case 1 : case 100 : if (Result()==0.) { CreateMappingFile(this); return 0; } if (p_partner==this) links.push_back(this); if (CheckLibraries(pfactors)) return 1; for (size_t j=0;jType()) { if (links[j]->NewLibs()) { if (CheckStrings((Single_LOProcess*)links[j],pfactors)) return 1; } } if (p_partner!=this) links.push_back(this); if (m_gen_str<2) return 1; if (p_partner!=this) { msg_Tracking()<<"Single_LOProcess::InitAmplitude : "<Name()<<" did not fit."< * pfactors) { int number = 1; int gauge_test = 1; int string_test = 1; /* --------------------------------------------------- The reference result for momenta moms --------------------------------------------------- */ string testname = string(""); int fmfbnl=0; if (FoundMappingFile(testname,m_pslibname)) { if (testname != string("")) { if (FoundLib(testname)) gauge_test = string_test = 0; else fmfbnl=99; } } if (gauge_test) p_shand->Initialize(p_ampl->GetRealGraphNumber(),p_hel->MaxHel()); p_ampl->SetStringOff(); double M2 = 0.; double helvalue; std::vector epol; for (size_t i=0;i0) for (size_t i=0;iSetk0(0); p_BS->CalcEtaMu(p_testmoms); if (m_epol.size()==0) p_BS->InitGaugeTest(.9); msg_Info()<<"Single_LOProcess::Tests for "<MaxHel();i++) { if (p_hel->On(i)) { helvalue = p_ampl->Differential(i,(*p_hel)[i])*p_hel->PolarizationFactor(i); if (pfactors) helvalue*=(double)(*pfactors)[p_hel->GetEPol(i)-90]; M2 += helvalue; } } M2 *= sqr(m_pol.Massless_Norm(m_nin+m_nout,&m_flavs.front(),p_BS)); m_iresult = M2; } for (size_t i=0;iClearCalcList(); // To prepare for the string test. p_ampl->SetStringOn(); (p_shand->Get_Generator())->Reset(1); /* --------------------------------------------------- First test : gauge test --------------------------------------------------- */ p_BS->Setk0(s_gauge); p_BS->CalcEtaMu(p_testmoms); number++; if (!gauge_test) p_ampl->SetStringOff(); //second test without string production double M2g = 0.; double * M_doub = new double[p_hel->MaxHel()]; // Calculate the squared amplitude of the polarisation states. If a certain // external polarisation combination is found not to contribute for the // point in phase space tested, it is assumed that is doesn�t contribute at // all and is switched off. for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { M_doub[i] = p_ampl->Differential(i,(*p_hel)[i])*p_hel->PolarizationFactor(i); if (pfactors) M2g+= M_doub[i]*(double)(*pfactors)[p_hel->GetEPol(i)-90]; else M2g+= M_doub[i]; } } //shorten helicities int switchhit = 0; for (size_t i=0;iMaxHel();i++) { if (M_doub[i]==0.) { #ifdef FuckUp_Helicity_Mapping p_hel->SwitchOff(i); switchhit++; #endif } } msg_Tracking()<<"Single_LOProcess::Tests for "<ClearCalcList(); p_ampl->FillCoupling(p_shand); p_ampl->KillZList(); p_BS->StartPrecalc(); if (gauge_test) { if (!ATOOLS::IsEqual(M2,M2g)) { msg_Info()<<"WARNING: Gauge test not satisfied: " <SearchValues(m_gen_str,testname,p_BS)) { p_shand->Initialize(p_ampl->GetRealGraphNumber(),p_hel->MaxHel()); (p_shand->Get_Generator())->Reset(); // Get a cross section from the operator() method to compare with M2g later on. p_hel->ForceNoTransformation(); p_BS->CalcEtaMu((ATOOLS::Vec4D*)p_testmoms); p_hel->InitializeSpinorTransformation(p_BS); p_shand->Calculate(); for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { double help = p_ampl->Differential(i)*p_hel->Multiplicity(i)*p_hel->PolarizationFactor(i); if (pfactors) M2 += help*(*pfactors)[p_hel->GetEPol(i)-90]; else M2 += help; } } p_hel->AllowTransformation(); } else { string searchfilename = rpa->gen.Variable("SHERPA_CPP_PATH")+string("/Process/Amegic/")+m_ptypename+string("/")+testname+string("/V.H"); if (FileExists(searchfilename,1)) { msg_Error()<<"ERROR in Single_LOProcess::Tests()"<gen.Variable("SHERPA_CPP_PATH")<<"'." <gen.Variable("SHERPA_SHARE_PATH")+"/makelibs", rpa->gen.Variable("SHERPA_CPP_PATH")); THROW(normal_exit,"Failed to load library."); } else { msg_Error()<<"ERROR in Single_LOProcess::Tests()"<rpa->gen.Accu()) { msg_Info()<<"WARNING: Library cross check not satisfied: " <MaxHel();i++) { if (p_hel->On(i)) { for (size_t j=i+1;jMaxHel();j++) { if (p_hel->On(j)) { #ifdef FuckUp_Helicity_Mapping if (ATOOLS::IsEqual(M_doub[i],M_doub[j])) { p_hel->SwitchOff(j); p_hel->SetPartner(i,j); p_hel->IncMultiplicity(i); } #endif } } } } } else { for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { for (size_t j=i+1;jMaxHel();j++) { if (p_hel->On(j)) { #ifdef FuckUp_Helicity_Mapping if (ATOOLS::IsEqual(M_doub[i]*(*pfactors)[p_hel->GetEPol(i)-90],M_doub[j]*(*pfactors)[p_hel->GetEPol(j)-90])) { p_hel->SwitchOff(j); p_hel->SetPartner(i,j); p_hel->IncMultiplicity(i); } #endif } } } } for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { for (size_t j=i+1;jMaxHel();j++) { if (p_hel->On(j)) { #ifdef FuckUp_Helicity_Mapping if (ATOOLS::IsEqual(M_doub[i],M_doub[j]) && p_hel->Multiplicity(i)==p_hel->Multiplicity(j)) { p_hel->SwitchOff(j); p_hel->SetPartner(i,j); p_hel->IncMultiplicity(i,p_hel->GetEPol(j)*1024); } #endif } } } } } delete[] M_doub; p_shand->Complete(p_hel); if (p_shand->Is_String()) { double M2S = 0.; p_shand->Calculate(); for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { double multi = (p_hel->Multiplicity(i)%1024); if (pfactors) { if (p_hel->Multiplicity(i)<1024) multi*=(*pfactors)[p_hel->GetEPol(i)-90]; else multi*=(*pfactors)[p_hel->GetEPol(i)-90]+(*pfactors)[p_hel->Multiplicity(i)/1024-90]; } M2S += p_ampl->Differential(i)*p_hel->PolarizationFactor(i)*multi; } } M2S *= sqr(m_pol.Massless_Norm(m_nin+m_nout,&m_flavs.front(),p_BS)); if (!ATOOLS::IsEqual(M2g,M2S)) { msg_Info()<<"WARNING: String test not satisfied: " <rpa->gen.Accu()) { THROW(critical_error,"Check output above. Increase NUM_ACCURACY if you wish to skip this test."); } msg_Info()<<" assuming numerical reasons, continuing "< * pfactors) { double M2(0.); double * M_doub = new double[p_hel->MaxHel()]; p_BS->CalcEtaMu((ATOOLS::Vec4D*)p_testmoms); p_hel->InitializeSpinorTransformation(p_BS); p_shand->Calculate(); for (size_t i=0;iMaxHel();i++) { M_doub[i] = p_ampl->Differential(i)*p_hel->Multiplicity(i)*p_hel->PolarizationFactor(i); if (IsNan(M_doub[i])) { msg_Error()<GetEPol(i)-90]; else M2 += M_doub[i]; } for (size_t i=0;iMaxHel();i++) { if (M_doub[i]==0.) { #ifdef FuckUp_Helicity_Mapping p_hel->SwitchOff(i); #endif } } if (!(rpa->gen.SoftSC()||rpa->gen.HardSC())) { if (m_emit==m_spect) { for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { for (size_t j=i+1;jMaxHel();j++) { if (p_hel->On(j)) { #ifdef FuckUp_Helicity_Mapping if (ATOOLS::IsEqual(M_doub[i],M_doub[j])) { p_hel->SwitchOff(j); p_hel->SetPartner(i,j); p_hel->IncMultiplicity(i); } #endif } } } } } else { for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { for (size_t j=i+1;jMaxHel();j++) { if (p_hel->On(j)) { #ifdef FuckUp_Helicity_Mapping if (ATOOLS::IsEqual(M_doub[i]*(*pfactors)[p_hel->GetEPol(i)-90],M_doub[j]*(*pfactors)[p_hel->GetEPol(j)-90])) { p_hel->SwitchOff(j); p_hel->SetPartner(i,j); p_hel->IncMultiplicity(i); } #endif } } } } for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { for (size_t j=i+1;jMaxHel();j++) { if (p_hel->On(j)) { #ifdef FuckUp_Helicity_Mapping if (ATOOLS::IsEqual(M_doub[i],M_doub[j]) && p_hel->Multiplicity(i)==p_hel->Multiplicity(j)) { p_hel->SwitchOff(j); p_hel->SetPartner(i,j); p_hel->IncMultiplicity(i,p_hel->GetEPol(j)*1024); } #endif } } } } } } delete[] M_doub; m_iresult = M2 * sqr(m_pol.Massless_Norm(m_nin+m_nout,&m_flavs.front(),p_BS)); if (m_iresult>0. || m_iresult<0.) return 1; return 0; } int Single_LOProcess::CheckLibraries(std::vector * pfactors) { if (m_gen_str==0) return 1; if (p_shand->IsLibrary()) return 1; msg_Info()<Get_Generator()); string testname; double M2s, helvalue; for (;;) { testname = CreateLibName(); if (shand1->SearchValues(m_gen_str,testname,p_BS)) { shand1->Calculate(); M2s = 0.; for (size_t i=0;iMaxHel();i++) { double multi = (p_hel->Multiplicity(i)%1024); if (pfactors) { if (p_hel->Multiplicity(i)<1024) multi*=(*pfactors)[p_hel->GetEPol(i)-90]; else multi*=(*pfactors)[p_hel->GetEPol(i)-90]+(*pfactors)[p_hel->Multiplicity(i)/1024-90]; } helvalue = p_ampl->Differential(shand1,i) * p_hel->PolarizationFactor(i); M2s += helvalue * multi; } M2s *= sqr(m_pol.Massless_Norm(m_nin+m_nout,&m_flavs.front(),p_BS)); if (ATOOLS::IsEqual(M2s,Result())) { m_libname = testname; m_pslibname = testname; if (shand1) { delete shand1; shand1 = 0; } //Clean p_shand!!!! // Minimize(); CreateMappingFile(this); return 1; } } else break; } if (shand1) { delete shand1; shand1 = 0; } return 0; } int Single_LOProcess::CheckStrings(Single_LOProcess* tproc,std::vector * pfactors) { if (tproc->LibName().find(CreateLibName())!=0) return 0; String_Handler * shand1; shand1 = new String_Handler(p_shand->Get_Generator(), (tproc->GetStringHandler())->GetSKnots()); (shand1->Get_Generator())->ReplaceZXlist((tproc->GetStringHandler())->Get_Generator()); double M2s, helvalue; shand1->Calculate(); M2s = 0.; for (size_t i=0;iMaxHel();i++) { double multi = (p_hel->Multiplicity(i)%1024); if (pfactors) { if (p_hel->Multiplicity(i)<1024) multi*=(*pfactors)[p_hel->GetEPol(i)-90]; else multi*=(*pfactors)[p_hel->GetEPol(i)-90]+(*pfactors)[p_hel->Multiplicity(i)/1024-90]; } helvalue = p_ampl->Differential(shand1,i) * p_hel->PolarizationFactor(i); M2s += helvalue * multi; } M2s *= sqr(m_pol.Massless_Norm(m_nin+m_nout,&m_flavs.front(),p_BS)); (shand1->Get_Generator())->ReStore(); delete shand1; if (ATOOLS::IsEqual(M2s,Result())) { m_libname = tproc->LibName(); m_pslibname = tproc->PSLibName(); // Minimize(); CreateMappingFile(this); return 1; } return 0; } void Single_LOProcess::WriteLibrary() { if (m_gen_str<2) return; string newpath=rpa->gen.Variable("SHERPA_CPP_PATH")+string("/Process/Amegic/"); m_libname = CreateLibName(); if (p_partner==this) m_pslibname = m_libname; else m_pslibname = p_partner->PSLibName(); if (!FileExists(newpath+m_ptypename+string("/")+m_libname+string("/V.H"),1)) { ATOOLS::MakeDir(newpath+m_ptypename+"/"+m_libname,true); p_shand->Output(p_hel,m_ptypename+string("/")+m_libname); } CreateMappingFile(this); p_BS->Output(newpath+m_ptypename+string("/")+m_libname); p_ampl->StoreAmplitudeConfiguration(newpath+m_ptypename+string("/")+m_libname); m_newlib=true; if (!FileExists(rpa->gen.Variable("SHERPA_CPP_PATH")+"/makelibs",1)) Copy(rpa->gen.Variable("SHERPA_SHARE_PATH")+"/makelibs", rpa->gen.Variable("SHERPA_CPP_PATH")+"/makelibs"); msg_Info()<<"AMEGIC::Single_Process::WriteLibrary : "<gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+m_name+".map"; if (FileExists(outname)) { string MEname,PSname; FoundMappingFile(MEname,PSname); if (MEname != m_libname || PSname != m_pslibname) { msg_Error()<<"ERROR in Single_LOProcess::CreateMappingFile() :"<Get_Generator()->WriteCouplings(*to); } else { *to<<"ME: 0"<gen.Variable("SHERPA_CPP_PATH")+"/Process/Amegic/"+m_ptypename+"/"+m_name+".map"; if (FileExists(outname)) { My_In_File from(outname); from.Open(); getline(*from,buf); pos = buf.find(string("ME:")); if (pos==-1) MEname = PSname = buf; else { MEname = buf.substr(pos+4); getline(*from,buf); pos = buf.find(string("PS:")); if (pos==-1) PSname = MEname; else PSname = buf.substr(pos+4); if (PSname==string("")) PSname = MEname; } return 1; } return 0; } bool Single_LOProcess::FoundLib(std::string& pID) { std::string libname=ATOOLS::rpa->gen.Variable("SHERPA_LIB_PATH")+ std::string("/libProc_P")+pID.substr(1)+std::string(LIB_SUFFIX); if (FileExists(libname,1)) return 1; return 0; } void AMEGIC::Single_LOProcess::UpdateMappingFile(std::string name, map & cmap) { std::string buf; int pos; name+=".map"; My_In_File from(name); from.Open(); getline(*from,buf); pos = buf.find(string("ME:")); if (pos==-1) m_libname = m_pslibname = buf; else { m_libname = buf.substr(pos+4); getline(*from,buf); pos = buf.find(string("PS:")); if (pos==-1) m_pslibname = m_libname; else m_pslibname = buf.substr(pos+4); if (m_pslibname==string("")) m_pslibname = m_libname; } p_shand->Get_Generator()->ReadCouplings(*from); from.Close(); p_shand->Get_Generator()->UpdateCouplings(cmap); } bool AMEGIC::Single_LOProcess::CompareTestMoms(const ATOOLS::Vec4D* p) { for (size_t i=0;iMaxOrders(); m_mincpl = p_partner->MinOrders(); } bool Single_LOProcess::CheckIQCDMappability() const { if (!(m_stype&sbt::qcd)) return true; if (!p_partner || p_partner==this) THROW(fatal_error,"Invalid call."); if (m_partonlistqcd!=p_partner->Get() ->PartonListQCD()) THROW(fatal_error,"Mapped processes with different QCD parton lists."); DEBUG_FUNC(Name()<<" -> "<Name()); for (size_t i(0);iFlavours()[m_partonlistqcd[i]].StrongCharge()) { msg_Debugging()<<"QCD charges differ: " <Flavours()[m_partonlistqcd[i]] <<" ==> I_QCD not mappable"<Get() ->PartonListQED()) THROW(fatal_error,"Mapped processes with different QCD parton lists."); DEBUG_FUNC(Name()<<" -> "<Name()); for (size_t i(0);iFlavours()[m_partonlistqed[i]].Charge()) { msg_Debugging()<<"QED charges differ: " <Flavours()[m_partonlistqed[i]] <<" ==> I_QED not mappable"< flavcount; for (size_t i(m_nin);i::const_iterator it(m_flavrestrictions.begin()); it!=m_flavrestrictions.end();++it) { if (it->first==((int)m_flavs[i])) { msg_Debugging()<<"Found restrictions for "<first)==flavcount.end()) flavcount[it->first]=1; else flavcount[it->first]+=1; } } } if (msg_LevelIsDebugging()) { for (std::map::const_iterator it=flavcount.begin(); it!=flavcount.end();++it) msg_Out()<first<<": "<second<::const_iterator it(m_flavrestrictions.begin()); it!=m_flavrestrictions.end();++it) { if (flavcount.find(it->first)==m_flavrestrictions.end()) return false; else if (flavcount[it->first]!=it->second) return false; } } return true; } /*---------------------------------------------------------------------------- Calculating total cross sections ----------------------------------------------------------------------------*/ double Single_LOProcess::Partonic(const Vec4D_Vector& _moms, Variations_Mode varmode, int mode) { return 0.0; } double Single_LOProcess::operator()(const ATOOLS::Vec4D_Vector &labmom, const ATOOLS::Vec4D *mom, std::vector * pfactors, std::vector* epol, const int mode) { if (p_partner!=this) { return m_lastxs = p_partner->operator()(labmom,mom,pfactors,epol,mode) *m_sfactor; } DEBUG_FUNC(m_name); double M2(0.); p_int->SetMomenta(labmom); p_scale->CalculateScale(labmom,m_cmode); for (size_t i=0;iCalcEtaMu((ATOOLS::Vec4D*)mom); p_hel->InitializeSpinorTransformation(p_BS); if (p_shand->Is_String()) { p_shand->Calculate(); for (size_t i=0;iMaxHel();i++) { if (p_hel->On(i)) { double multi = (p_hel->Multiplicity(i)%1024); if (p_hel->Multiplicity(i)<1024) multi*=(*pfactors)[p_hel->GetEPol(i)-90]; else multi*=(*pfactors)[p_hel->GetEPol(i)-90] +(*pfactors)[p_hel->Multiplicity(i)/1024-90]; double mh=p_ampl->Differential(i); M2 += mh * multi * p_hel->PolarizationFactor(i); } } } m_lastxs = M2; return M2; } void Single_LOProcess::FillAmplitudes(vector& amps, std::vector >& cols) { if (p_partner==this) p_ampl->FillAmplitudes(amps, cols, p_hel, 1.0); else p_partner->FillAmplitudes(amps, cols, sqrt(m_sfactor)); } void Single_LOProcess::FillAmplitudes(vector& amps, std::vector >& cols, double sfactor) { if (p_partner==this) p_ampl->FillAmplitudes(amps, cols, p_hel, sfactor); else p_partner->FillAmplitudes(amps, cols, sfactor*sqrt(m_sfactor)); } double Single_LOProcess::Calc_M2ik(const int& ci, const int& ck, const std::vector& maxcpl, const std::vector& mincpl) { DEBUG_FUNC(ci<<" "<MaxHel();i++) { if (p_hel->On(i)) { msg_Debugging()<Differential(i,ci,ck,maxcpl,mincpl)<<" * " <Multiplicity(i)<<" * " <PolarizationFactor(i)<Differential(i,ci,ck,maxcpl,mincpl) * p_hel->Multiplicity(i) * p_hel->PolarizationFactor(i); } } msg_Debugging()<<"-> M2="< > &dsijqcd, std::vector > &dsijqed, const int mode) { DEBUG_FUNC("QCD: ("<Calc_AllXS(labmom,mom,dsijqcd,dsijqed,mode); if (dsijqcd.size()) dsijqcd[0][0]*=m_sfactor; if (dsijqed.size()) dsijqed[0][0]*=m_sfactor; for (size_t i=0;iSetMomenta(labmom); p_scale->CalculateScale(labmom,m_cmode); p_BS->CalcEtaMu((ATOOLS::Vec4D*)mom); p_hel->InitializeSpinorTransformation(p_BS); if (p_shand->Is_String()) { p_shand->Calculate(); if (dsijqcd.size()) dsijqcd[0][0] = Calc_M2ik(0,0,m_maxcpliqcd,m_mincpliqcd); if (dsijqed.size()) dsijqed[0][0] = Calc_M2ik(0,0,m_maxcpliew,m_mincpliew); for (size_t i=0;iGetStringHandler(); } Amplitude_Handler *AMEGIC::Single_LOProcess::GetAmplitudeHandler() { if (p_partner==this) return p_ampl; return p_partner->GetAmplitudeHandler(); } Helicity *AMEGIC::Single_LOProcess::GetHelicity() { if (p_partner==this) return p_hel; return p_partner->GetHelicity(); } int AMEGIC::Single_LOProcess::NumberOfDiagrams() { if (p_partner==this) return p_ampl->GetGraphNumber(); return p_partner->NumberOfDiagrams(); } Point * AMEGIC::Single_LOProcess::Diagram(int i) { if (p_partner==this) return p_ampl->GetPointlist(i); return p_partner->Diagram(i); } void Single_LOProcess::AddChannels(std::list* tlist) { } void AMEGIC::Single_LOProcess::FillCombinations (Point *const p,size_t &id) { if (p->middle) return; if (p->left==NULL || p->right==NULL) { id=1<number; return; } size_t ida(id), idb(id); FillCombinations(p->left,ida); FillCombinations(p->right,idb); id=ida+idb; size_t idc((1<<(m_nin+m_nout))-1-id); #ifdef DEBUG__Fill_Combinations msg_Debugging()<<" comb "<(ida,idb)); m_ccombs.insert(std::pair(idb,ida)); m_ccombs.insert(std::pair(idb,idc)); m_ccombs.insert(std::pair(idc,idb)); m_ccombs.insert(std::pair(idc,ida)); m_ccombs.insert(std::pair(ida,idc)); if (idc!=1) { bool in(false); Flavour fl(ReMap(p->fl,p->GetPropID())); Flavour_Vector cf(m_cflavs[id]); for (size_t i(0);i "<number); FillCombinations(p,id); } #ifdef DEBUG__Fill_Combinations msg_Debugging()<<" } -> "<(idi,idj))); return cit!=m_ccombs.end(); } const Flavour_Vector &AMEGIC::Single_LOProcess:: CombinedFlavour(const size_t &idij) { CFlavVector_Map::const_iterator fit(m_cflavs.find(idij)); if (fit==m_cflavs.end()) THROW(fatal_error,"Invalid request"); return fit->second; } std::string AMEGIC::Single_LOProcess::CreateLibName() { DEBUG_FUNC(m_name<<": "< "<=0) name+="__E"+ToString(m_emit); return name; }