File indexing completed on 2025-04-19 09:10:11
0001 #ifndef PHASIC_Process_Process_Base_H
0002 #define PHASIC_Process_Process_Base_H
0003
0004 #include "PHASIC++/Process/Process_Info.H"
0005 #include "PHASIC++/Selectors/Selector.H"
0006 #include "PHASIC++/Selectors/Cut_Data.H"
0007 #include "PHASIC++/Scales/Scale_Setter_Base.H"
0008 #include "PHASIC++/Scales/KFactor_Setter_Base.H"
0009 #include "ATOOLS/Phys/NLO_Subevt.H"
0010 #include "ATOOLS/Phys/Weight_Info.H"
0011 #include "ATOOLS/Org/CXXFLAGS.H"
0012
0013 namespace ATOOLS {
0014 class Cluster_Leg;
0015 class Cluster_Amplitude;
0016 class Histogram;
0017 struct Decay_Info;
0018 typedef std::vector<Decay_Info* > DecayInfo_Vector;
0019 struct Weight_Info;
0020 }
0021
0022 namespace BEAM { class Beam_Spectra_Handler; }
0023
0024 namespace PDF {
0025 class ISR_Handler;
0026 class Shower_Base;
0027 class NLOMC_Base;
0028 }
0029
0030 namespace METOOLS { class Spin_Amplitudes; }
0031
0032 namespace YFS { class YFS_Handler; }
0033
0034 namespace PHASIC {
0035
0036 typedef std::map<int,int> FMMap;
0037
0038 class Process_Integrator;
0039 class Phase_Space_Handler;
0040 class Phase_Space_Integrator;
0041 class Combined_Selector;
0042 class ME_Generator_Base;
0043
0044 class Process_Base;
0045 class BBar_Multi_Channel;
0046
0047 typedef std::vector<PHASIC::Process_Base*> Process_Vector;
0048
0049 typedef std::map<std::string,Process_Base*> StringProcess_Map;
0050
0051 typedef std::map<ATOOLS::nlo_type::code,StringProcess_Map*>
0052 NLOTypeStringProcessMap_Map;
0053
0054 struct Color_Matrix {
0055 std::vector<std::vector<int> > m_perms;
0056 std::vector<std::vector<double> > m_colfacs;
0057 };
0058
0059 class Process_Base {
0060 protected:
0061
0062 Process_Base *p_parent, *p_selected, *p_mapproc, *p_sproc, *p_caller;
0063 Process_Integrator *p_int;
0064 Combined_Selector *p_selector;
0065 Cut_Data *p_cuts;
0066 ME_Generator_Base *p_gen;
0067
0068 PDF::Shower_Base *p_shower;
0069 PDF::NLOMC_Base *p_nlomc;
0070
0071 BBar_Multi_Channel *p_mc;
0072
0073 Scale_Setter_Base *p_scale;
0074 KFactor_Setter_Base *p_kfactor;
0075
0076 size_t m_nin, m_nout, m_mcmode, m_cmode;
0077 std::string m_name, m_resname;
0078
0079 std::vector<double> m_maxcpl, m_mincpl;
0080
0081 ATOOLS::Flavour_Vector m_flavs;
0082 Process_Info m_pinfo;
0083 ATOOLS::DecayInfo_Vector m_decins;
0084
0085 ATOOLS::ME_Weight_Info m_mewgtinfo;
0086
0087 ATOOLS::Weights_Map m_last, m_lastb;
0088 double m_symfac, m_issymfac;
0089 bool m_lookup, m_use_biweight;
0090
0091 bool m_hasinternalscale;
0092 double m_internalscale;
0093 MODEL::Coupling_Map m_cpls;
0094
0095 NLOTypeStringProcessMap_Map *p_apmap;
0096
0097 Color_Matrix m_cols;
0098
0099 static int s_usefmm;
0100
0101 static void SortFlavours(Subprocess_Info &info,FMMap *const fmm=0);
0102 static void SortFlavours(std::vector<ATOOLS::Cluster_Leg*> &legs,
0103 FMMap *const fmm=0);
0104
0105 public:
0106
0107 Process_Base();
0108 virtual ~Process_Base();
0109
0110
0111 Process_Base *Parent();
0112 Process_Base *Selected();
0113 size_t SelectedIndex();
0114
0115 bool SetSelected(Process_Base *const proc);
0116 size_t SynchronizeSelectedIndex(Process_Base &);
0117
0118 double LastPlus();
0119 double LastMinus();
0120
0121 void SetSProc(Process_Base *sproc);
0122 void SetBBarMC(BBar_Multi_Channel *mc);
0123
0124 int NaiveMapping(Process_Base *proc) const;
0125
0126 std::string ShellName(std::string name="") const;
0127
0128 Color_Matrix ColorMatrix(const ATOOLS::Flavour_Vector &fls) const;
0129
0130 virtual void ConstructColorMatrix();
0131 virtual void FillProcessMap(NLOTypeStringProcessMap_Map *apmap);
0132
0133 virtual void SetScale(const Scale_Setter_Arguments &args) = 0;
0134 virtual void SetKFactor(const KFactor_Setter_Arguments &args) = 0;
0135 virtual void InitializeTheReweighting(ATOOLS::Variations_Mode) = 0;
0136
0137 virtual void SetFixedScale(const std::vector<double> &s);
0138 virtual void SetSelectorOn(const bool on);
0139 virtual void SetUseBIWeight(bool on);
0140
0141 virtual size_t SetMCMode(const size_t mcmode);
0142 virtual size_t SetClusterMode(const size_t mcmode);
0143
0144 virtual size_t Size() const = 0;
0145 virtual Process_Base *operator[](const size_t &i) = 0;
0146
0147 virtual ATOOLS::Weight_Info *OneEvent(
0148 const int wmode,
0149 ATOOLS::Variations_Mode varmode=ATOOLS::Variations_Mode::all,
0150 const int mode=0) = 0;
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166 virtual ATOOLS::Weights_Map Differential(const ATOOLS::Vec4D_Vector&,
0167 ATOOLS::Variations_Mode) = 0;
0168
0169 virtual ATOOLS::Weights_Map Differential(const ATOOLS::Cluster_Amplitude&,
0170 ATOOLS::Variations_Mode varmode=ATOOLS::Variations_Mode::nominal_only,
0171 int mode=0);
0172
0173 virtual bool GeneratePoint();
0174 virtual void AddPoint(const double &value);
0175 virtual bool ReadIn(const std::string &pid);
0176 virtual void WriteOut(const std::string &pid);
0177 virtual void EndOptimize();
0178 virtual void MPICollect(std::vector<double> &sv,size_t &i);
0179 virtual void MPIReturn(std::vector<double> &sv,size_t &i);
0180 virtual void MPISync(const int mode=0);
0181
0182 virtual bool IsGroup() const;
0183
0184 virtual bool CalculateTotalXSec(const std::string &resultpath,
0185 const bool create=false) = 0;
0186 virtual void SetLookUp(const bool lookup) = 0;
0187
0188 virtual int PerformTests();
0189 virtual bool InitScale();
0190 virtual void Init(const Process_Info &pi,
0191 BEAM::Beam_Spectra_Handler *const beamhandler,
0192 PDF::ISR_Handler *const isrhandler,
0193 YFS::YFS_Handler *const yfshandler,const int mode=0);
0194
0195 virtual bool FillIntegrator(Phase_Space_Handler *const psh);
0196 virtual bool InitIntegrator(Phase_Space_Handler *const psh);
0197 virtual void UpdateIntegrator(Phase_Space_Handler *const psh);
0198 virtual bool FillResonances(ATOOLS::Flavour_Vector & flavs) { return false; }
0199
0200 virtual void SetGenerator(ME_Generator_Base *const gen);
0201 virtual void SetShower(PDF::Shower_Base *const ps);
0202 virtual void SetNLOMC(PDF::NLOMC_Base *const mc);
0203 const ATOOLS::Weights_Map& WeightsMap() const { return m_last; }
0204 virtual void SetSelector(const Selector_Key &key);
0205 virtual void SetCaller(Process_Base *const proc);
0206
0207 virtual void InitCuts(Cut_Data *const cuts);
0208 virtual void BuildCuts(Cut_Data *const cuts);
0209
0210 virtual bool Trigger(const ATOOLS::Vec4D_Vector &p);
0211
0212 virtual ATOOLS::NLO_subevtlist *GetSubevtList();
0213 virtual ATOOLS::NLO_subevtlist *GetRSSubevtList();
0214
0215 virtual void SetRBMap(ATOOLS::Cluster_Amplitude *ampl);
0216 virtual void InitPSHandler(const double &maxerror,
0217 const std::string eobs,
0218 const std::string efunc);
0219
0220 virtual void FillOnshellConditions();
0221 virtual bool FillFinalState(const ATOOLS::Vec4D_Vector &p);
0222
0223 virtual std::vector<std::vector<int> > *Colours() const;
0224
0225 static void SortFlavours(ATOOLS::Cluster_Amplitude *const ampl,
0226 const int mode=1);
0227 static void SortFlavours(Process_Info &pi,const int mode=1);
0228
0229 static std::string BaseName(const std::string &name,
0230 const std::string &addname=std::string(""));
0231
0232 static std::string GenerateName(const ATOOLS::Cluster_Amplitude *ampl);
0233 static std::string GenerateName(const ATOOLS::NLO_subevt *sub,
0234 const size_t &nin);
0235
0236 static std::string GenerateName(const Subprocess_Info &info);
0237 static std::string GenerateName(const Subprocess_Info &ii,
0238 const Subprocess_Info &fi);
0239
0240
0241 inline void SetParent(Process_Base *const proc) { p_parent=proc; }
0242
0243 inline size_t NIn() const { return m_nin; }
0244 inline size_t NOut() const { return m_nout; }
0245 inline const ATOOLS::Flavour_Vector &Flavours() const { return m_flavs; }
0246 inline void SetFlavours(const ATOOLS::Flavour_Vector& flavs) { m_flavs = flavs; }
0247
0248 inline const std::string &Name() const { return m_name; }
0249 inline const std::string &ResultsName() const { return m_resname; }
0250
0251 inline void SetMaxOrders(const std::vector<double> &o) { m_maxcpl=o; }
0252 inline void SetMinOrders(const std::vector<double> &o) { m_mincpl=o; }
0253
0254 inline void SetMaxOrder(const size_t &id,const double o)
0255 { if (m_maxcpl.size()<=id) m_maxcpl.resize(id+1,0); m_maxcpl[id]=o; }
0256 inline void SetMinOrder(const size_t &id,const double o)
0257 { if (m_mincpl.size()<=id) m_mincpl.resize(id+1,0); m_mincpl[id]=o; }
0258
0259 inline const std::vector<double> &MaxOrders() const { return m_maxcpl; }
0260 inline const std::vector<double> &MinOrders() const { return m_mincpl; }
0261
0262 inline double MaxOrder(const size_t &id) const { return m_maxcpl[id]; }
0263 inline double MinOrder(const size_t &id) const { return m_mincpl[id]; }
0264
0265 PDF::Shower_Base *Shower() const { return p_shower; }
0266 PDF::NLOMC_Base *NLOMC() const { return p_nlomc; }
0267
0268 inline Process_Info &Info() { return m_pinfo; }
0269 inline const Process_Info &Info() const { return m_pinfo; }
0270
0271 inline ATOOLS::DecayInfo_Vector &DecayInfos() {return m_decins;}
0272 inline const ATOOLS::DecayInfo_Vector &DecayInfos() const {return m_decins;}
0273
0274 inline ATOOLS::ME_Weight_Info *GetMEwgtinfo() { return &m_mewgtinfo; }
0275 inline void SetMEwgtinfo(const ATOOLS::ME_Weight_Info i) { m_mewgtinfo=i; }
0276
0277 inline Process_Integrator *Integrator() const { return p_int; }
0278
0279 inline virtual const bool HasInternalScale() const { return m_hasinternalscale; }
0280 inline virtual const double InternalScale() const { return m_internalscale; }
0281
0282 virtual void FillAmplitudes(std::vector<METOOLS::Spin_Amplitudes>& amps,
0283 std::vector<std::vector<Complex> >& cols);
0284
0285 inline double Last() const { return m_last.Nominal(); }
0286 inline double LastB() const { return m_lastb.Nominal(); }
0287
0288 inline bool LookUp() const { return m_lookup; }
0289
0290 inline double SymFac() const { return m_symfac; }
0291 inline double ISSymFac() const { return m_issymfac; }
0292
0293 inline Scale_Setter_Base *ScaleSetter(const int map=0) const
0294 { return map?(p_mapproc?p_mapproc->p_scale:p_scale):p_scale; }
0295 inline KFactor_Setter_Base *KFactorSetter(const int map=0) const
0296 { return map?(p_mapproc?p_mapproc->p_kfactor:p_kfactor):p_kfactor; }
0297
0298 inline bool IsMapped() const { return p_mapproc; }
0299
0300 inline size_t MCMode() const { return m_mcmode; }
0301 inline size_t ClusterMode() const { return m_cmode; }
0302
0303 inline ME_Generator_Base *Generator() const { return p_gen; }
0304
0305 inline Process_Base *MapProc() const { return p_mapproc; }
0306 inline Process_Base *Caller() const { return p_caller; }
0307
0308 inline Cut_Data * Cuts() const { return p_cuts; }
0309 inline Combined_Selector * Selector() const
0310 { return p_mapproc?p_mapproc->p_selector:p_selector; }
0311 inline virtual const double SPrimeMin() const { return -1.; }
0312 inline virtual const double SPrimeMax() const { return -1.; }
0313 template <class PType> inline PType *Get()
0314 { return dynamic_cast<PType*>(this); }
0315 template <class PType> inline const PType *Get() const
0316 { return dynamic_cast<PType*>(this); }
0317
0318 inline NLOTypeStringProcessMap_Map *AllProcs() { return p_apmap; }
0319
0320 inline BBar_Multi_Channel *BBarMC() const { return p_mc; }
0321
0322 inline const Color_Matrix &ColorMatrix(const int map=0) const
0323 { return map?(p_mapproc?p_mapproc->m_cols:m_cols):m_cols; }
0324
0325 };
0326
0327 class Order_Flavour {
0328 FMMap* p_fmm;
0329 int Order_SVFT(const ATOOLS::Flavour &a,const ATOOLS::Flavour &b)
0330 {
0331 if (a.IsScalar() && !b.IsScalar()) return 1;
0332 if (a.IsVector() && !b.IsScalar() &&
0333 !b.IsVector()) return 1;
0334 if (a.IsFermion() && !b.IsFermion() &&
0335 !b.IsScalar() && !b.IsVector()) return 1;
0336 return 0;
0337 }
0338 int Order_Multi(const ATOOLS::Flavour &a,const ATOOLS::Flavour &b)
0339 {
0340 if ((*p_fmm)[int(a.Kfcode())]==0 ||
0341 (*p_fmm)[int(b.Kfcode())]==0) return 0;
0342 if ((*p_fmm)[int(a.Kfcode())]>
0343 (*p_fmm)[int(b.Kfcode())]) return 1;
0344 return 0;
0345 }
0346 int Order_Photons(const ATOOLS::Flavour &a,const ATOOLS::Flavour &b)
0347 {
0348 if (a.Strong() && a.Mass() && b.IsPhoton()) return 1;
0349 return 0;
0350 }
0351
0352 public:
0353 int operator()(const ATOOLS::Flavour &a,const ATOOLS::Flavour &b)
0354 {
0355 if (a.Priority()>b.Priority()) return 1;
0356 if (a.Priority()<b.Priority()) return 0;
0357 if (Order_Photons(a,b)) return 1;
0358 if (Order_Photons(b,a)) return 0;
0359 if (!a.Strong()&&b.Strong()) return 1;
0360 if (a.Strong()&&!b.Strong()) return 0;
0361 if (a.Mass()>b.Mass()) return 1;
0362 if (a.Mass()<b.Mass()) return 0;
0363 if (p_fmm) {
0364 if (Order_Multi(a,b)) return 1;
0365 if (Order_Multi(b,a)) return 0;
0366 }
0367 if (Order_SVFT(a,b)) return 1;
0368 if (Order_SVFT(b,a)) return 0;
0369 if (!a.IsAnti()&&b.IsAnti()) return 1;
0370 if (a.IsAnti()&&!b.IsAnti()) return 0;
0371 return a.Kfcode()<b.Kfcode();
0372 }
0373 Order_Flavour(FMMap* fmm): p_fmm(fmm) {}
0374 int operator()(const Subprocess_Info &a,const Subprocess_Info &b)
0375 { return (*this)(a.m_fl,b.m_fl); }
0376 int operator()(const ATOOLS::Cluster_Leg *a,
0377 const ATOOLS::Cluster_Leg *b)
0378 { return (*this)(a->Flav(),b->Flav()); }
0379 };
0380
0381 }
0382
0383 #endif