Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // OniumToOniumPiPiDecayer.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_OniumToOniumPiPiDecayer_H
0010 #define HERWIG_OniumToOniumPiPiDecayer_H
0011 //
0012 // This is the declaration of the OniumToOniumPiPiDecayer class.
0013 //
0014 
0015 #include "Herwig/Decay/DecayIntegrator.h"
0016 #include "ThePEG/Helicity/LorentzPolarizationVector.h"
0017 
0018 namespace Herwig {
0019 
0020 using namespace ThePEG;
0021 
0022 /** \ingroup Decay
0023  *  The OniumToOniumPiPiDecayer class uses the matrix element of 
0024  *  Brown and Cahn PRL35, 1 (1975) for the decay of onium resonaces to
0025  *  lighter states and pion pairs. The matrix element is given by
0026  * \f[\mathcal{M} = \epsilon'\cdot\epsilon\left[
0027  *    \mathcal{A}\left(q^2-2m^2_\pi\right)+\mathcal{B}E_1E_2\right]
0028  *    +\mathcal{C}\left((\epsilon'\cdot q_1)(\epsilon\cdot q_2)+
0029  *                     (\epsilon'\cdot q_2)(\epsilon\cdot q_1)\right),\f]
0030  * where \f$\epsilon'\f$ is the polarization vector of the decaying onium resonance,
0031  *       \f$\epsilon\f$  is the polarization vector of the outgoing onium resonance,
0032  *    \f$\mathcal{A}\f$, \f$\mathcal{B}\f$ and \f$\mathcal{C}\f$ are complex couplings,
0033  *    \f$m_\pi\f$ is the pion mass, \f$E_{1,2}\f$ are the pion energies, \f$q_{1,2}\f$ 
0034  *    are the pion momenta and \f$q\f$ is the momentum of the \f$\pi\pi\f$ system.
0035  * 
0036  * The results of hep-ex/9909038 are used for \f$\psi'\to J/\psi\f$ and arXiv:0706.2317
0037  * for \f$\Upsilon(3S)\f$ and \f$\Upsilon(2S)\f$ decays.
0038  * The remaining parameters are choosen
0039  * to approximately reproduce the distributions from hep-ex/0604031 and hep-ex/0508023.
0040  *
0041  * @see \ref OniumToOniumPiPiDecayerInterfaces "The interfaces"
0042  * defined for OniumToOniumPiPiDecayer.
0043  */
0044 class OniumToOniumPiPiDecayer: public DecayIntegrator {
0045 
0046 public:
0047 
0048   /**
0049    * The default constructor.
0050    */
0051   OniumToOniumPiPiDecayer() {
0052     // don't generate the intermediates in the phase-space
0053     generateIntermediates(false);
0054   }
0055 
0056   /**
0057    * Which of the possible decays is required
0058    * @param cc Is this mode the charge conjugate
0059    * @param parent The decaying particle
0060    * @param children The decay products
0061    */
0062   virtual int modeNumber(bool & cc, tcPDPtr parent, 
0063              const tPDVector & children) const;
0064 
0065   /**
0066    * Return the matrix element squared for a given mode and phase-space channel.
0067    * @param ichan The channel we are calculating the matrix element for. 
0068    * @param part The decaying Particle.
0069    * @param outgoing The particles produced in the decay
0070    * @param momenta  The momenta of the particles produced in the decay
0071    * @param meopt Option for the calculation of the matrix element
0072    * @return The matrix element squared for the phase-space configuration.
0073    */
0074   double me2(const int ichan,const Particle & part,
0075          const tPDVector & outgoing,
0076          const vector<Lorentz5Momentum> & momenta,
0077          MEOption meopt) const;
0078 
0079   /**
0080    *   Construct the SpinInfos for the particles produced in the decay
0081    */
0082   virtual void constructSpinInfo(const Particle & part,
0083                  ParticleVector outgoing) const;
0084 
0085   /**
0086    * Method to return an object to calculate the 3 body partial width.
0087    * @param dm The DecayMode
0088    * @return A pointer to a WidthCalculatorBase object capable of calculating the width
0089    */
0090   virtual WidthCalculatorBasePtr threeBodyMEIntegrator(const DecayMode & dm) const;
0091 
0092   /**
0093    * The matrix element to be integrated for the three-body decays as a function
0094    * of the invariant masses of pairs of the outgoing particles.
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 s3 The invariant mass squared of particles 1 and 2, \f$s_3=m^2_{12}\f$.
0098    * @param s2 The invariant mass squared of particles 1 and 3, \f$s_2=m^2_{13}\f$.
0099    * @param s1 The invariant mass squared of particles 2 and 3, \f$s_1=m^2_{23}\f$.
0100    * @param m1 The mass of the first  outgoing particle.
0101    * @param m2 The mass of the second outgoing particle.
0102    * @param m3 The mass of the third  outgoing particle.
0103    * @return The matrix element
0104    */
0105   virtual double threeBodyMatrixElement(const int imode, const Energy2 q2,
0106                     const  Energy2 s3, const Energy2 s2, const 
0107                     Energy2 s1, const Energy m1,
0108                     const Energy m2, const Energy m3) const;
0109 
0110   /**
0111    * Output the setup information for the particle database
0112    * @param os The stream to output the information to
0113    * @param header Whether or not to output the information for MySQL
0114    */
0115   virtual void dataBaseOutput(ofstream & os,bool header) const;
0116 
0117 public:
0118 
0119   /** @name Functions used by the persistent I/O system. */
0120   //@{
0121   /**
0122    * Function used to write out object persistently.
0123    * @param os the persistent output stream written to.
0124    */
0125   void persistentOutput(PersistentOStream & os) const;
0126 
0127   /**
0128    * Function used to read in object persistently.
0129    * @param is the persistent input stream read from.
0130    * @param version the version number of the object when written.
0131    */
0132   void persistentInput(PersistentIStream & is, int version);
0133   //@}
0134 
0135   /**
0136    * The standard Init function used to initialize the interfaces.
0137    * Called exactly once for each class by the class description system
0138    * before the main function starts or
0139    * when this class is dynamically loaded.
0140    */
0141   static void Init();
0142 
0143 protected:
0144 
0145   /** @name Clone Methods. */
0146   //@{
0147   /**
0148    * Make a simple clone of this object.
0149    * @return a pointer to the new object.
0150    */
0151   virtual IBPtr clone() const {return new_ptr(*this);}
0152 
0153   /** Make a clone of this object, possibly modifying the cloned object
0154    * to make it sane.
0155    * @return a pointer to the new object.
0156    */
0157   virtual IBPtr fullclone() const {return new_ptr(*this);}
0158   //@}
0159 
0160 protected:
0161 
0162   /** @name Standard Interfaced functions. */
0163   //@{
0164   /**
0165    * Initialize this object after the setup phase before saving an
0166    * EventGenerator to disk.
0167    * @throws InitException if object could not be initialized properly.
0168    */
0169   virtual void doinit();
0170 
0171   /**
0172    * Initialize this object to the begining of the run phase.
0173    */
0174   virtual void doinitrun();
0175   //@}
0176 
0177 private:
0178 
0179   /**
0180    * The assignment operator is private and must never be called.
0181    * In fact, it should not even be implemented.
0182    */
0183   OniumToOniumPiPiDecayer & operator=(const OniumToOniumPiPiDecayer &) = delete;
0184 
0185 public:
0186 
0187   /**
0188    *   Set the parameters for a decay mode
0189    */
0190   string setUpDecayMode(string arg);
0191 
0192 private:
0193 
0194   /**
0195    * the PDG codes for the incoming onium resonace
0196    */
0197   vector<long> incoming_;
0198 
0199   /**
0200    * the PDG codes for the outgoing onium resonance
0201    */
0202   vector<long> outgoing_;
0203 
0204   /**
0205    * the maximum weight for the integration
0206    */
0207   vector<double> maxWeight_;
0208 
0209   /**
0210    *  The couplings for the decays
0211    */
0212   //@{
0213   /**
0214    *  Overall normalisation
0215    */
0216   vector<double> coupling_;
0217 
0218   /**
0219    *  The complex \f$A\f$ coupling
0220    */
0221   vector<complex<InvEnergy2> > cA_;
0222 
0223   /**
0224    *  The complex \f$B\f$ coupling
0225    */
0226   vector<complex<InvEnergy2> > cB_;
0227 
0228   /**
0229    *  The complex \f$C\f$ coupling
0230    */
0231   vector<complex<InvEnergy2> > cC_;
0232   //@}
0233 
0234   /**
0235    *  Spin density matrix
0236    */
0237   mutable RhoDMatrix rho_;
0238 
0239   /**
0240    *  Polarization vectors for the incomng and outgoing onium resonances
0241    */
0242   mutable vector<Helicity::LorentzPolarizationVector> vectors_[2];
0243 
0244 };
0245 
0246 }
0247 
0248 #endif /* HERWIG_OniumToOniumPiPiDecayer_H */