File indexing completed on 2025-04-19 09:10:13
0001 #ifndef SHERPA_PerturbativePhysics_Hard_Decay_Handler_H
0002 #define SHERPA_PerturbativePhysics_Hard_Decay_Handler_H
0003
0004 #include <map>
0005 #include <set>
0006 #include <string>
0007 #include <vector>
0008 #include "ATOOLS/Phys/Flavour.H"
0009 #include "ATOOLS/Org/Scoped_Settings.H"
0010 #include "SHERPA/Single_Events/Decay_Handler_Base.H"
0011 #include "PDF/Main/Cluster_Definitions_Base.H"
0012
0013 namespace MODEL {
0014 class Single_Vertex;
0015 typedef std::vector<Single_Vertex *> Vertex_List;
0016 }
0017
0018 namespace ATOOLS {
0019 class NLO_subevtlist;
0020 }
0021
0022 namespace PHASIC {
0023 class Decay_Channel;
0024 }
0025
0026 namespace SHERPA {
0027
0028 typedef std::pair<ATOOLS::Particle *,ATOOLS::Particle *> ParticlePair;
0029 typedef std::pair<std::pair<ATOOLS::Particle *,ATOOLS::Particle *>,ATOOLS::Particle *> ParticlePairPair;
0030 typedef std::vector<ParticlePair> ParticlePair_Vector;
0031 typedef std::vector<ParticlePairPair> ParticlePairPair_Vector;
0032
0033 class Hard_Decay_Handler : public Decay_Handler_Base {
0034 std::string m_resultdir, m_offshell;
0035 std::set<std::string> m_disabled_channels;
0036 std::map<ATOOLS::Flavour,std::set<std::string> > m_forced_channels;
0037 std::map<std::string, double> m_external_widths;
0038 int m_store_results;
0039 bool m_decay_tau, m_set_widths,
0040 m_br_weights, m_usemass;
0041 double m_min_prop_width;
0042 ATOOLS::Flavour_Set m_decmass;
0043 std::map<ATOOLS::Flavour, std::map<std::string, std::vector<double> > >
0044 m_read;
0045 PDF::Cluster_Definitions_Base *p_clus;
0046 ATOOLS::NLO_subevtlist *p_newsublist;
0047 double m_int_accuracy;
0048 int m_int_niter, m_int_target_mode;
0049
0050 void SetDecayMasses();
0051 void InitializeDirectDecays(PHASIC::Decay_Table* dt);
0052 void InitializeOffshellDecays(PHASIC::Decay_Table* dt);
0053 void SetHOSMWidths(ATOOLS::Scoped_Settings& s);
0054 bool TriggerOffshell(PHASIC::Decay_Channel* dc, std::vector<PHASIC::Decay_Channel*> new_dcs);
0055 std::vector<PHASIC::Decay_Channel*> ResolveDecay(PHASIC::Decay_Channel* dc);
0056 bool ProperVertex(MODEL::Single_Vertex* sv);
0057
0058 void AddDecayClustering(ATOOLS::Cluster_Amplitude*& ampl,
0059 ATOOLS::Blob* blob,
0060 size_t& imax,
0061 size_t idmother);
0062 void AddSplitPhotonsClustering(ATOOLS::Cluster_Amplitude*& ampl,
0063 const ATOOLS::Particle_Vector daughters,
0064 ParticlePairPair_Vector& splitphotons,
0065 size_t& imax,
0066 const std::vector<size_t>& ids);
0067 void AddPhotonsClustering(ATOOLS::Cluster_Amplitude*& ampl,
0068 const ATOOLS::Particle_Vector daughters,
0069 ParticlePair_Vector& photons,
0070 size_t& imax,
0071 const std::vector<size_t>& ids);
0072 void UnsplitPhotons(const ATOOLS::Particle_Vector& splitphotonproducts,
0073 ParticlePairPair_Vector& splitphotons);
0074 void AssignPhotons(const ATOOLS::Particle_Vector& daughters,
0075 ParticlePair_Vector& photons);
0076 void AssignSplitPhotons(const ATOOLS::Particle_Vector& daughters,
0077 ParticlePairPair_Vector& splitphotons);
0078 ATOOLS::Vec4D RecombinedMomentum(const ATOOLS::Particle * daughter,
0079 const ParticlePair_Vector& photons,
0080 const ParticlePairPair_Vector& splitphotons,
0081 size_t& stat);
0082
0083 void ReadDecayTable(ATOOLS::Flavour decayer);
0084 void WriteDecayTables();
0085 bool CalculateWidth(PHASIC::Decay_Channel* dc);
0086
0087 void FindDecayProducts(ATOOLS::Particle* decayer,
0088 std::list<ATOOLS::Particle*>& decayproducts);
0089 double BRFactor(ATOOLS::Blob* blob) const;
0090
0091 public :
0092 Hard_Decay_Handler();
0093 ~Hard_Decay_Handler();
0094
0095 void CreateDecayBlob(ATOOLS::Particle* inpart);
0096 void TreatInitialBlob(ATOOLS::Blob* blob,
0097 METOOLS::Amplitude2_Tensor* amps,
0098 const ATOOLS::Particle_Vector& origparts);
0099
0100 bool DefineInitialConditions(ATOOLS::Cluster_Amplitude* ampl,
0101 ATOOLS::Blob* initial_blob);
0102
0103 double Mass(const ATOOLS::Flavour &fl) const;
0104 bool Decays(const ATOOLS::Flavour& flav);
0105
0106 inline void SetCluster(PDF::Cluster_Definitions_Base *clus) { p_clus=clus; }
0107 };
0108 }
0109
0110 #endif