File indexing completed on 2025-12-16 10:32:15
0001 #ifndef PHASIC_Main_Phase_Space_Handler_H
0002 #define PHASIC_Main_Phase_Space_Handler_H
0003
0004 #include "PHASIC++/Main/Process_Integrator.H"
0005 #include "PHASIC++/Main/Phase_Space_Point.H"
0006 #include "PHASIC++/Main/Phase_Space_Enhance.H"
0007 #include "PHASIC++/Main/Phase_Space_Variation_Weights.H"
0008
0009 #include "PHASIC++/Selectors/Cut_Data.H"
0010 #include "ATOOLS/Math/Algebra_Interpreter.H"
0011 #include "ATOOLS/Org/Info_Key.H"
0012 #include "ATOOLS/Org/CXXFLAGS.H"
0013 #include "ATOOLS/Phys/Weights.H"
0014 #include <list>
0015
0016 namespace ATOOLS {
0017 class Blob_Data_Base;
0018 class Poincare;
0019 class Mass_Selector;
0020 struct Weight_Info;
0021 }
0022
0023 namespace BEAM {
0024 class Beam_Spectra_Handler;
0025 }
0026
0027 namespace PDF {
0028 class ISR_Handler;
0029 }
0030
0031 namespace YFS {
0032 class YFS_Handler;
0033 }
0034
0035 namespace PHASIC {
0036 class Multi_Channel;
0037 class Beam_Channels;
0038 class ISR_Channels;
0039 class Subprocess_Info;
0040 class Process_Info;
0041
0042 class Phase_Space_Integrator;
0043 class Process_Base;
0044
0045 class Phase_Space_Handler {
0046 private:
0047 BEAM::Beam_Spectra_Handler * p_beamhandler;
0048 PDF::ISR_Handler * p_isrhandler;
0049 YFS::YFS_Handler * p_yfshandler;
0050 std::string m_name;
0051 int m_nin, m_nout, m_nvec;
0052 ATOOLS::Flavour_Vector p_flavours;
0053 ATOOLS::Vec4D_Vector p_lab;
0054
0055 Process_Integrator * p_process, *p_active;
0056 Phase_Space_Integrator * p_integrator;
0057 Phase_Space_Point m_pspoint;
0058 Phase_Space_Enhance m_psenhance;
0059
0060 ATOOLS::Weights_Map m_wgtmap;
0061 static ATOOLS::Integration_Info * p_info;
0062
0063 double m_enhanceweight, m_ISsymmetryfactor, m_psweight;
0064
0065 psmode::code m_cmode;
0066 double m_thkill, m_error, m_abserror;
0067 bool m_initialized, m_sintegrator, m_fin_opt, m_printpspoint;
0068 long int m_killedpoints;
0069 std::vector<std::vector<double> > m_stats;
0070
0071 std::string m_enhanceObs, m_enhanceFunc;
0072
0073 void RegisterDefaults() const;
0074 void InitParameters(const double & error);
0075
0076 void ManageWeights(const double & factor);
0077 bool CheckStability();
0078
0079 void PrintIntermediate();
0080 void CheckSinglePoint();
0081 static void TestPoint(ATOOLS::Vec4D *const p,
0082 ATOOLS::Vec4D_Vector cp,ATOOLS::Flavour_Vector fl,
0083 const Subprocess_Info *info,size_t &n,
0084 const ATOOLS::Mass_Selector* ms);
0085
0086 public:
0087
0088
0089 Phase_Space_Handler(Process_Integrator *,double error,
0090 const std::string eobs,const std::string efunc);
0091
0092
0093 ~Phase_Space_Handler();
0094
0095 bool CreateIntegrators();
0096 inline void InitCuts() { m_pspoint.InitCuts(p_process); }
0097
0098 double Integrate();
0099 ATOOLS::Weight_Info *OneEvent(
0100 Process_Base *const proc,
0101 ATOOLS::Variations_Mode varmode=ATOOLS::Variations_Mode::all,
0102 const int mode=0);
0103 inline ATOOLS::Weights_Map Differential(ATOOLS::Variations_Mode varmode) {
0104 return Differential(p_process, varmode);
0105 }
0106 ATOOLS::Weights_Map Differential(Process_Integrator *const process,
0107 ATOOLS::Variations_Mode,
0108 const psmode::code mode=psmode::normal_call);
0109
0110 inline ATOOLS::Weights_Map CalculateME(ATOOLS::Variations_Mode varmode) {
0111 return p_active->Process()->Differential(p_lab, varmode);
0112 }
0113 inline double CalculatePS() { return m_pspoint.CalculateWeight(); }
0114 inline double Weight(ATOOLS::Vec4D_Vector& moms) {
0115 m_pspoint.SetMomenta(moms);
0116 return m_pspoint.CalculateWeight();
0117 }
0118
0119 void AddPoint(const double xs);
0120
0121 static void TestPoint(ATOOLS::Vec4D *const p,const Process_Info *info,
0122 const ATOOLS::Mass_Selector* ms,const int mode=0);
0123 static void TestPoint(ATOOLS::Vec4D *const p,
0124 const size_t &nin,const size_t &nout,
0125 const ATOOLS::Flavour_Vector &flavs,
0126 const ATOOLS::Mass_Selector* ms);
0127
0128
0129 inline static ATOOLS::Integration_Info* GetInfo() {
0130 if (p_info==NULL) p_info = new ATOOLS::Integration_Info();
0131 return p_info;
0132 }
0133 inline static void DeleteInfo() {
0134 if (p_info) { delete p_info; p_info=NULL; }
0135 }
0136
0137 void WriteOut(const std::string &path);
0138 bool ReadIn(const std::string &path,const size_t exclude=0);
0139 bool YFSEvent();
0140
0141 inline void MPISync() {
0142 m_pspoint.MPISync();
0143 p_process->MPISync();
0144 }
0145 inline void Optimize() {
0146 m_pspoint.Optimize(m_error);
0147 p_process->ResetMax(2);
0148 m_psenhance.Optimize();
0149 }
0150 inline void EndOptimize() {
0151 m_pspoint.EndOptimize(m_error);
0152 }
0153 inline void SetEnhanceWeight(const double& enhance)
0154 {
0155 m_enhanceweight = enhance;
0156 m_psenhance.SetFactor(enhance);
0157 }
0158 inline void SetOSMass(const double &osmass) { m_pspoint.SetOSMass(osmass); }
0159 inline void SetError(const double error) { m_error=error; }
0160 inline void SetAbsError(const double error) { m_abserror=error; }
0161
0162 inline void SetBeamIntegrator(Multi_Channel * channels) { m_pspoint.SetBeamIntegrator(channels); }
0163 inline void SetISRIntegrator(Multi_Channel * channels) { m_pspoint.SetISRIntegrator(channels); }
0164 inline void SetFSRIntegrator(Multi_Channel * channels) { m_pspoint.SetFSRIntegrator(channels); }
0165
0166 inline BEAM::Beam_Spectra_Handler * GetBeamSpectra() const { return p_beamhandler; }
0167 inline PDF::ISR_Handler * GetISRHandler() const { return p_isrhandler; }
0168 inline YFS::YFS_Handler * GetYFSHandler() const { return p_yfshandler; }
0169 inline Phase_Space_Integrator * Integrator() const { return p_integrator; }
0170 inline const std::vector<std::vector<double> > Stats() const { return m_stats; }
0171 inline ATOOLS::Vec4D_Vector & Momenta() { return p_lab; }
0172 inline ATOOLS::Flavour_Vector & Flavs() { return p_flavours; }
0173 inline Cut_Data * Cuts() { return m_pspoint.Cuts(); }
0174 inline Process_Integrator * Process() const { return p_process; }
0175 inline Process_Integrator * Active() const { return p_active; }
0176 inline const double & PSWeight() const { return m_psweight; }
0177 inline const double & EnhanceWeight() const { return m_enhanceweight; }
0178 inline const double & Error() const { return m_error; }
0179 inline const double & AbsError() const { return m_abserror; }
0180 inline Multi_Channel * BeamIntegrator() const { return m_pspoint.BeamIntegrator(); }
0181 inline Multi_Channel * ISRIntegrator() const { return m_pspoint.ISRIntegrator(); }
0182 inline Multi_Channel * FSRIntegrator() const { return m_pspoint.FSRIntegrator(); }
0183 inline void AddStats(const std::vector<double> &stats) {
0184 std::vector<double> nstats(1,m_stats.size()+1);
0185 nstats.insert(nstats.end(),stats.begin(),stats.end());
0186 m_stats.push_back(nstats);
0187 }
0188 };
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204 }
0205
0206 #endif