#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 "PHASIC++/Main/Process_Integrator.H" #include "PHASIC++/Process/Process_Base.H" #include "PHASIC++/Selectors/Selector.H" #include #include namespace PHASIC { class Isolation_Selector : public Selector_Base { private: double m_dR,m_exp,m_emax; double m_ptmin,m_etmin,m_etamin,m_etamax,m_ymin,m_ymax; size_t m_nmin, m_nmax; ATOOLS::Flavour m_iflav; ATOOLS::Flavour_Vector m_rejflav; kf_code m_outisokf; bool m_removeiso,m_removenoniso; double Chi(double eg,double dr); double DR(const ATOOLS::Vec4D & p1,const ATOOLS::Vec4D & p2); double DEta12(const ATOOLS::Vec4D &,const ATOOLS::Vec4D &); double DPhi12(const ATOOLS::Vec4D &,const ATOOLS::Vec4D &); public: Isolation_Selector(const Selector_Key &key); ~Isolation_Selector(); bool Trigger(ATOOLS::Selector_List &sl); void BuildCuts(Cut_Data *); }; } using namespace PHASIC; using namespace ATOOLS; class edr { public: double E; double dr; edr(double _e,double _dr) : E(_e), dr(_dr) {} }; class Order_edr { public: int operator()(const edr a, const edr b); }; int Order_edr::operator()(const edr a, const edr b) { if (a.dr::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_iflav(Flavour(kf_none)), m_outisokf(kf_none), m_removeiso(false), m_removenoniso(false) { DEBUG_FUNC(""); auto s = key.m_settings["Isolation_Selector"]; auto kfc = s["Isolation_Particle"].SetDefault(kf_none).Get(); m_iflav = Flavour(abs(kfc), kfc<0); auto kfcs = s["Rejection_Particles"] .SetDefault(std::vector()) .GetVector(); for (const auto rejkfc : kfcs) if (rejkfc != kf_none) m_rejflav.push_back(Flavour(abs(rejkfc), rejkfc<0)); m_outisokf = s["Output_ID"].SetDefault(kf_none).Get(); m_removeiso = s["Remove_Isolated"].SetDefault(false).Get(); m_removenoniso = s["Remove_Nonisolated"].SetDefault(false).Get(); auto isolation = s["Isolation_Parameters"]; m_dR = isolation["R"].SetDefault(0.0).Get(); m_emax = isolation["EMAX"].SetDefault(0.0).Get(); m_exp = isolation["EXP"].SetDefault(0.0).Get(); m_ptmin = isolation["PT"].SetDefault(0.0).Get(); m_etmin = isolation["ET"].SetDefault(0.0).Get(); const auto eta = isolation["ETA"] .SetDefault(std::numeric_limits::max()) .Get(); m_etamax = isolation["ETAMAX"].SetDefault(eta).Get(); m_etamin = isolation["ETAMIN"].SetDefault(-eta).Get(); const auto y = isolation["Y"] .SetDefault(std::numeric_limits::max()) .Get(); m_ymax = isolation["YMAX"].SetDefault(y).Get(); m_ymin = isolation["YMIN"].SetDefault(-y).Get(); // jet numbers m_nmin = s["NMin"].SetDefault(0).Get(); m_nmax = s["NMax"] .SetDefault(std::numeric_limits::max()) .Get(); ReadInSubSelectors(key); for (int i=m_nin;im_nmax) THROW(fatal_error,"Inconsistent setup."); if (msg_LevelIsDebugging()) { msg_Out()<<"Isolation particles:"<"<"<Name()< vfsub; for (size_t i=m_nin;i *const vf(&vfsub); std::vector vfiso(vf->size(),false); size_t cnt(0); msg_Debugging()<<"trying to find "<size()<size();k++) { size_t idx((*vf)[k]); if ((m_ptmin==0. || sl[idx].Momentum().PPerp()>m_ptmin) && (m_etmin==0. || sl[idx].Momentum().MPerp()>m_etmin) && (m_etamin==-std::numeric_limits::max() || sl[idx].Momentum().Eta()>m_etamin) && (m_etamax==std::numeric_limits::max() || sl[idx].Momentum().Eta()::max() || sl[idx].Momentum().Y()>m_ymin) && (m_ymax==std::numeric_limits::max() || sl[idx].Momentum().Y() edrlist; for (size_t i=m_nin;i0) { std::stable_sort(edrlist.begin(),edrlist.end(),Order_edr()); double etot(0.); for (size_t i=0;iHit(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 Isolation_Selector::BuildCuts(Cut_Data * cuts) { if (m_isnlo) return; double sumM2(0.); for (int i=m_nin;i0.) { cuts->energymin[i] = Max(sqrt(sqr(m_ptmin)+sqr(p_fl[i].SelMass())), cuts->energymin[i]); } if (m_etmin>0.) { cuts->energymin[i] = Max(sqrt(sqr(m_etmin)+sqr(p_fl[i].SelMass())), cuts->energymin[i]); } } } for (size_t i(0);iBuildCuts(cuts); } double Isolation_Selector::Chi(double eg,double dr) { if (m_exp<0.) return 0.;//rpa->gen.Ecms(); else if (m_exp==0.) return eg*m_emax; else if (m_exp==1.) return eg*m_emax*(1.-cos(dr))/(1.-cos(m_dR)); else if (m_exp==2.) return eg*m_emax*sqr((1.-cos(dr))/(1.-cos(m_dR))); else return eg*m_emax*pow((1.-cos(dr))/(1.-cos(m_dR)),m_exp); } double Isolation_Selector::DR(const Vec4D & p1,const Vec4D & p2) { return sqrt(sqr(DEta12(p1,p2)) + sqr(DPhi12(p1,p2))); } double Isolation_Selector::DEta12(const Vec4D & p1,const Vec4D & p2) { // eta1,2 = -log(tan(theta_1,2)/2) double c1=p1[3]/Vec3D(p1).Abs(); double c2=p2[3]/Vec3D(p2).Abs(); return 0.5 *log( (1 + c1)*(1 - c2)/((1-c1)*(1+c2))); } double Isolation_Selector::DPhi12(const Vec4D & p1,const Vec4D & p2) { double pt1=sqrt(p1[1]*p1[1]+p1[2]*p1[2]); double pt2=sqrt(p2[1]*p2[1]+p2[2]*p2[2]); return acos((p1[1]*p2[1]+p1[2]*p2[2])/(pt1*pt2)); } DECLARE_GETTER(Isolation_Selector,"Isolation_Selector", Selector_Base,Selector_Key); Selector_Base *ATOOLS::Getter::operator() (const Selector_Key &key) const { return new Isolation_Selector(key); } void ATOOLS::Getter:: PrintInfo(std::ostream &str,const size_t width) const { std::string w(width+4,' '); str<<"Isolation_Selector:\n" <\n" <, , ...]\n" <,\n" <,\n" <,\n" <,\n" <,\n" <\n" <\n" <\n" <\n" <