Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:24:25

0001 // -*- C++ -*-
0002 //
0003 // IFLightKinematics.h is a part of Herwig - A multi-purpose Monte Carlo event generator
0004 // Copyright (C) 2002-2019 The Herwig Collaboration
0005 //
0006 // Herwig is licenced under version 3 of the GPL, see COPYING for details.
0007 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
0008 //
0009 #ifndef HERWIG_IFLightKinematics_H
0010 #define HERWIG_IFLightKinematics_H
0011 //
0012 // This is the declaration of the IFLightKinematics class.
0013 //
0014 
0015 #include "DipoleSplittingKinematics.h"
0016 
0017 namespace Herwig {
0018 
0019 using namespace ThePEG;
0020 
0021 /**
0022  * \ingroup DipoleShower
0023  * \author Simon Platzer, Martin Stoll
0024  *
0025  * \brief IFMassiveKinematics implements massless splittings
0026  * off an initial-final dipole.
0027  *
0028  * @see \ref IFMassiveKinematicsInterfaces "The interfaces"
0029  * defined for IFMassiveKinematics.
0030  */
0031 class IFMassiveKinematics: public DipoleSplittingKinematics {
0032 
0033 public:
0034 
0035   /**
0036    * The default constructor.
0037    */
0038   IFMassiveKinematics();
0039 
0040 public:
0041 
0042   /**
0043    * Return the boundaries in between the evolution
0044    * variable random number is to be sampled; the lower
0045    * cuoff is assumed to correspond to the infrared cutoff.
0046    */
0047   virtual pair<double,double> kappaSupport(const DipoleSplittingInfo& dIndex) const;
0048 
0049   /**
0050    * Return the boundaries in between the momentum
0051    * fraction random number is to be sampled.
0052    */
0053   virtual pair<double,double> xiSupport(const DipoleSplittingInfo& dIndex) const;
0054 
0055   /**
0056    * Return the boundaries on the momentum fraction
0057    */
0058   virtual pair<double,double> zBoundaries(Energy,
0059                       const DipoleSplittingInfo&,
0060                       const DipoleSplittingKernel&) const {
0061     return {0.0,1.0};
0062   }
0063 
0064   /**
0065    * Return the dipole scale associated to the
0066    * given pair of emitter and spectator. This
0067    * should be the invariant mass or absolute value
0068    * final/final or initial/initial and the absolute
0069    * value of the momentum transfer for intial/final or
0070    * final/initial dipoles.
0071    */
0072   virtual Energy dipoleScale(const Lorentz5Momentum& pEmitter,
0073                  const Lorentz5Momentum& pSpectator) const;
0074 
0075   /**
0076    * Return the maximum pt for the given dipole scale.
0077    */
0078   virtual Energy ptMax(Energy dScale, 
0079                double emX, double specX,
0080                const DipoleSplittingInfo& dInfo,
0081                const DipoleSplittingKernel& split) const;
0082   
0083   /**
0084    * Return the maximum pt for the given dipole scale.
0085    */
0086   virtual Energy ptMax(Energy dScale, 
0087                double, double,
0088                const DipoleIndex& dIndex,
0089                const DipoleSplittingKernel& split,
0090                tPPtr emitter, tPPtr) const;
0091   
0092   /**
0093    * Return the maximum pt for the given dipole scale.
0094    */
0095   virtual Energy ptMax(Energy, 
0096                double, double,
0097                const DipoleIndex&,
0098                const DipoleSplittingKernel&) const {
0099       // Only the DipoleSplittingInfo version should be used for massive
0100       // dipoles, for now anyway.
0101     assert(false);
0102     return ZERO;
0103   }
0104   
0105   /**
0106    * Return the maximum virtuality for the given dipole scale.
0107    */
0108   virtual Energy QMax(Energy dScale, 
0109               double emX, double specX,
0110               const DipoleSplittingInfo& dInfo,
0111               const DipoleSplittingKernel& split) const;
0112   
0113   /**
0114    * Return the maximum virtuality for the given dipole scale.
0115    */
0116   virtual Energy QMax(Energy, 
0117               double, double,
0118               const DipoleIndex&,
0119               const DipoleSplittingKernel&) const { 
0120     // Only the DipoleSplittingInfo version should be used for massive
0121     // dipoles, for now anyway.
0122     assert(false);
0123     return ZERO;
0124   }
0125   
0126   /**
0127    * Return the pt given a virtuality.
0128    */
0129   virtual Energy PtFromQ(Energy scale, const DipoleSplittingInfo&) const;
0130 
0131   /**
0132    * Return the virtuality given a pt.
0133    */
0134   virtual Energy QFromPt(Energy scale, const DipoleSplittingInfo&) const;
0135 
0136   /**
0137    * Return the random number associated to
0138    * the given pt.
0139    */
0140   virtual double ptToRandom(Energy pt, Energy dScale,
0141                 double emX, double specX,
0142                 const DipoleIndex& dIndex,
0143                 const DipoleSplittingKernel&) const;
0144 
0145   /**
0146    * Generate splitting variables given three random numbers
0147    * and the momentum fractions of the emitter and spectator.
0148    * Return true on success.
0149    */
0150   virtual bool generateSplitting(double kappa, double xi, double phi,
0151                  DipoleSplittingInfo& dIndex,
0152                  const DipoleSplittingKernel&);
0153 
0154   /**
0155    * Generate the full kinematics given emitter and
0156    * spectator momentum and a previously completeted
0157    * DipoleSplittingInfo object.
0158    */
0159   virtual void generateKinematics(const Lorentz5Momentum& pEmitter,
0160                   const Lorentz5Momentum& pSpectator,
0161                   const DipoleSplittingInfo& dInfo);
0162 
0163 public:
0164 
0165   /** @name Functions used by the persistent I/O system. */
0166   //@{
0167   /**
0168    * Function used to write out object persistently.
0169    * @param os the persistent output stream written to.
0170    */
0171   void persistentOutput(PersistentOStream & os) const;
0172 
0173   /**
0174    * Function used to read in object persistently.
0175    * @param is the persistent input stream read from.
0176    * @param version the version number of the object when written.
0177    */
0178   void persistentInput(PersistentIStream & is, int version);
0179   //@}
0180 
0181   /**
0182    * The standard Init function used to initialize the interfaces.
0183    * Called exactly once for each class by the class description system
0184    * before the main function starts or
0185    * when this class is dynamically loaded.
0186    */
0187   static void Init();
0188 
0189 protected:
0190 
0191   /** @name Clone Methods. */
0192   //@{
0193   /**
0194    * Make a simple clone of this object.
0195    * @return a pointer to the new object.
0196    */
0197   virtual IBPtr clone() const;
0198 
0199   /** Make a clone of this object, possibly modifying the cloned object
0200    * to make it sane.
0201    * @return a pointer to the new object.
0202    */
0203   virtual IBPtr fullclone() const;
0204   //@}
0205 
0206 
0207 // If needed, insert declarations of virtual function defined in the
0208 // InterfacedBase class here (using ThePEG-interfaced-decl in Emacs).
0209 
0210 
0211 private:
0212 
0213   /**
0214    * The static object used to initialize the description of this class.
0215    * Indicates that this is a concrete class with persistent data.
0216    */
0217   static ClassDescription<IFMassiveKinematics> initIFMassiveKinematics;
0218 
0219   /**
0220    * The assignment operator is private and must never be called.
0221    * In fact, it should not even be implemented.
0222    */
0223   IFMassiveKinematics & operator=(const IFMassiveKinematics &) = delete;
0224 
0225 private:
0226 
0227   /**
0228    * Wether or not to choose the `collinear' scheme
0229    */
0230   bool theCollinearScheme;
0231 
0232 };
0233 
0234 }
0235 
0236 #include "ThePEG/Utilities/ClassTraits.h"
0237 
0238 namespace ThePEG {
0239 
0240 /** @cond TRAITSPECIALIZATIONS */
0241 
0242 /** This template specialization informs ThePEG about the
0243  *  base classes of IFMassiveKinematics. */
0244 template <>
0245 struct BaseClassTrait<Herwig::IFMassiveKinematics,1> {
0246   /** Typedef of the first base class of IFMassiveKinematics. */
0247   typedef Herwig::DipoleSplittingKinematics NthBase;
0248 };
0249 
0250 /** This template specialization informs ThePEG about the name of
0251  *  the IFMassiveKinematics class and the shared object where it is defined. */
0252 template <>
0253 struct ClassTraits<Herwig::IFMassiveKinematics>
0254   : public ClassTraitsBase<Herwig::IFMassiveKinematics> {
0255   /** Return a platform-independent class name */
0256   static string className() { return "Herwig::IFMassiveKinematics"; }
0257   /**
0258    * The name of a file containing the dynamic library where the class
0259    * IFMassiveKinematics is implemented. It may also include several, space-separated,
0260    * libraries if the class IFMassiveKinematics depends on other classes (base classes
0261    * excepted). In this case the listed libraries will be dynamically
0262    * linked in the order they are specified.
0263    */
0264   static string library() { return "HwDipoleShower.so"; }
0265 };
0266 
0267 /** @endcond */
0268 
0269 }
0270 
0271 #endif /* HERWIG_IFMassiveKinematics_H */