#include "ATOOLS/Math/Vector.H" #include "ATOOLS/Math/Poincare.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Phys/Flavour.H" #include "ATOOLS/Phys/Particle_List.H" #include "ATOOLS/Phys/Fastjet_Helpers.H" #include "PHASIC++/Main/Process_Integrator.H" #include "PHASIC++/Process/Process_Base.H" #include "PHASIC++/Selectors/Selector.H" namespace PHASIC { class Jet_Selector : public Selector_Base { std::string m_algo; double m_ptmin,m_R,m_f,m_etamin,m_etamax,m_ymin,m_ymax; size_t m_nmin, m_nmax, m_eekt; kf_code m_outjetkf; ATOOLS::Jet_Inputs m_jetinput; ATOOLS::Jet_Identifications m_jetids; fjcore::JetDefinition * p_jdef; public: Jet_Selector(const Selector_Key &key); ~Jet_Selector(); bool Trigger(ATOOLS::Selector_List &); void BuildCuts(Cut_Data *); }; } using namespace PHASIC; using namespace ATOOLS; /*--------------------------------------------------------------------- General form - flavours etc are unknown, will operate on a Particle_List. --------------------------------------------------------------------- */ Jet_Selector::Jet_Selector(const Selector_Key &key) : Selector_Base("Jet_Selector",key.p_proc), m_algo(""), m_ptmin(0.), m_R(0.), m_f(0.7), m_etamin(-std::numeric_limits::max()), m_etamax(std::numeric_limits::max()), m_ymin(-std::numeric_limits::max()), m_ymax(std::numeric_limits::max()), m_nmin(0), m_nmax(std::numeric_limits::max()), m_eekt(0), m_outjetkf(kf_none), p_jdef(NULL) { DEBUG_FUNC(""); bool ee(rpa->gen.Bunch(0).IsLepton() && rpa->gen.Bunch(1).IsLepton()); auto s = key.m_settings["Jet_Selector"]; // input ptcls and output ID for (auto inputsettings : s["Input_Particles"].GetItems()) { auto kfsetting = inputsettings.IsList() ? inputsettings.GetItemAtIndex(0) : inputsettings; const auto kfc = kfsetting.SetDefault(kf_none).Get(); if (kfc == kf_none) { THROW(fatal_error, "Invalid or missing particle ID for Input_Particles" " option given within the Jet_Selector settings."); } m_jetinput.push_back(Jet_Input(Flavour {kfc})); if (inputsettings.IsList()) { const auto num_ptcl_specific_settings = inputsettings.GetItemsCount(); for (size_t i {1}; i < num_ptcl_specific_settings; ++i) { auto ds = inputsettings.GetItemAtIndex(i).SetDefault("").Get(); if (ds.find("=")!=std::string::npos) ds.replace(ds.find("="),1,":"); std::string var(ds,0,ds.find(':')); std::string val(ds,ds.find(':')+1); if (!var.size() || !val.size()) THROW(fatal_error,"Input error."); if (var=="PT") m_jetinput.back().m_ptmin=ToType(val); else if (var=="ETA") m_jetinput.back().m_etamax=ToType(val); else if (var=="Y") m_jetinput.back().m_ymax=ToType(val); } } } m_outjetkf = s["Output_ID"].SetDefault(kf_none).Get(); // algorithm auto algosettings = s["Jet_Algorithm"]; m_algo = algosettings["Type"].SetDefault("").Get(); m_ptmin = algosettings["PT"].SetDefault(0.0).Get(); m_R = algosettings["R"].SetDefault(0.0).Get(); m_f = algosettings["f"].SetDefault(0.7).Get(); const auto eta = algosettings["Eta"] .SetDefault(std::numeric_limits::max()) .Get(); m_etamax = algosettings["EtaMax"].SetDefault(eta).Get(); m_etamin = algosettings["EtaMin"].SetDefault(-eta).Get(); const auto y = algosettings["Y"] .SetDefault(std::numeric_limits::max()) .Get(); m_ymax = algosettings["YMax"].SetDefault(y).Get(); m_ymin = algosettings["YMin"].SetDefault(-y).Get(); // identification const auto identifyas = s["Identify_As"] .SetDefault({}) .GetVector(); if (identifyas.size() > 1) { int kfc(ToType(identifyas[0])); Flavour fl(abs(kfc),kfc<0); std::string input(identifyas[1]), rel(""); if (input.find('>')!=std::string::npos) rel=">"; else if (input.find('<')!=std::string::npos) rel="<"; else THROW(not_implemented,"Unknown relation."); std::string var(input.substr(0,input.find(rel))); input=input.substr(input.find(rel)+1); std::string val(input.substr(0,input.find('['))); input=input.substr(input.find('[')+1); std::string mode(input.substr(0,input.find(']'))); double ptmin(0.),etmin(0.),emin(0.); if (var=="PT") ptmin=ToType(val); else if (var=="ET") etmin=ToType(val); else if (var=="E") emin=ToType(val); else THROW(not_implemented,"Unknown variable."); JetIdMode::code jetidmode(JetIdMode::unknown); if (rel==">") jetidmode|=JetIdMode::larger; if (mode=="rel") jetidmode|=JetIdMode::relative; m_jetids.push_back(new Jet_Identification(fl,ptmin,etmin,emin,jetidmode)); } // jet numbers m_nmin = s["NMin"].SetDefault(0).Get(); m_nmax = s["NMax"] .SetDefault(std::numeric_limits::max()) .Get(); ReadInSubSelectors(key); m_smin = sqr(m_ptmin*m_nmin); if (m_nmin>m_nmax) THROW(fatal_error,"Inconsistent setup."); if (msg_LevelIsDebugging()) { msg_Out()<<"Jet Algorithm: "<"<Name()<0) { delete *m_jetids.begin(); m_jetids.erase(m_jetids.begin()); } while (m_sels.size()>0) { delete *m_sels.begin(); m_sels.erase(m_sels.begin()); } } bool Jet_Selector::Trigger(Selector_List &sl) { size_t n(m_n); DEBUG_FUNC((p_proc?p_proc->Flavours():Flavour_Vector())); Vec4D_Vector moms(sl.size(),Vec4D(0.,0.,0.,0.)); for (size_t i(0);i input,jets; // book-keep where jet input was taken from std::vector jetinputidx; for (size_t i(m_nin);iHit(1-(n>=m_nmin && n<=m_nmax))); } size_t njets(0); std::vector > clusidjetmoms; for (size_t i(0);i >::iterator cjit(clusidjetmoms.begin()); cjit!=clusidjetmoms.end();) { bool assigned(false); if (cjit->first.Kfcode()!=kf_none) { for (size_t j(0);jfirst.Includes(sl[j].Flavour())) { moms[j]=cjit->second; jetinputidx.erase(std::remove(jetinputidx.begin(),jetinputidx.end(),j), jetinputidx.end()); clusidjetmoms.erase(cjit); assigned=true; break; } } } if (!assigned) ++cjit; } // if unidentified jets have kf_none, fill into remaining slots in jetinputidx if (clusidjetmoms.size()>jetinputidx.size()) THROW(fatal_error,"Too many jets left."); for (size_t i(0);i=m_nmin && njets<=m_nmax); if (!trigger) { msg_Debugging()<<"Point discarded by jet finder"<Hit(true); return false; } for (size_t k=0;kTrigger(sl)) { msg_Debugging()<<"Point discarded by subselector"<Hit(true); return false; } } msg_Debugging()<<"Point passed"<Hit(false); return true; } void Jet_Selector::BuildCuts(Cut_Data * cuts) { cuts->smin=Max(cuts->smin,m_smin); for (size_t i(0);iBuildCuts(cuts); } DECLARE_GETTER(Jet_Selector,"Jet_Selector",Selector_Base,Selector_Key); Selector_Base *ATOOLS::Getter::operator() (const Selector_Key &key) const { return new Jet_Selector(key); } void ATOOLS::Getter:: PrintInfo(std::ostream &str,const size_t width) const { std::string w(width+4,' '); str<<"Jet_Selector:\n" < [PT:] [ETA:] [Y:]\", ...]\n" <, PT: , R: ,\n" <, Y: \n" <, \"[E/ET/PT>[rel/abs]]\"]\n" <\n" <\n" <\n" <