Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // PScalarVectorFermionsDecayer.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 THEPEG_PScalarVectorFermionsDecayer_H
0010 #define THEPEG_PScalarVectorFermionsDecayer_H
0011 //
0012 // This is the declaration of the PScalarVectorFermionsDecayer class.
0013 //
0014 #include "Herwig/Decay/DecayIntegrator.h"
0015 #include "Herwig/Decay/PhaseSpaceMode.h"
0016 #include "ThePEG/Helicity/LorentzPolarizationVector.h"
0017 #include "ThePEG/Helicity/LorentzSpinorBar.h"
0018 
0019 namespace Herwig {
0020 using namespace ThePEG;
0021 
0022 /**  \ingroup Decay
0023  *
0024  * The <code>PScalarVectorFermionsDecayer</code> class is designed for the decay of a 
0025  * pseudoscalar meson to a spin-1 particle and a fermion-antifermion pair. In practice
0026  * these decays are of the form \f$\gamma\ell^+\ell^-\f$ and the propagator of
0027  * the off-shell boson is taken to be \f$\frac1{m^2_{f\bar{f}}}\f$.
0028  * There is also the option of including a vector meson dominance
0029  * form-factor.
0030  *
0031  *  In this case the matrix element is
0032  *  \f[\mathcal{M} = \frac{g}{m^2_{f\bar{f}}}
0033  *                   \epsilon^{\mu\nu\alpha\beta}p_{V\mu}\epsilon_{V\nu}
0034  *                   \bar{u}(p_f)\gamma_\alpha v(p_{\bar{f}}) p_{f\bar{f}\beta}
0035  *  \f]
0036  *  It includes the option of a vector meson dominance (VMD) type form factor  
0037  *  \f$\frac{-M^2+i\Gamma M}{(m^2_{f\bar{f}}-M^2+i\Gamma M)}\f$.
0038  *    
0039  *  The incoming pseudoscalar meson, the outgoing vector, the fermion and antifermion
0040  *  and the coupling can be specified using the relevant interfaces.
0041  *
0042  * @see DecayIntegrator
0043  * @see PScalarVectorVectorDecayer
0044  * @see PScalar4FermionsDecayer
0045  * 
0046  *  \author Peter Richardson
0047  *
0048  */
0049 class PScalarVectorFermionsDecayer: public DecayIntegrator {
0050 
0051 public:
0052 
0053   /**
0054    * Default constructor.
0055    */
0056   PScalarVectorFermionsDecayer();
0057   
0058   /**
0059    * Which of the possible decays is required
0060    * @param cc Is this mode the charge conjugate
0061    * @param parent The decaying particle
0062    * @param children The decay products
0063    */
0064   virtual int modeNumber(bool & cc, tcPDPtr parent, 
0065              const tPDVector & children) const;
0066 
0067   /**
0068    * Return the matrix element squared for a given mode and phase-space channel.
0069    * @param ichan The channel we are calculating the matrix element for. 
0070    * @param part The decaying Particle.
0071    * @param outgoing The particles produced in the decay
0072    * @param momenta  The momenta of the particles produced in the decay
0073    * @param meopt Option for the calculation of the matrix element
0074    * @return The matrix element squared for the phase-space configuration.
0075    */
0076   double me2(const int ichan,const Particle & part,
0077          const tPDVector & outgoing,
0078          const vector<Lorentz5Momentum> & momenta,
0079          MEOption meopt) const;
0080 
0081   /**
0082    *   Construct the SpinInfos for the particles produced in the decay
0083    */
0084   virtual void constructSpinInfo(const Particle & part,
0085                  ParticleVector outgoing) const;
0086 
0087   /**
0088    * Method to return an object to calculate the 3 body partial width.
0089    * @param dm The DecayMode
0090    * @return A pointer to a WidthCalculatorBase object capable of calculating the width
0091    */
0092   virtual WidthCalculatorBasePtr threeBodyMEIntegrator(const DecayMode & dm) const;
0093   
0094   /**
0095    * The differential three body decay rate with one integral performed.
0096    * @param imode The mode for which the matrix element is needed.
0097    * @param q2 The scale, \e i.e. the mass squared of the decaying particle.
0098    * @param s  The invariant mass which still needs to be integrate over.
0099    * @param m1 The mass of the first  outgoing particle.
0100    * @param m2 The mass of the second outgoing particle.
0101    * @param m3 The mass of the third  outgoing particle.
0102    * @return The differential rate \f$\frac{d\Gamma}{ds}\f$
0103    */
0104   virtual InvEnergy threeBodydGammads(const int imode, const Energy2 q2, 
0105                       const Energy2 s,
0106                       const Energy m1, const Energy m2, 
0107                       const Energy m3) const;
0108 
0109   /**
0110    * Output the setup information for the particle database
0111    * @param os The stream to output the information to
0112    * @param header Whether or not to output the information for MySQL
0113    */
0114   virtual void dataBaseOutput(ofstream & os,bool header) const;
0115 
0116 public:
0117 
0118   /** @name Functions used by the persistent I/O system. */
0119   //@{
0120   /**
0121    * Function used to write out object persistently.
0122    * @param os the persistent output stream written to.
0123    */
0124   void persistentOutput(PersistentOStream & os) const;
0125 
0126   /**
0127    * Function used to read in object persistently.
0128    * @param is the persistent input stream read from.
0129    * @param version the version number of the object when written.
0130    */
0131   void persistentInput(PersistentIStream & is, int version);
0132   //@}
0133 
0134   /**
0135    * Standard Init function used to initialize the interfaces.
0136    */
0137   static void Init();
0138 
0139 protected:
0140 
0141   /** @name Clone Methods. */
0142   //@{
0143   /**
0144    * Make a simple clone of this object.
0145    * @return a pointer to the new object.
0146    */
0147   virtual IBPtr clone() const {return new_ptr(*this);}
0148 
0149   /** Make a clone of this object, possibly modifying the cloned object
0150    * to make it sane.
0151    * @return a pointer to the new object.
0152    */
0153   virtual IBPtr fullclone() const {return new_ptr(*this);}
0154   //@}
0155 
0156 protected:
0157 
0158   /** @name Standard Interfaced functions. */
0159   //@{
0160   /**
0161    * Initialize this object after the setup phase before saving and
0162    * EventGenerator to disk.
0163    * @throws InitException if object could not be initialized properly.
0164    */
0165   virtual void doinit();
0166 
0167   /**
0168    * Initialize this object to the begining of the run phase.
0169    */
0170   virtual void doinitrun();
0171   //@}
0172 
0173 private:
0174 
0175   /**
0176    * Private and non-existent assignment operator.
0177    */
0178   PScalarVectorFermionsDecayer & operator=(const PScalarVectorFermionsDecayer &) = delete;
0179 
0180 public:
0181 
0182   /**
0183    *   Set the parameters for a decay mode
0184    */
0185   string setUpDecayMode(string arg);
0186 
0187 private:
0188 
0189   /**
0190    * coupling for a decay
0191    */
0192   vector<InvEnergy> coupling_;
0193 
0194   /**
0195    * the PDG codes for the incoming particles
0196    */
0197   vector<int> incoming_;
0198 
0199   /**
0200    * the PDG codes for the outgoing vector
0201    */
0202   vector<pair<long,long> > outgoing_;
0203 
0204   /**
0205    * maximum weight for a decay
0206    */
0207   vector<double> maxweight_;
0208 
0209   /**
0210    * Include the VMD factor
0211    */
0212   vector<int> includeVMD_;
0213 
0214   /**
0215    * PDG code for thte particle to use in the VMD factor.
0216    */
0217   vector<int> VMDid_;
0218 
0219   /**
0220    * Mass to use in the VMD factor.
0221    */
0222   vector<Energy> VMDmass_;
0223 
0224   /**
0225    * Width to use in the VMD factor.
0226    */
0227   vector<Energy> VMDwidth_;
0228   /**
0229    *  Spin density matrix
0230    */
0231   mutable RhoDMatrix rho_;
0232 
0233   /**
0234    *  Polarization vectors for the decay product
0235    */
0236   mutable vector<Helicity::LorentzPolarizationVector> vectors_;
0237 
0238   /**
0239    *  Spinors for the fermions
0240    */
0241   mutable vector<Helicity::LorentzSpinor   <SqrtEnergy> > wave_;
0242 
0243   /**
0244    *  Barred spinors for the fermions 
0245    */
0246   mutable vector<Helicity::LorentzSpinorBar<SqrtEnergy> > wavebar_;
0247 };
0248 
0249 }
0250 
0251 
0252 #endif /* THEPEG_PScalarVectorFermionsDecayer_H */