Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // TensorMesonVectorVectorDecayer.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_TensorMesonVectorVectorDecayer_H
0010 #define HERWIG_TensorMesonVectorVectorDecayer_H
0011 //
0012 // This is the declaration of the TensorMesonVectorVectorDecayer class.
0013 //
0014 #include "Herwig/Decay/DecayIntegrator.h"
0015 #include "Herwig/Decay/PhaseSpaceMode.h"
0016 #include "ThePEG/Helicity/LorentzTensor.h"
0017 
0018 namespace Herwig {
0019 using namespace ThePEG; 
0020 
0021 /** \ingroup Decay
0022  *
0023  *  The TensorMesonVectorVectorDecayer class is designed to simulate
0024  *  the decay of a tensor meson to two spin-1 particles. In practice, at least
0025  *  for the light tensor mesons, this is only the decay of a tensor meson to two
0026  *  photons. In principle for bottom and charm tensors this may be the decay to
0027  *  two vector mesons an d it is used to simulate three and four body 
0028  *  \f$a_2\f$, \f$f_2\f$ and \f$K_2\f$ decays. 
0029  *  
0030  * The matrix element is
0031  *  given by \f[\mathcal{M}=\epsilon_0^{\alpha_1\alpha_2} \epsilon_1^{\beta} \epsilon_2^{\gamma} 
0032  *  \left(g_{\alpha_1\beta}+\frac{p_{1\alpha_1}p_{0\beta}{p_0\cdot p_1-m_0m_1}\right)
0033  *  \left(g_{\alpha_2\gamma}+\frac{p_{2\alpha_2}p_{0\gamma}{p_0\cdot p_2-m_0m_2}\right)\f]
0034  *  where \f$p_{0,1,2}\f$ are the momenta of the incoming pseudotensor and outgoing vector mesons, respectively,
0035  * and \f$\epsilon_{0}\f$ is the polarization tensor of the incoming pseudotensor meson and $\epslion_{1,2}$ are those of the outgoing
0036  * vector mesons.
0037  *
0038  *  The incoming tensor mesons together with their decay products and the coupling 
0039  *  \f$g\f$ can be specified using the interfaces for the class. The maximum weights
0040  *  for the decays can be calculated using the Initialize interface of the
0041  *  DecayIntegrator class or specified using the interface.
0042  *
0043  * @see DecayIntegrator
0044  * * @see \ref TensorMesonVectorVectorDecayerInterfaces "The interfaces"
0045  * defined for TensorMesonVectorVectorDecayer.
0046  *
0047  */
0048 class TensorMesonVectorVectorDecayer: public DecayIntegrator {
0049 
0050 public:
0051 
0052   /**
0053    * Which of the possible decays is required
0054    * @param cc Is this mode the charge conjugate
0055    * @param parent The decaying particle
0056    * @param children The decay products
0057    */
0058   virtual int modeNumber(bool & cc, tcPDPtr parent, 
0059              const tPDVector & children) const;
0060 
0061   /**
0062    * Return the matrix element squared for a given mode and phase-space channel.
0063    * @param ichan The channel we are calculating the matrix element for. 
0064    * @param part The decaying Particle.
0065    * @param outgoing The particles produced in the decay
0066    * @param momenta  The momenta of the particles produced in the decay
0067    * @param meopt Option for the calculation of the matrix element
0068    * @return The matrix element squared for the phase-space configuration.
0069    */
0070   double me2(const int ichan,const Particle & part,
0071          const tPDVector & outgoing,
0072          const vector<Lorentz5Momentum> & momenta,
0073          MEOption meopt) const;
0074 
0075   /**
0076    *   Construct the SpinInfos for the particles produced in the decay
0077    */
0078   virtual void constructSpinInfo(const Particle & part,
0079                  ParticleVector outgoing) const;
0080 
0081   /**
0082    * Specify the \f$1\to2\f$ matrix element to be used in the running width calculation.
0083    * @param dm The DecayMode
0084    * @param mecode The code for the matrix element as described
0085    *               in the GenericWidthGenerator class, in this case 9.
0086    * @param coupling The coupling for the matrix element.
0087    * @return True or False if this mode can be handled.
0088    */
0089   bool twoBodyMEcode(const DecayMode & dm, int & mecode, double & coupling) const;
0090 
0091   /**
0092    * Output the setup information for the particle database
0093    * @param os The stream to output the information to
0094    * @param header Whether or not to output the information for MySQL
0095    */
0096   virtual void dataBaseOutput(ofstream & os,bool header) const;
0097 
0098 public:
0099 
0100   /** @name Functions used by the persistent I/O system. */
0101   //@{
0102   /**
0103    * Function used to write out object persistently.
0104    * @param os the persistent output stream written to.
0105    */
0106   void persistentOutput(PersistentOStream & os) const;
0107 
0108   /**
0109    * Function used to read in object persistently.
0110    * @param is the persistent input stream read from.
0111    * @param version the version number of the object when written.
0112    */
0113   void persistentInput(PersistentIStream & is, int version);
0114   //@}
0115 
0116   /**
0117    * Standard Init function used to initialize the interfaces.
0118    */
0119   static void Init();
0120 
0121 protected:
0122 
0123   /** @name Clone Methods. */
0124   //@{
0125   /**
0126    * Make a simple clone of this object.
0127    * @return a pointer to the new object.
0128    */
0129   virtual IBPtr clone() const {return new_ptr(*this);}
0130 
0131   /** Make a clone of this object, possibly modifying the cloned object
0132    * to make it sane.
0133    * @return a pointer to the new object.
0134    */
0135   virtual IBPtr fullclone() const {return new_ptr(*this);}
0136   //@}
0137   
0138 protected:
0139   
0140   /** @name Standard Interfaced functions. */
0141   //@{
0142   /**
0143    * Initialize this object after the setup phase before saving and
0144    * EventGenerator to disk.
0145    * @throws InitException if object could not be initialized properly.
0146    */
0147   virtual void doinit();
0148 
0149   /**
0150    * Initialize this object to the begining of the run phase.
0151    */
0152   virtual void doinitrun();
0153   //@}
0154 
0155 private:
0156 
0157   /**
0158    * Private and non-existent assignment operator.
0159    */
0160   TensorMesonVectorVectorDecayer & operator=(const TensorMesonVectorVectorDecayer &) = delete;
0161 
0162 public:
0163 
0164   /**
0165    *   Set the parameters for a decay mode
0166    */
0167   string setUpDecayMode(string arg);
0168 
0169 private:
0170 
0171   /**
0172    * the PDG codes for the incoming particles
0173    */
0174   vector<int> incoming_;
0175 
0176   /**
0177    * the PDG codes for the outgoing particles
0178    */
0179   vector<pair<int,int> > outgoing_;
0180 
0181   /**
0182    * the coupling for the decay
0183    */
0184   vector<Energy> coupling_;
0185 
0186   /**
0187    * the maximum weight for the decay
0188    */
0189   vector<double> maxWeight_;
0190 
0191   /**
0192    *  Storage of polarization tensors to try and increase
0193    *  speed
0194    */
0195   mutable vector<Helicity::LorentzTensor<double> > tensors_;
0196 
0197   /**
0198    *  Storage of the polarization vectors 
0199    */
0200   mutable vector<Helicity::LorentzPolarizationVector > vectors_[2];
0201 
0202   /**
0203    *   Storage of the \f$\rho\f$ matrix
0204    */
0205   mutable RhoDMatrix rho_;
0206 
0207 };
0208 
0209 }
0210 
0211 #endif /* HERWIG_TensorMesonVectorVectorDecayer_H */