Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // Cuts.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_Cuts_H
0010 #define THEPEG_Cuts_H
0011 //
0012 // This is the declaration of the Cuts class.
0013 //
0014 
0015 #include "ThePEG/Interface/Interfaced.h"
0016 #include "Cuts.fh"
0017 #include "OneCutBase.h"
0018 #include "TwoCutBase.h"
0019 #include "MultiCutBase.h"
0020 #include "JetFinder.h"
0021 #include "FuzzyTheta.h"
0022 
0023 namespace ThePEG {
0024 
0025 /**
0026  * Cuts is a class for implementing kinematical cuts in ThePEG. The
0027  * class itself only implements cuts on the total momentum of the hard
0028  * sub-process, implemented as minimum and maximum values of \f$x_1\f$
0029  * and \f$x_2\f$ (or \f$\hat{s}=x_1x_2S_{tot}\f$ and
0030  * \f$\hat{y}=\log(x_1/x_2)/2\f$. Further cuts can be implemented
0031  * either by inheriting from this base class, in which the virtual
0032  * cut() function should be overridden, or by assigning objects of
0033  * class OneCutBase, TwoCutBase and MultiCutBase defining cuts on
0034  * single particles, pairs of particles and groups of particles in the
0035  * hard sub-process respectively.
0036  *
0037  * The Cuts object must be initialized specifying the overall
0038  * laboratory frame, giving the total squared invariant mass, \f$S\f$,
0039  * and the rapidity, \f$Y\f$, of the colliding particles in this
0040  * frame. The colliding particles are thus assumed to be directed
0041  * along the \f$z\f$-axis.
0042  *
0043  * For each event, the Cuts object must also be initialized giving the
0044  * squared invarint mass, \f$\hat{s}\f$, and the total rapidity,
0045  * \f$\hat{y}\f$, of the hard sub-process in the center-of-mass frame
0046  * of the colliding particles. Note that this means that the
0047  * transformation between the lab frame and the rest frame of the hard
0048  * sub-process is assumed to be a simple boost along the z-axis.
0049  *
0050  * @see \ref CutsInterfaces "The interfaces"
0051  * defined for Cuts.
0052  */
0053 class Cuts: public Interfaced {
0054 
0055 public:
0056 
0057   /**
0058    * A vector of OneCutBase pointers.
0059    */
0060   typedef vector<OneCutPtr> OneCutVector;
0061 
0062   /**
0063    * A vector of TwoCutBase pointers.
0064    */
0065   typedef vector<TwoCutPtr> TwoCutVector;
0066 
0067   /**
0068    * A vector of MultiCutBase pointers.
0069    */
0070   typedef vector<MultiCutPtr> MultiCutVector;
0071 
0072 public:
0073 
0074   /** @name Standard constructors and destructors. */
0075   //@{
0076   /**
0077    * The default constructor.
0078    */
0079   Cuts(Energy MhatMin=2*GeV);
0080   //@}
0081 
0082 public:
0083 
0084   /** @name Initialization functions. */
0085   //@{
0086   /**
0087    * Initialize this object specifying the maximum total invariant
0088    * mass squared, \a smax, and the total rapidity, \a Y, of the
0089    * colliding particles (for the maximum invariant mass). A sub-class
0090    * overriding this function must make sure the base-class function
0091    * is called. This function should be called once in the beginning
0092    * of a run.
0093    */
0094   virtual void initialize(Energy2 smax, double Y);
0095 
0096   /**
0097    * Initialize this object for a new event. A sub-class overriding
0098    * this function must make sure the base-class function is called.
0099    * This function is called before the generation of a new
0100    * sub-process, before the incoming partons have been generated.
0101    */
0102   virtual void initEvent();
0103 
0104   /**
0105    * Set information about the invariant mass squared, \a shat, and
0106    * rapidity, \a yhat, of the hard sub-process. The rapidity should
0107    * be given wrt. the center of mass of the colliding particles. A
0108    * sub-class overriding this function must make sure the base-class
0109    * function is called. This function is called before the generation
0110    * of a new sub-process, after the incoming partons have been
0111    * generated. If \a mirror is true any questions regarding cuts on
0112    * the sub-process in the functions minYStar(tcPDPtr),
0113    * maxYStar(tcPDPtr p), passCuts(const tcPDVector &, const
0114    * vector<LorentzMomentum> &, tcPDPtr, tcPDPtr) and passCuts(const
0115    * tcPVector &, tcPDPtr t1, tcPDPtr) will assume that the z-axis is
0116    * reversed in the sub-process rest frame. Returns false if the
0117    * given values were outside of the cuts.
0118    */
0119   virtual bool
0120   initSubProcess(Energy2 shat, double yhat, bool mirror = false) const;
0121   //@}
0122 
0123   /** @name Check functions to see if a state has passed the cuts or not. */
0124   //@{
0125   /**
0126    * Check if the outgoing particles, with the given types and
0127    * momenta, from a sub-process passes the cuts. The particles must
0128    * be given in the rest frame of tha hard sub-process, and the
0129    * initSubProcess must have been called before. Also the types of
0130    * the incoming partons, \a t1 and \a t2, may be given if availible.
0131    */
0132   virtual bool passCuts(const tcPDVector & ptype, const vector<LorentzMomentum> & p,
0133             tcPDPtr t1 = tcPDPtr(), tcPDPtr t2 = tcPDPtr()) const;
0134 
0135   /**
0136    * Check if the outgoing particles from a sub-process passes the
0137    * cuts. The particles must be given in the rest frame of tha hard
0138    * sub-process, and the initSubProcess must have been called
0139    * before. Also the types of the incoming partons, \a t1 and \a t2,
0140    * may be given if availible.
0141    */
0142   bool passCuts(const tcPVector & p,
0143         tcPDPtr t1 = tcPDPtr(), tcPDPtr t2 = tcPDPtr()) const;
0144 
0145   /**
0146    * Check if the incoming and outgoing particles in the given
0147    * sub-process passes the cuts. The sub-process must be given in its
0148    * rest frame, and the initSubProcess must have been called before.
0149    */
0150   bool passCuts(const SubProcess & sub) const;
0151 
0152   /**
0153    * Check if the given collision passes the cuts. The collision must
0154    * be given in its rest frame.
0155    */
0156   bool passCuts(const Collision & coll) const;
0157   //@}
0158 
0159   /** @name Access to cuts of the underlying cut objects. */
0160   //@{
0161   /**
0162    * Return the minimum allowed squared invariant mass of two outgoing
0163    * partons of type \a pi and \a pj. This function first determines
0164    * the minimum from the corresponding function from in TwoCutBase
0165    * objects. If no minimum was found, one is derived from
0166    * minKTClus(), minDurham(), minKT() and minDeltaR(), if possible.
0167    */
0168   Energy2 minSij(tcPDPtr pi, tcPDPtr pj) const;
0169 
0170   /**
0171    * Return the minimum allowed value of the negative of the squared
0172    * invariant mass of an incoming parton of type \a pi and an
0173    * outgoing parton of type \a po. This function first determines the
0174    * minimum from the corresponding function from in TwoCutBase
0175    * objects. If no minimum was found, one is derived from minKT(), if
0176    * possible.
0177    */
0178   Energy2 minTij(tcPDPtr pi, tcPDPtr po) const;
0179 
0180   /**
0181    * Return the minimum allowed value of \f$\Delta
0182    * R_{ij}=\sqrt{\Delta\eta_{ij}^2+\Delta\phi_{ij}^2}\f$ of two
0183    * outgoing partons of type \a pi and \a pj. Simply returns the
0184    * maximum of the results from calling the corresponding function in
0185    * the TwoCutBase objects.
0186    */
0187   double minDeltaR(tcPDPtr pi, tcPDPtr pj) const;
0188 
0189   /**
0190    * Return the minimum allowed value of the longitudinally invariant
0191    * \f$k_\perp\f$-algorithms distance measure. This is defined as
0192    * \f$\min(p_{\perp i}, p_{\perp
0193    * j})\sqrt{\Delta\eta_{ij}^2+\Delta\phi_{ij}^2}\f$ for two outgoing
0194    * partons, or simply \f$p_{\perp i}\f$ or \f$p_{\perp j}\f$ for a
0195    * single outgoing parton. Returns 0 if both partons are incoming. A
0196    * null pointer indicates an incoming parton, hence the type of the
0197    * incoming parton is irrelevant. Simply returns the maximum of the
0198    * results from calling the corresponding function in the TwoCutBase
0199    * objects.
0200    */
0201   Energy minKTClus(tcPDPtr pi, tcPDPtr pj) const;
0202 
0203   /**
0204    * Return the minimum allowed value of the Durham
0205    * \f$k_\perp\f$-algorithms distance measure. This is defined as
0206    * \f$2\min(E_j^2, E_j^2)(1-\cos\theta_{ij})/\hat{s}\f$ for two
0207    * outgoing partons. Simply returns the maximum of the results from
0208    * calling the corresponding function in the TwoCutBase objects.
0209    */
0210   double minDurham(tcPDPtr pi, tcPDPtr pj) const;
0211 
0212   /**
0213    * Return the minimum allowed value of the transverse momentum of an
0214    * outgoing parton. This function first determines the minimum from
0215    * the corresponding function from in OneCutBase objects. If no
0216    * minimum was found, one is derived from minKTClus(), if possible.
0217    */
0218   Energy minKT(tcPDPtr p) const;
0219 
0220   /**
0221    * Return the minimum allowed pseudo-rapidity of an outgoing parton
0222    * of the given type. The pseudo-rapidity is measured in the lab
0223    * system. Simply returns the maximum of the results from calling
0224    * the corresponding function in the OneCutBase objects.
0225    */
0226   double minEta(tcPDPtr p) const;
0227 
0228   /**
0229    * Return the maximum allowed pseudo-rapidity of an outgoing parton
0230    * of the given type. The pseudo-rapidity is measured in the lab
0231    * system. Simply returns the minimum of the results from calling
0232    * the corresponding function in the OneCutBase objects.
0233    */
0234   double maxEta(tcPDPtr p) const;
0235 
0236   /**
0237    * Return the minimum allowed rapidity of an outgoing parton
0238    * of the given type. The rapidity is measured in the lab
0239    * system. Simply returns the maximum of the results from calling
0240    * the corresponding function in the OneCutBase objects.
0241    */
0242   double minRapidityMax(tcPDPtr p) const;
0243 
0244   /**
0245    * Return the maximum allowed rapidity of an outgoing parton
0246    * of the given type. The rapidity is measured in the lab
0247    * system. Simply returns the minimum of the results from calling
0248    * the corresponding function in the OneCutBase objects.
0249    */
0250   double maxRapidityMin(tcPDPtr p) const;
0251 
0252   /**
0253    * Return the minimum allowed rapidity of an outgoing parton of the
0254    * given type in the center-of-mass system of the hard sub-process.
0255    * Only available after initSubProcess() has been called.
0256    */
0257   double minYStar(tcPDPtr p) const;
0258 
0259   /**
0260    * Return the minimum allowed rapidity of an outgoing parton of the
0261    * given type in the center-of-mass system of the hard sub-process.
0262    * Only available after initSubProcess() has been called.
0263    */
0264   double maxYStar(tcPDPtr p) const;
0265 
0266   /**
0267    * Return the minimum allowed value of the squared invariant mass of
0268    * a set of outgoing partons of the given types. Typically used to
0269    * cut off the tails of the mass of a resonance for
0270    * efficiency. Simply returns the maximum of the results from
0271    * calling the corresponding function in the MultiCutBase objects.
0272    */
0273   Energy2 minS(const tcPDVector & pv) const;
0274 
0275   /**
0276    * Return the maximum allowed value of the squared invariant mass of
0277    * a set of outgoing partons of the given types. Typically used to
0278    * cut off the tails of the mass of a resonance for
0279    * efficiency. Simply returns the minimum of the results from
0280    * calling the corresponding function in the MultiCutBase objects.
0281    */
0282   Energy2 maxS(const tcPDVector & pv) const;
0283   //@}
0284 
0285   /** @name Direct access to underlying cut objects. */
0286   //@{
0287   /**
0288    * Return a vector of pointers to objects of the given class (with
0289    * base class OneCutBase).
0290    */
0291   template <typename T>
0292   vector<typename Ptr<T>::transient_const_pointer>
0293   oneCutObjects() const;
0294 
0295   /**
0296    * Return a vector of pointers to objects of the given class (with
0297    * base class TwoCutBase).
0298    */
0299   template <typename T>
0300   vector<typename Ptr<T>::transient_const_pointer>
0301   twoCutObjects() const;
0302 
0303   /**
0304    * Return a vector of pointers to objects of the given class (with
0305    * base class MultiCutBase).
0306    */
0307   template <typename T>
0308   vector<typename Ptr<T>::transient_const_pointer>
0309   multiCutObjects() const;
0310 
0311   /**
0312    * Return the objects defining cuts on single outgoing partons from the
0313    * hard sub-process.
0314    */
0315   const OneCutVector& oneCuts() const { return theOneCuts; }
0316 
0317   /**
0318    * Return the objects defining cuts on pairs of particles in the hard
0319    * sub-process.
0320    */
0321   const TwoCutVector& twoCuts() const { return theTwoCuts; }
0322 
0323   /**
0324    * Return the objects defining cuts on sets of outgoing particles from the
0325    * hard sub-process.
0326    */
0327   const MultiCutVector& multiCuts() const { return theMultiCuts; }
0328 
0329   /**
0330    * Return the jet finder
0331    */
0332   Ptr<JetFinder>::tptr jetFinder() const { return theJetFinder; }
0333 
0334   /**
0335    * Add a OneCutBase object.
0336    */
0337   void add(tOneCutPtr c) { theOneCuts.push_back(c); }
0338 
0339   /**
0340    * Add a TwoCutBase object.
0341    */
0342   void add(tTwoCutPtr c) { theTwoCuts.push_back(c); }
0343 
0344   /**
0345    * Add a MultiCutBase object.
0346    */
0347   void add(tMultiCutPtr c) { theMultiCuts.push_back(c); }
0348   //@}
0349 
0350 public:
0351 
0352   /** @name Simple access functions. */
0353   //@{
0354   /**
0355    * The maximum allowed total invariant mass squared allowed for
0356    * events to be considered.
0357    */
0358   Energy2 SMax() const { return theSMax; }
0359 
0360 
0361   /**
0362    * The total rapidity of the colliding particles corresponding to
0363    * the maximum invariant mass squared, SMax().
0364    */
0365   double Y() const { return theY; }
0366 
0367   /**
0368    * The invariant mass squared of the hard sub-process of the event
0369    * being considered.
0370    */
0371   Energy2 currentSHat() const { return theCurrentSHat; }
0372 
0373   /**
0374    * The total rapidity of hard sub-process (wrt. the rest system of
0375    * the colliding particles so that currentYHat() + Y() gives the
0376    * true rapidity) of the event being considered.
0377    */
0378   double currentYHat() const { return theCurrentYHat; }
0379 
0380   //@}
0381 
0382   /** @name Functions to inquire about specific cuts. */
0383   //@{
0384   /**
0385    * The minimum allowed value of \f$\hat{s}\f$.
0386    */
0387   Energy2 sHatMin() const { return max(sqr(theMHatMin), theX1Min*theX2Min*SMax()); }
0388 
0389   /**
0390    * The maximum allowed value of \f$\hat{s}\f$.
0391    */
0392   Energy2 sHatMax() const { return min(sqr(theMHatMax), theX1Max*theX2Max*SMax()); }
0393 
0394   /**
0395    * Check if the given \f$\hat{s}\f$ is within the cuts.
0396    */
0397   bool sHat(Energy2 sh) const { 
0398     return sh > sHatMin() && sh <= sHatMax()*(1.0 + 1000.0*Constants::epsilon);
0399   }
0400 
0401   /**
0402    * The minimum allowed value of \f$\sqrt{\hat{s}}\f$.
0403    */
0404   Energy mHatMin() const { return max(theMHatMin, sqrt(theX1Min*theX2Min*SMax())); }
0405 
0406   /**
0407    * The maximum allowed value of \f$\sqrt{\hat{s}}\f$.
0408    */
0409   Energy mHatMax() const { return min(theMHatMax, sqrt(theX1Max*theX2Max*SMax())); }
0410 
0411   /**
0412    * The minimum value of the rapidity of the hard sub-process
0413    * (wrt. the rest system of the colliding particles).
0414    */
0415   double yHatMin() const;
0416 
0417   /**
0418    * The maximum value of the rapidity of the hard sub-process
0419    * (wrt. the rest system of the colliding particles).
0420    */
0421   double yHatMax() const;
0422 
0423   /**
0424    * Check if the given \f$\hat{y}\f$ is within the cuts.
0425    */
0426   bool yHat(double y) const;
0427 
0428   /**
0429    * The minimum value of the positive light-cone fraction of the hard
0430    * sub-process.
0431    */
0432   double x1Min() const;
0433 
0434   /**
0435    * The maximum value of the positive light-cone fraction of the hard
0436    * sub-process.
0437    */
0438   double x1Max() const;
0439 
0440   /**
0441    * Check if the given \f$x_1\f$ is within the cuts.
0442    */
0443   bool x1(double x) const;
0444 
0445   /**
0446    * The minimum value of the negative light-cone fraction of the hard
0447    * sub-process.
0448    */
0449   double x2Min() const;
0450 
0451   /**
0452    * The maximum value of the negative light-cone fraction of the hard
0453    * sub-process.
0454    */
0455   double x2Max() const;
0456 
0457   /**
0458    * Check if the given \f$x_2\f$ is within the cuts.
0459    */
0460   bool x2(double x) const;
0461 
0462   /**
0463    * The minimum allowed value of the scale to be used in PDF's and
0464    * coupling constants.
0465    */
0466   Energy2 scaleMin() const { return theScaleMin; }
0467 
0468   /**
0469    * The maximum allowed value of the scale to be used in PDF's and
0470    * coupling constants.
0471    */
0472   Energy2 scaleMax() const { return theScaleMax; }
0473 
0474   /**
0475    * Check if the given scale is within the cuts.
0476    */
0477   bool scale(Energy2 Q2) const { return Q2 > scaleMin() && Q2 < scaleMax(); }
0478 
0479   /**
0480    * Set true if a matrix element is should be using this cut and is
0481    * mirrored along the z-axis .
0482    */
0483   bool subMirror() const { return theSubMirror; }
0484 
0485   /**
0486    * Return the overall cut weight
0487    */
0488   double cutWeight() const { return theCutWeight; }
0489 
0490   /**
0491    * Set the cut weight as appropriate from the call to the last n-cut
0492    * object.
0493    */
0494   void lastCutWeight(double w) const { theLastCutWeight = w; }
0495 
0496   /**
0497    * Return the fuzziness object
0498    */
0499   Ptr<FuzzyTheta>::tcptr fuzzy() const { return theFuzzyTheta; }
0500 
0501   /**
0502    * Check for value inside the given bounds and update the weight
0503    */
0504   template<class CutType, class Value>
0505   bool isInside(const Value& v, const Value& lower, const Value& upper, double& weight) const {
0506     if ( !fuzzy() ) {
0507       if ( v >= lower && v <= upper )
0508     return true;
0509       weight = 0.0;
0510       return false;
0511     }
0512     return fuzzy()->isInside<CutType>(v,lower,upper,weight);
0513   }
0514 
0515   /**
0516    * Check for value inside the given bounds and update the weight
0517    */
0518   template<class CutType, class Value>
0519   bool isLessThan(const Value& v, const Value& upper, double& weight) const {
0520     if ( !fuzzy() ) {
0521       if ( v <= upper )
0522     return true;
0523       weight = 0.0;
0524       return false;
0525     }
0526     return fuzzy()->isLessThan<CutType>(v,upper,weight);
0527   }
0528 
0529   /**
0530    * Check for value inside the given bounds and update the weight
0531    */
0532   template<class CutType, class Value>
0533   bool isLargerThan(const Value& v, const Value& lower, double& weight) const {
0534     if ( !fuzzy() ) {
0535       if ( v >= lower )
0536     return true;
0537       weight = 0.0;
0538       return false;
0539     }
0540     return fuzzy()->isLargerThan<CutType>(v,lower,weight);
0541   }
0542   //@}
0543 
0544 public:
0545 
0546   /**
0547    * Describe the currently active cuts in the log file.
0548    */
0549   virtual void describe() const;
0550 
0551 protected:
0552 
0553   /** @name Standard Interfaced functions. */
0554   //@{
0555   /**
0556    * Initialize this object. Called in the run phase just before
0557    * a run begins.
0558    */
0559   virtual void doinitrun();
0560   //@}
0561 
0562 public:
0563 
0564   /** @name Functions used by the persistent I/O system. */
0565   //@{
0566   /**
0567    * Function used to write out object persistently.
0568    * @param os the persistent output stream written to.
0569    */
0570   void persistentOutput(PersistentOStream & os) const;
0571 
0572   /**
0573    * Function used to read in object persistently.
0574    * @param is the persistent input stream read from.
0575    * @param version the version number of the object when written.
0576    */
0577   void persistentInput(PersistentIStream & is, int version);
0578   //@}
0579 
0580   /**
0581    * The standard Init function used to initialize the interfaces.
0582    * Called exactly once for each class by the class description system
0583    * before the main function starts or
0584    * when this class is dynamically loaded.
0585    */
0586   static void Init();
0587 
0588 protected:
0589 
0590   /** @name Clone Methods. */
0591   //@{
0592   /**
0593    * Make a simple clone of this object.
0594    * @return a pointer to the new object.
0595    */
0596   virtual IBPtr clone() const;
0597 
0598   /** Make a clone of this object, possibly modifying the cloned object
0599    * to make it sane.
0600    * @return a pointer to the new object.
0601    */
0602   virtual IBPtr fullclone() const;
0603   //@}
0604 
0605 private:
0606 
0607   /**
0608    * Helper function used by the interface.
0609    */
0610   Energy maxMHatMin() const;
0611 
0612   /**
0613    * Helper function used by the interface.
0614    */
0615   Energy minMHatMax() const;
0616 
0617   /**
0618    * Helper function used by the interface.
0619    */
0620   double maxYHatMin() const;
0621 
0622   /**
0623    * Helper function used by the interface.
0624    */
0625   double minYHatMax() const;
0626 
0627   /**
0628    * Helper function used by the interface.
0629    */
0630   double maxX1Min() const;
0631 
0632   /**
0633    * Helper function used by the interface.
0634    */
0635   double minX1Max() const;
0636 
0637   /**
0638    * Helper function used by the interface.
0639    */
0640   double maxX2Min() const;
0641 
0642   /**
0643    * Helper function used by the interface.
0644    */
0645   double minX2Max() const;
0646 
0647   /**
0648    * Helper function used by the interface.
0649    */
0650   Energy2 maxScaleMin() const;
0651 
0652   /**
0653    * Helper function used by the interface.
0654    */
0655   Energy2 minScaleMax() const;
0656 
0657 private:
0658 
0659   /**
0660    * The maximum allowed total invariant mass squared allowed for
0661    * events to be considered.
0662    */
0663   Energy2 theSMax;
0664 
0665   /**
0666    * The total rapidity of the colliding particles corresponding to
0667    * the maximum invariant mass squared, SMax().
0668    */
0669   double theY;
0670 
0671   /**
0672    * The invariant mass squared of the hard sub-process of the event
0673    * being considered.
0674    */
0675   mutable Energy2 theCurrentSHat;
0676 
0677   /**
0678    * The total rapidity of hard sub-process (wrt. the rest system of
0679    * the colliding particles so that currentYHat() + Y() gives the
0680    * true rapidity) of the event being considered.
0681    */
0682   mutable double theCurrentYHat;
0683 
0684   /**
0685    * The minimum allowed value of \f$\sqrt{\hat{s}}\f$.
0686    */
0687   Energy theMHatMin;
0688 
0689   /**
0690    * The maximum allowed value of \f$\sqrt{\hat{s}}\f$.
0691    */
0692   Energy theMHatMax;
0693 
0694   /**
0695    * The minimum value of the rapidity of the hard sub-process
0696    * (wrt. the rest system of the colliding particles).
0697    */
0698   double theYHatMin;
0699 
0700   /**
0701    * The maximum value of the rapidity of the hard sub-process
0702    * (wrt. the rest system of the colliding particles).
0703    */
0704   double theYHatMax;
0705 
0706   /**
0707    * The minimum value of the positive light-cone fraction of the hard
0708    * sub-process.
0709    */
0710   double theX1Min;
0711 
0712   /**
0713    * The maximum value of the positive light-cone fraction of the hard
0714    * sub-process.
0715    */
0716   double theX1Max;
0717 
0718   /**
0719    * The minimum value of the negative light-cone fraction of the hard
0720    * sub-process.
0721    */
0722   double theX2Min;
0723 
0724   /**
0725    * The maximum value of the negative light-cone fraction of the hard
0726    * sub-process.
0727    */
0728   double theX2Max;
0729 
0730   /**
0731    * The minimum allowed value of the scale to be used in PDF's and
0732    * coupling constants.
0733    */
0734   Energy2 theScaleMin;
0735 
0736   /**
0737    * The maximum allowed value of the scale to be used in PDF's and
0738    * coupling constants.
0739    */
0740   Energy2 theScaleMax;
0741 
0742   /**
0743    * The objects defining cuts on single outgoing partons from the
0744    * hard sub-process.
0745    */
0746   OneCutVector theOneCuts;
0747 
0748   /**
0749    * The objects defining cuts on pairs of particles in the hard
0750    * sub-process.
0751    */
0752   TwoCutVector theTwoCuts;
0753 
0754   /**
0755    * The objects defining cuts on sets of outgoing particles from the
0756    * hard sub-process.
0757    */
0758   MultiCutVector theMultiCuts;
0759 
0760   /**
0761    * An optional jet finder used to define cuts on the level of
0762    * reconstructed jets.
0763    */
0764   Ptr<JetFinder>::ptr theJetFinder;
0765 
0766   /**
0767    * Set to true if a matrix element is should be using this cut and is
0768    * mirrored along the z-axis .
0769    */
0770   mutable bool theSubMirror;
0771 
0772   /**
0773    * The overall cut weight
0774    */
0775   mutable double theCutWeight;
0776 
0777   /**
0778    * The cut weight as appropriate from the call to the last n-cut
0779    * object.
0780    */
0781   mutable double theLastCutWeight;
0782 
0783   /**
0784    * The fuzziness object
0785    */
0786   Ptr<FuzzyTheta>::ptr theFuzzyTheta;
0787 
0788 private:
0789 
0790   /**
0791    * The static object used to initialize the description of this class.
0792    * Indicates that this is a concrete class with persistent data.
0793    */
0794   static ClassDescription<Cuts> initCuts;
0795 
0796   /**
0797    * The assignment operator is private and must never be called.
0798    * In fact, it should not even be implemented.
0799    */
0800   Cuts & operator=(const Cuts &) = delete;
0801 
0802 };
0803 
0804 }
0805 
0806 #include "ThePEG/Utilities/ClassTraits.h"
0807 
0808 namespace ThePEG {
0809 
0810 /** @cond TRAITSPECIALIZATIONS */
0811 
0812 /** This template specialization informs ThePEG about the
0813  *  base classes of Cuts. */
0814 template <>
0815 struct BaseClassTrait<Cuts,1> {
0816   /** Typedef of the first base class of Cuts. */
0817   typedef Interfaced NthBase;
0818 };
0819 
0820 /** This template specialization informs ThePEG about the name of
0821  *  the Cuts class and the shared object where it is defined. */
0822 template <>
0823 struct ClassTraits<Cuts>
0824   : public ClassTraitsBase<Cuts> {
0825   /** Return a platform-independent class name */
0826   static string className() { return "ThePEG::Cuts"; }
0827 };
0828 
0829 /** @endcond */
0830 
0831 }
0832 
0833 #endif /* THEPEG_Cuts_H */