Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // OneOffShellCalculator.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_OneOffShellCalculator_H
0010 #define HERWIG_OneOffShellCalculator_H
0011 //
0012 // This is the declaration of the OneOffShellCalculator class.
0013 //
0014 #include "GenericMassGenerator.h"
0015 #include "WidthCalculatorBase.h"
0016 #include "OneOffShellCalculator.fh"
0017 #include "Herwig/Utilities/GSLIntegrator.h"
0018 
0019 
0020 namespace Herwig {
0021 using namespace ThePEG;
0022 
0023 struct OneOffShellIntegrand;
0024 
0025 /** \ingroup PDT
0026  *
0027  *  Use another <code>WidthCalculatorBase</code> object to integrate over the
0028  *  mass of on of the external particles which can be off-shell for running
0029  *  width calculations.
0030  *
0031  * @see WidthCalculatorBase
0032  * @see OneOffShellIntegrand
0033  * 
0034  */
0035 class OneOffShellCalculator: public WidthCalculatorBase {
0036 
0037 public:
0038 
0039   /**
0040    *  The OneOffShellIntegrand is a friend to allow access to the members needed
0041    *  for the integration without making the members public.
0042    */
0043   friend struct OneOffShellIntegrand;
0044 
0045 public:
0046 
0047   /**
0048    * Constructor which should be used setting all the required members.
0049    * @param inloc The mass which is off-shell and to be integrated over.
0050    * @param inwidth Pointer to the WidthGeneratorBase object which calculates
0051    * the partial width for a given mass of the off-shell particle.
0052    * @param inmass Pointer to the GenericMassGenerator for the off-shell particle.
0053    * @param inmin The minimum mass for the off-shell particle.
0054    */
0055   OneOffShellCalculator(int inloc,WidthCalculatorBasePtr inwidth, 
0056             GenericMassGeneratorPtr inmass,
0057             Energy inmin)
0058     : _themass(inloc), _minmass(inmin),_onshellwidth(inwidth),_massptr(inmass)
0059   {}
0060 
0061   /**
0062    * member to calculate the partial width.
0063    * @param scale The mass squared for the decaying particle.
0064    * @return The partial width.
0065    */
0066   Energy partialWidth(Energy2 scale) const;
0067 
0068   /**
0069    * Get the mass of one of the decay products.  This must be 
0070    * implemented in classes inheriting from this one.
0071    * @param imass The mass required.
0072    * @param mass The new value.
0073    * @return The mass required.
0074    */
0075   void resetMass(int imass,Energy mass) {
0076     _onshellwidth->resetMass(imass,mass);
0077   }
0078 
0079   /**
0080    * Get the mass of one of the decay products.  This must be 
0081    * implemented in classes inheriting from this one.
0082    * @param imass The mass required.
0083    * @return The mass required.
0084    */
0085   Energy getMass(const int imass) const {
0086     return _onshellwidth->getMass(imass);
0087   }
0088 
0089   /**
0090    * Get the masses of all bar the one specified. Used to get the limits
0091    * for integration.
0092    * @param imass The particle not needed
0093    * @return The sum of the other masses.
0094    */
0095   Energy otherMass(const int imass) const {
0096     return _onshellwidth->otherMass(imass);
0097   }
0098 
0099 protected:
0100 
0101   /**
0102    * The integrand.
0103    * @param min The mass of the off-shell particle,
0104    * @return The differential rate.
0105    */
0106   Energy dGamma(Energy min) const {
0107     _onshellwidth->resetMass(_themass,min);
0108     Energy wgt = (_onshellwidth->partialWidth(_scale));
0109     wgt*=(_massptr->weight(min));
0110     return wgt;
0111   }
0112 
0113 private:
0114 
0115   /**
0116    * Private and non-existent assignment operator.
0117    */
0118   OneOffShellCalculator & operator=(const OneOffShellCalculator &) = delete;
0119 
0120 private:
0121 
0122   /**
0123    * which mass is offshell.
0124    */
0125   int _themass;
0126 
0127   /**
0128    * the minimum allowed mass.
0129    */
0130   Energy _minmass;
0131 
0132   /**
0133    * pointer to object calculating the on-shell width.
0134    */
0135   WidthCalculatorBasePtr _onshellwidth;
0136 
0137   /**
0138    * pointer to object calculating the mass of the particle.
0139    */
0140   GenericMassGeneratorPtr _massptr;
0141 
0142   /**
0143    * integrator
0144    */
0145   GSLIntegrator _integrator;
0146 
0147   /**
0148    * the mass squared of the decaying particle
0149    */
0150   mutable Energy2 _scale;
0151 
0152 };
0153 
0154 
0155 /** \ingroup PDT
0156  * Class for the integrand of a matrix element where one of the outgoing
0157  * particles is off-shell.This class is used by the OneOffShellCalculator class
0158  * to perform the integral.
0159  *
0160  * @see OneOffShellCalculator
0161  */
0162 struct OneOffShellIntegrand  {
0163 
0164   /**
0165    * Constructor.
0166    * @param in Pointer to the OneOffShellCalculator class this is doing the 
0167    * integration for.
0168    * @param m2 The mass squared of the off-shell particle for the Jacobian 
0169    * transform.
0170    * @param mw The mass times width of the off-shell particle for the Jacobian 
0171    * transform.
0172    */
0173   OneOffShellIntegrand(tcOneOffShellCalculatorPtr in,Energy2 m2,Energy2 mw)
0174     : _integrand(in),_mass2(m2),_mwidth(mw) 
0175   {}
0176 
0177   /**
0178    * return the value
0179    */
0180   Energy operator ()(double x) const {
0181     return _integrand->dGamma(sqrt(_mass2+_mwidth*tan(x)));
0182   }
0183   /** Argument type for the GSLIntegrator */
0184   typedef double ArgType;
0185   /** Return type for the GSLIntegrator */
0186   typedef Energy ValType;
0187 
0188   /**
0189    * pointer to the decay integrator
0190    */
0191   tcOneOffShellCalculatorPtr _integrand;
0192 
0193   /**
0194    * The mass squared for the off-shell particle for the Jacobian transform.
0195    */
0196   Energy2 _mass2;
0197 
0198   /**
0199    * The mass times width for the off-shell particle for the Jacobian transform.
0200    */
0201   Energy2 _mwidth;
0202 };
0203 }
0204 
0205 #endif /* HERWIG_OneOffShellCalculator_H */