Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:38:27

0001 // -*- C++ -*-
0002 //
0003 // MadGraphTwoCut.h is a part of ThePEG - Toolkit for HEP Event Generation
0004 // Copyright (C) 1999-2019 Leif Lonnblad
0005 //
0006 // ThePEG 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 THEPEG_MadGraphTwoCut_H
0010 #define THEPEG_MadGraphTwoCut_H
0011 //
0012 // This is the declaration of the MadGraphTwoCut class.
0013 //
0014 
0015 #include "ThePEG/Cuts/TwoCutBase.h"
0016 
0017 namespace ThePEG {
0018 
0019 /**
0020  * Objects of the MadGraphTwoCut class can be created automatically by
0021  * the MadGraphReader class when scanning event files for information
0022  * about cuts. It is also possible to create objects by hand and use
0023  * it as any other OneCutBase object.
0024  *
0025  * @see \ref MadGraphTwoCutInterfaces "The interfaces"
0026  * defined for MadGraphTwoCut.
0027  */
0028 class MadGraphTwoCut: public TwoCutBase {
0029 
0030 public:
0031 
0032   /**
0033    * Enumerate the different kinds of cuts made by MadGraph.
0034    */
0035   enum class Cut {
0036     INVMASS, /**< The minimum invariant mass of two particles. */
0037     DELTAR   /**< The minimum pseudo-rapidity--azimuth-angle distance
0038                   between two particles. */
0039   };
0040 
0041   /**
0042    * Enumerate the types of particles the cut is made on.
0043    */
0044   enum class P {
0045     JET, /**< Coloured particles (jets). */
0046     LEP, /**< Leptons. */
0047     PHO, /**< Photons. */
0048     BOT,  /**< Bottom quarks. */
0049     NOT  /**< Other types not cut on. */
0050   };
0051 
0052   /**
0053    * Enumerate the types of particles pairs the cut is made on.
0054    */
0055   enum class PP {
0056     JETJET, /**< The cut applies only to pairs of coloured particles (jets). */
0057     LEPLEP, /**< The cut applies only to lepton pairs (in case of INVMASS
0058                  lepton--anti-lepton pairs of same flavour). */
0059     PHOPHO, /**< The cut applies only to pairs photons. */
0060     BOTBOT, /**< The cut applies only to pairs of bottom quarks. */
0061     BOTJET, /**< The cut applies only to bottom quarks paired with another
0062                  coloured particle (jet). */
0063     PHOJET, /**< The cut applies only to a photon paired with a coloured
0064                  particle (jet). */
0065     JETLEP, /**< The cut applies only to a coloured particle (jet) paired
0066                  with a lepton. */
0067     PHOBOT, /**< The cut applies only to a photon paired with a bottom quark. */
0068     BOTLEP, /**< The cut applies only to bottom quarks paired with a lepton. */
0069     PHOLEP  /**< The cut applies only to a photon paired with a lepton. */
0070   };
0071 
0072 public:
0073 
0074   /** @name Standard constructors and destructors. */
0075   //@{
0076   /**
0077    * The default constructor.
0078    */
0079   MadGraphTwoCut()
0080     : cutType(Cut::DELTAR), pairType(PP::JETJET), theCut(0.0) {}
0081 
0082   /**
0083    * The constructor used by the MadGraphReader.
0084    * @param t is the type of the cut.
0085    * @param p is the type of particles the cut is applied to.
0086    * @param c is the value of the cut (in units of GeV where applicable).
0087    */
0088   MadGraphTwoCut(Cut t, PP p, double c)
0089     : cutType(t), pairType(p), theCut(c) {}
0090 
0091   //@}
0092 
0093 public:
0094 
0095   /** @name Virtual functions mandated by the base class. */
0096   //@{
0097   /**
0098    * Return the minimum allowed squared invariant mass of two outgoing
0099    * partons of type \a pi and \a pj.
0100    */
0101   virtual Energy2 minSij(tcPDPtr pi, tcPDPtr pj) const;
0102 
0103   /**
0104    * Return the minimum allowed value of the negative of the squared
0105    * invariant mass of an incoming parton of type \a pi and an
0106    * outgoing parton of type \a po.
0107    */
0108   virtual Energy2 minTij(tcPDPtr pi, tcPDPtr po) const;
0109 
0110   /**
0111    * Return the minimum allowed value of \f$\Delta
0112    * R_{ij}=\sqrt{\Delta\eta_{ij}^2+\Delta\phi_{ij}^2}\f$ of two
0113    * outgoing partons of type \a pi and \a pj.
0114    */
0115   virtual double minDeltaR(tcPDPtr pi, tcPDPtr pj) const;
0116 
0117   /**
0118    * Return the minimum allowed value of the longitudinally invariant
0119    * \f$k_\perp\f$-algorithms distance measure. This is defined as
0120    * \f$\min(p_{\perp i}, p_{\perp
0121    * j})\sqrt{\Delta\eta_{ij}^2+\Delta\phi_{ij}^2}\f$ for two outgoing
0122    * partons, or simply \f$p_{\perp i}\f$ or \f$p_{\perp j}\f$ for a
0123    * single outgoing parton. Returns 0 if both partons are incoming. A
0124    * null pointer indicates an incoming parton, hence the type of the
0125    * incoming parton is irrelevant.
0126    */
0127   virtual Energy minKTClus(tcPDPtr pi, tcPDPtr pj) const;
0128 
0129   /**
0130    * Return the minimum allowed value of the Durham
0131    * \f$k_\perp\f$-algorithms distance measure. This is defined as
0132    * \f$2\min(E_j^2, E_j^2)(1-\cos\theta_{ij})/\hat{s}\f$ for two
0133    * outgoing partons.
0134    */
0135   virtual double minDurham(tcPDPtr pi, tcPDPtr pj) const;
0136 
0137   /**
0138    * Return true if a pair of particles with type \a pitype and \a
0139    * pjtype and momenta \a pi and \a pj respectively passes the
0140    * cuts. \a inci and \a inj indicates if the corresponding particles
0141    * are incoming.
0142    */
0143   virtual bool passCuts(tcCutsPtr parent, tcPDPtr pitype, tcPDPtr pjtype,
0144             LorentzMomentum pi, LorentzMomentum pj,
0145             bool inci = false, bool incj = false) const;
0146   //@}
0147 
0148 protected:
0149 
0150   /**
0151    * Returns true if cut should be applied to pair of particles of
0152    * type \a pi and \a pj.
0153    */
0154   bool checkType(tcPDPtr pi, tcPDPtr pj) const;
0155 
0156   /**
0157    * Get the type of particle \a p.
0158    */
0159   P getType(tcPDPtr p) const;
0160 
0161 public:
0162 
0163   /** @name Functions used by the persistent I/O system. */
0164   //@{
0165   /**
0166    * Function used to write out object persistently.
0167    * @param os the persistent output stream written to.
0168    */
0169   void persistentOutput(PersistentOStream & os) const;
0170 
0171   /**
0172    * Function used to read in object persistently.
0173    * @param is the persistent input stream read from.
0174    * @param version the version number of the object when written.
0175    */
0176   void persistentInput(PersistentIStream & is, int version);
0177   //@}
0178 
0179   /**
0180    * The standard Init function used to initialize the interfaces.
0181    * Called exactly once for each class by the class description system
0182    * before the main function starts or
0183    * when this class is dynamically loaded.
0184    */
0185   static void Init();
0186 
0187 protected:
0188 
0189   /** @name Clone Methods. */
0190   //@{
0191   /**
0192    * Make a simple clone of this object.
0193    * @return a pointer to the new object.
0194    */
0195   virtual IBPtr clone() const;
0196 
0197   /** Make a clone of this object, possibly modifying the cloned object
0198    * to make it sane.
0199    * @return a pointer to the new object.
0200    */
0201   virtual IBPtr fullclone() const;
0202   //@}
0203 
0204 private:
0205 
0206   /**
0207    * The type of this cut.
0208    */
0209   Cut cutType;
0210 
0211   /**
0212    * The type of particle pairs this cut applies to.
0213    */
0214   PP pairType;
0215 
0216   /**
0217    * The value of the cut to be applied.
0218    */
0219   double theCut;
0220 
0221 private:
0222 
0223   /**
0224    * The static object used to initialize the description of this class.
0225    * Indicates that this is a concrete class with persistent data.
0226    */
0227   static ClassDescription<MadGraphTwoCut> initMadGraphTwoCut;
0228 
0229   /**
0230    * The assignment operator is private and must never be called.
0231    * In fact, it should not even be implemented.
0232    */
0233   MadGraphTwoCut & operator=(const MadGraphTwoCut &) = delete;
0234 
0235 };
0236 
0237 }
0238 
0239 #include "ThePEG/Utilities/ClassTraits.h"
0240 
0241 namespace ThePEG {
0242 
0243 /** @cond TRAITSPECIALIZATIONS */
0244 
0245 /** This template specialization informs ThePEG about the
0246  *  base classes of MadGraphTwoCut. */
0247 template <>
0248 struct BaseClassTrait<MadGraphTwoCut,1> {
0249   /** Typedef of the first base class of MadGraphTwoCut. */
0250   typedef TwoCutBase NthBase;
0251 };
0252 
0253 /** This template specialization informs ThePEG about the name of
0254  *  the MadGraphTwoCut class and the shared object where it is defined. */
0255 template <>
0256 struct ClassTraits<MadGraphTwoCut>
0257   : public ClassTraitsBase<MadGraphTwoCut> {
0258   /** Return a platform-independent class name */
0259   static string className() { return "ThePEG::MadGraphTwoCut"; }
0260   /** Return the name(s) of the shared library (or libraries) be loaded to get
0261    *  access to the MadGraphTwoCut class and any other class on which it depends
0262    *  (except the base class). */
0263   static string library() { return "MadGraphReader.so"; }
0264 };
0265 
0266 /** @endcond */
0267 
0268 }
0269 
0270 #endif /* THEPEG_MadGraphTwoCut_H */