Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // EtaPiPiPiDecayer.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_EtaPiPiPiDecayer_H
0010 #define HERWIG_EtaPiPiPiDecayer_H
0011 // This is the declaration of the EtaPiPiPiDecayer class.
0012 
0013 #include "Herwig/Decay/DecayIntegrator.h"
0014 #include "Herwig/Decay/PhaseSpaceMode.h"
0015 
0016 namespace Herwig {
0017 using namespace ThePEG;
0018 
0019 /** \ingroup Decay
0020  *
0021  * The <code>EtaPiPiPiDecayer</code> class is designed for the simulation of
0022  * the decay of the \f$\eta\f$ or \f$\eta'\f$ to either \f$\pi^+\pi^-\pi^0\f$ 
0023  * or \f$\pi^0\pi^0\pi^0\f$ and the decay of the \f$\eta'\f$ to 
0024  * \f$\pi^+\pi^-\eta\f$ or \f$\pi^0\pi^0\eta\f$
0025  *
0026  *  The matrix element takes the form 
0027  * \f[ |\mathcal{M}|^2 = N\left[1+ay+by^2+cx^2\right],\f]
0028  *  where 
0029  * \f[x = \frac{\sqrt{3}(u-t)}{2M_0(M_0-m_1-m_2-m_3)},\f]
0030  * \f[y = \frac{(m_1+m_2+m_3)((M_0-m_3)^2-s)}{2M_0(m_1+m_2)(M_0-m_1-m_2-m_3)}-1,\f]
0031  *  where 
0032  * - \f$m_{1,2,3}\f$ are the masses of the outgoing mesons
0033  * - \f$u = (p_0-p_1)^2\f$,
0034  * - \f$t = (p_0-p_2)^2\f$,
0035  * - \f$s = (p_0-p_3)^2\f$.
0036  *
0037  *  This form is taken from hep-ph/0301058 as are the experimental results for 
0038  * the constants which are used where available and the theory results which are
0039  * used when there is no experimental data. 
0040  *
0041  * @see DecayIntegrator
0042  * 
0043  */
0044 class EtaPiPiPiDecayer: public DecayIntegrator {
0045 
0046 public:
0047 
0048   /**
0049    * Default constructor.
0050    */
0051   EtaPiPiPiDecayer() {
0052     // no intermediates
0053     generateIntermediates(false);
0054   }
0055  
0056   
0057   /**
0058    * Which of the possible decays is required
0059    * @param cc Is this mode the charge conjugate
0060    * @param parent The decaying particle
0061    * @param children The decay products
0062    */
0063   virtual int modeNumber(bool & cc, tcPDPtr parent, 
0064              const tPDVector & children) const;
0065   
0066   /**
0067    * Return the matrix element squared for a given mode and phase-space channel.
0068    * @param ichan The channel we are calculating the matrix element for. 
0069    * @param part The decaying Particle.
0070    * @param outgoing The particles produced in the decay
0071    * @param momenta  The momenta of the particles produced in the decay
0072    * @param meopt Option for the calculation of the matrix element
0073    * @return The matrix element squared for the phase-space configuration.
0074    */
0075   double me2(const int ichan,const Particle & part,
0076          const tPDVector & outgoing,
0077          const vector<Lorentz5Momentum> & momenta,
0078          MEOption meopt) const;
0079 
0080   /**
0081    *   Construct the SpinInfos for the particles produced in the decay
0082    */
0083   virtual void constructSpinInfo(const Particle & part,
0084                  ParticleVector outgoing) const;
0085 
0086   /**
0087    * Method to return an object to calculate the 3 body partial width.
0088    * @param dm The DecayMode
0089    * @return A pointer to a WidthCalculatorBase object capable of calculating the width
0090    */
0091   virtual WidthCalculatorBasePtr threeBodyMEIntegrator(const DecayMode & dm) const;
0092   
0093   /**
0094    * The differential three body decay rate with one integral performed.
0095    * @param imode The mode for which the matrix element is needed.
0096    * @param q2 The scale, \e i.e. the mass squared of the decaying particle.
0097    * @param s  The invariant mass which still needs to be integrate over.
0098    * @param m1 The mass of the first  outgoing particle.
0099    * @param m2 The mass of the second outgoing particle.
0100    * @param m3 The mass of the third  outgoing particle.
0101    * @return The differential rate \f$\frac{d\Gamma}{ds}\f$
0102    */
0103   virtual InvEnergy threeBodydGammads(const int imode, const Energy2 q2, const  Energy2 s,
0104                    const Energy m1, const Energy m2, 
0105                    const Energy m3) const;
0106 
0107   /**
0108    * Output the setup information for the particle database
0109    * @param os The stream to output the information to
0110    * @param header Whether or not to output the information for MySQL
0111    */
0112   virtual void dataBaseOutput(ofstream & os,bool header) const;
0113 
0114 public:
0115 
0116   /** @name Functions used by the persistent I/O system. */
0117   //@{
0118   /**
0119    * Function used to write out object persistently.
0120    * @param os the persistent output stream written to.
0121    */
0122   void persistentOutput(PersistentOStream & os) const;
0123 
0124   /**
0125    * Function used to read in object persistently.
0126    * @param is the persistent input stream read from.
0127    * @param version the version number of the object when written.
0128    */
0129   void persistentInput(PersistentIStream & is, int version);
0130   //@}
0131 
0132   /**
0133    * Standard Init function used to initialize the interfaces.
0134    */
0135   static void Init();
0136 
0137 protected:
0138 
0139   /** @name Clone Methods. */
0140   //@{
0141   /**
0142    * Make a simple clone of this object.
0143    * @return a pointer to the new object.
0144    */
0145   virtual IBPtr clone() const {return new_ptr(*this);}
0146 
0147   /** Make a clone of this object, possibly modifying the cloned object
0148    * to make it sane.
0149    * @return a pointer to the new object.
0150    */
0151   virtual IBPtr fullclone() const {return new_ptr(*this);}
0152   //@}
0153 
0154 protected:
0155 
0156   /** @name Standard Interfaced functions. */
0157   //@{
0158   /**
0159    * Initialize this object after the setup phase before saving and
0160    * EventGenerator to disk.
0161    * @throws InitException if object could not be initialized properly.
0162    */
0163   virtual void doinit();
0164 
0165   /**
0166    * Initialize this object to the begining of the run phase.
0167    */
0168   virtual void doinitrun();
0169   //@}
0170 
0171 private:
0172 
0173   /**
0174    * Private and non-existent assignment operator.
0175    */
0176   EtaPiPiPiDecayer & operator=(const EtaPiPiPiDecayer &) = delete;
0177 
0178 public:
0179 
0180   /**
0181    *   Set the parameters for a decay mode
0182    */
0183   string setUpDecayMode(string arg);
0184 
0185 private:
0186 
0187   /**
0188    * the id of the incoming particle
0189    */
0190   vector<int> incoming_;
0191 
0192   /**
0193    * the id of the last neutral meson
0194    */
0195   vector<int> outgoing_;
0196 
0197   /**
0198    * whether the pions are charged or neutral
0199    */
0200   vector<bool> charged_;
0201 
0202   /**
0203    * the prefactor for the decay
0204    */
0205   vector<double> prefactor_;
0206 
0207   /**
0208    * The constants for the matrix elements
0209    */
0210   //*{
0211   /**
0212    * The \f$a\f$ constant
0213    */
0214   vector<double> a_;
0215 
0216   /**
0217    * The \f$a\f$ constant
0218    */
0219   vector<double> b_;
0220 
0221   /**
0222    * The \f$a\f$ constant
0223    */
0224   vector<double> c_;
0225   //@}
0226 
0227   /**
0228    * maximum weights
0229    */
0230   vector<double> maxWeight_;
0231 
0232   /**
0233    *  Spin density matrix
0234    */
0235   mutable RhoDMatrix rho_;
0236 };
0237 
0238 }
0239 
0240 
0241 #endif /* HERWIG_EtaPiPiPiDecayer_H */