Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 09:10:11

0001 #ifndef PHASIC_Process_Single_Process_H
0002 #define PHASIC_Process_Single_Process_H
0003 
0004 #include "PHASIC++/Process/Process_Base.H"
0005 #include "ATOOLS/Phys/Variations.H"
0006 
0007 namespace ATOOLS {
0008   class Hard_Process_Variation_Generator_Base;
0009 }
0010 
0011 namespace PHASIC {
0012 
0013   class Single_Process: public Process_Base {
0014 
0015   protected:
0016 
0017     double m_lastxs, m_lastbxs, m_dsweight, m_lastflux;
0018     ATOOLS::Weights_Map m_dadswgtmap;
0019     bool   m_zero, m_pdfcts, m_dads;
0020     size_t m_nfconvscheme;
0021     ATOOLS::Cluster_Sequence_Info m_csi;
0022     std::vector<ATOOLS::asscontrib::type> m_asscontrib;
0023 
0024     //! Override in a subclass that calculates KP terms to enable their reweighting
0025     virtual double KPTerms(int mode, double scalefac2=1.0) { return 0.; };
0026 
0027     //! Override in a subclass as a fallback if the underlying ME returns the
0028     //! special QCD order of 98, thus indicating that it would like to report
0029     //! its own renormalization scale reweighting factor.
0030     virtual double CustomRelativeVariationWeightForRenormalizationScaleFactor(double) const {
0031       THROW(not_implemented, "This must be implemented in a subclass.");
0032     }
0033 
0034   public:
0035 
0036     Single_Process();
0037     virtual ~Single_Process();
0038 
0039     size_t Size() const override;
0040     Process_Base *operator[](const size_t &i) override;
0041 
0042     ATOOLS::Weight_Info *OneEvent(
0043         const int wmode,
0044         ATOOLS::Variations_Mode varmode=ATOOLS::Variations_Mode::all,
0045         const int mode=0) override;
0046 
0047     double KFactor(const int mode=0) const;
0048 
0049     double NfSchemeConversionTerms() const;
0050     double CollinearCounterTerms
0051     (const int i,const ATOOLS::Flavour &fl,const ATOOLS::Vec4D &p,
0052      const double &z,const double &t1,const double &t2,
0053      const double &muf2fac=1.0,
0054      const double &mur2fac=1.0,
0055      MODEL::Running_AlphaS * as=NULL) const;
0056 
0057 #if 0
0058     double Differential(const ATOOLS::Vec4D_Vector &p);
0059 #endif
0060 
0061     bool CalculateTotalXSec(const std::string &resultpath,
0062                             const bool create) override;
0063     void SetLookUp(const bool lookup) override;
0064 
0065     void SetScale(const Scale_Setter_Arguments &args) override;
0066     void SetKFactor(const KFactor_Setter_Arguments &args) override;
0067     void InitializeTheReweighting(ATOOLS::Variations_Mode) override;
0068 
0069     ATOOLS::Cluster_Amplitude *Cluster(const ATOOLS::Vec4D_Vector &p,
0070                                        const size_t &mode=0);
0071 
0072     /*!
0073      * Calculate the partonic cross section
0074      *
0075      * This updates m_last, m_lastb, m_lastxs and corresponding fields of
0076      * m_mewgtinfo. These information can be retrieved using Last, LastB,
0077      * LastXS and GetMEwgtinfo.
0078     */
0079     virtual double Partonic(
0080         const ATOOLS::Vec4D_Vector &p,
0081         ATOOLS::Variations_Mode varmode=ATOOLS::Variations_Mode::all,
0082         int mode=0) = 0;
0083 
0084     inline virtual const double SPrimeMin() const override { return -1.; }
0085     inline virtual const double SPrimeMax() const override { return -1.; }
0086     inline virtual const bool   HasInternalScale() const override { return false; }
0087     inline virtual const double InternalScale()    const override { return -1.; }
0088 
0089     virtual bool Combinable(const size_t &idi,
0090                             const size_t &idj);
0091     virtual const ATOOLS::Flavour_Vector &
0092     CombinedFlavour(const size_t &idij);
0093 
0094     virtual ATOOLS::Flavour ReMap
0095     (const ATOOLS::Flavour &fl,const size_t &id) const;
0096 
0097     inline void ResetLastXS() { m_lastxs=0.0; }
0098 
0099     inline double LastXS() const { return m_lastxs; }
0100 
0101     inline bool Zero() const { return m_zero; }
0102 
0103   private:
0104 
0105     //! Generate cluster sequence info (containing the ISR+beam weight)
0106     ATOOLS::Cluster_Sequence_Info ClusterSequenceInfo(
0107         const ATOOLS::ClusterAmplitude_Vector &,
0108         const double &Q2,
0109         const double &muf2fac=1.0,
0110         const double &mur2fac=1.0,
0111         const double &showermuf2fac=1.0,
0112         MODEL::Running_AlphaS * as=NULL,
0113         const ATOOLS::Cluster_Sequence_Info * const nominalcsi=NULL);
0114     void AddISR(ATOOLS::Cluster_Sequence_Info &,
0115                 const ATOOLS::ClusterAmplitude_Vector &,
0116                 const double &Q2,
0117                 const double &muf2fac=1.0,
0118                 const double &mur2fac=1.0,
0119                 const double &showermuf2fac=1.0,
0120                 MODEL::Running_AlphaS * as=NULL,
0121                 const ATOOLS::Cluster_Sequence_Info * const nominalcsi=NULL);
0122     void AddBeam(ATOOLS::Cluster_Sequence_Info &, const double &Q2);
0123 
0124     // Reweighting utilities and functions
0125     struct BornLikeReweightingInfo {
0126       BornLikeReweightingInfo() {}
0127       BornLikeReweightingInfo(const ATOOLS::ME_Weight_Info& mewgtinfo,
0128                               const ATOOLS::ClusterAmplitude_Vector& ampls,
0129                               double fallbackresult):
0130         m_wgt {mewgtinfo.m_B + mewgtinfo.m_VI + mewgtinfo.m_KP},
0131         m_orderqcd {mewgtinfo.m_oqcd},
0132         m_fl1 {mewgtinfo.m_fl1},
0133         m_fl2 {mewgtinfo.m_fl2},
0134         m_x1 {mewgtinfo.m_x1},
0135         m_x2 {mewgtinfo.m_x2},
0136         m_muF2 {mewgtinfo.m_muf2},
0137         m_muR2 {mewgtinfo.m_mur2},
0138         m_ampls {ampls},
0139         m_fallbackresult {fallbackresult}
0140       {}
0141       double m_wgt;
0142       size_t m_orderqcd;
0143       int m_fl1, m_fl2;
0144       double m_x1, m_x2;
0145       double m_muR2, m_muF2;
0146       ATOOLS::ClusterAmplitude_Vector m_ampls;
0147       double m_fallbackresult;
0148     };
0149     //! Return \f$wgt * \alpha_{S} * csi.pdfwgt\f$
0150     double ReweightBornLike(ATOOLS::QCD_Variation_Params&,
0151                             BornLikeReweightingInfo&);
0152     //! Generate cluster sequence info for variation parameters
0153     ATOOLS::Cluster_Sequence_Info
0154     ClusterSequenceInfo(ATOOLS::QCD_Variation_Params& varparams,
0155                         BornLikeReweightingInfo& info,
0156                         const double& mur2fac,
0157                         const ATOOLS::Cluster_Sequence_Info* const nominalcsi);
0158     //! Generate KP terms weight for variation parameters
0159     double KPTerms(const ATOOLS::QCD_Variation_Params *);
0160     virtual double KPTerms(int mode, PDF::PDF_Base *pdfa,
0161                PDF::PDF_Base *pdfb, double scalefac2=0.);
0162     //! Calculate MuR for variation parameters
0163     double MuR2(const ATOOLS::QCD_Variation_Params&,
0164                 Single_Process::BornLikeReweightingInfo&) const;
0165     //! Calculate AlphaS ratio (*asnew)(mur2new) / MODEL::as(mur2old)
0166     double AlphaSRatio(double mur2old, double mur2new,
0167                        MODEL::Running_AlphaS * asnew);
0168 
0169     ATOOLS::Weights_Map Differential(const ATOOLS::Vec4D_Vector&,
0170                                      ATOOLS::Variations_Mode) override;
0171 
0172     // the following are helper methods for the implementation of Differential
0173     void ResetResultsForDifferential(ATOOLS::Variations_Mode);
0174     void InitMEWeightInfo();
0175     void UpdateIntegratorMomenta(const ATOOLS::Vec4D_Vector&);
0176     void UpdateIntegratorMomenta(ATOOLS::ClusterAmplitude_Vector&);
0177     void UpdateSubeventMomenta(ATOOLS::NLO_subevt&);
0178     void CalculateFlux(const ATOOLS::Vec4D_Vector&);
0179     void UpdateMEWeightInfo(Scale_Setter_Base*);
0180     void ReweightBVI(ATOOLS::ClusterAmplitude_Vector&);
0181     void ReweightRS(ATOOLS::ClusterAmplitude_Vector&);
0182     void CalculateAssociatedContributionVariations();
0183 
0184     std::vector<ATOOLS::Hard_Process_Variation_Generator_Base*>
0185       m_hard_process_variation_generators;
0186 
0187   };// end of class Single_Process
0188 
0189 }// end of namespace PHASIC
0190 
0191 #endif