Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // TwoPionPhotonCurrent.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_TwoPionPhotonCurrent_H
0010 #define HERWIG_TwoPionPhotonCurrent_H
0011 //
0012 // This is the declaration of the TwoPionPhotonCurrent class.
0013 //
0014 #include "WeakCurrent.h"
0015 
0016 namespace Herwig {
0017 using namespace ThePEG;
0018 
0019 /** \ingroup Decay
0020  *
0021  *  This class implements the decay current for \f$\pi^\pm\pi^0 \gamma\f$ via
0022  *  an intermediate \f$\omega\f$. It inherits from the <code>WeakCurrent</code>
0023  *  class and implements the hadronic current.
0024  *
0025  *  The model is based on the one used in TAUOLA, Comput.Phys.Commun.76:361-380,1993.
0026  *  The current is given by
0027  * \f[J^\mu  = e T \left\{
0028  *     \epsilon^\mu\left[ m^2_\pi      p_1\cdot p_3
0029  *                       -p_2\cdot p_3(p_2\cdot p_1-p_1\cdot p_3)\right]
0030  *     -p_2^\mu\left[p_2\cdot\epsilon p_1\cdot p_3-p_1\cdot\epsilon p_2\cdot p_3\right]
0031  *     +p_3^\mu\left[\epsilon\cdot p_2-\epsilon\cdot p_1(m^2_\pi+p_2\cdotp_3)\right]
0032  *\right\}\f]
0033  *  where
0034  * - \f$p_1\f$ is the momentum of the charged pion
0035  * - \f$p_2\f$ is the momentum of the neutral pion
0036  * - \f$p_3\f$ is the momentum of the photon
0037  * - \f$\epsilon\f$ is the polarization of the photon
0038  * - \f$e\f$ is the electric charge of the positron
0039  * and the normaliztion factor is
0040  * \f[T = F(q^2)F(0)\frac1{\sqrt{2}B_\omega(s_2)}\f]
0041  * and
0042  * \f[F(s) = \sqrt{2}F_\rho g_{\rho\omega\pi}\sum_k\sigma_k B_{\rho_k}(s)\f]
0043  * where
0044  * - \f$B_\omega(s)=\frac1{m^2_\omega-s-im_\omega\Gamma_\omega}\f$ is the Breit-Wigner for the \f$\omega\f$.
0045  * - \f$m_\omega\f$ is the mass of the \f$\omega\f$.
0046  * - \f$\Gamma_\omega \f$ is the width of the \f$\omega\f$.
0047  * - \f$F_\rho\f$ is the coupling for the conversion of the \f$\rho\f$ to a photon.
0048  * - \f$g_{\rho\omega\pi}\f$ is the coupling of \f$\rho\f$, \f$\omega\f$, \f$\pi\f$.
0049  * - \f$m_{\rho_k}\f$ is the mass of the \f$k\f$th \f$\rho\f$ resonance
0050  * - \f$B_{\rho_k}(s)=\frac1{m^2_{\rho_k}-s-im_{\rho_k}\Gamma_{\rho_k}}\f$ is the 
0051  *    Breit-Wigner for  \f${\rho_k}\f$.
0052  * - \f$m_{\rho_k}\f$ is the mass of the \f${\rho_k}\f$.
0053  * - \f$\Gamma_{\rho_k} \f$ is the width of the \f${\rho_k}\f$.
0054  *
0055  * @see WeakCurrent
0056  * 
0057  *  \author Peter Richardson
0058  *
0059  */
0060 class TwoPionPhotonCurrent: public WeakCurrent {
0061 
0062 public:
0063 
0064   /**
0065    * Default constructor
0066    */
0067   TwoPionPhotonCurrent();
0068 
0069   /** @name Functions used by the persistent I/O system. */
0070   //@{
0071   /**
0072    * Function used to write out object persistently.
0073    * @param os the persistent output stream written to.
0074    */
0075   void persistentOutput(PersistentOStream & os) const;
0076 
0077   /**
0078    * Function used to read in object persistently.
0079    * @param is the persistent input stream read from.
0080    * @param version the version number of the object when written.
0081    */
0082   void persistentInput(PersistentIStream & is, int version);
0083   //@}
0084 
0085   /**
0086    * Standard Init function used to initialize the interfaces.
0087    */
0088   static void Init();
0089 
0090 public:
0091 
0092   /** @name Methods for the construction of the phase space integrator. */
0093   //@{ 
0094   /**
0095    * Complete the construction of the decay mode for integration.classes inheriting
0096    * from this one.
0097    * This method is purely virtual and must be implemented in the classes inheriting
0098    * from WeakCurrent.
0099    * @param icharge   The total charge of the outgoing particles in the current.
0100    * @param resonance If specified only include terms with this particle
0101    * @param flavour Information on the required flavours of the quarks
0102    * @param imode     The mode in the current being asked for.
0103    * @param mode      The phase space mode for the integration
0104    * @param iloc      The location of the of the first particle from the current in
0105    *                  the list of outgoing particles.
0106    * @param ires      The location of the first intermediate for the current.
0107    * @param phase     The prototype phase space channel for the integration.
0108    * @param upp       The maximum possible mass the particles in the current are
0109    *                  allowed to have.
0110    * @return Whether the current was sucessfully constructed.
0111    */
0112   virtual bool createMode(int icharge, tcPDPtr resonance,
0113               FlavourInfo flavour,
0114               unsigned int imode,PhaseSpaceModePtr mode,
0115               unsigned int iloc,int ires,
0116               PhaseSpaceChannel phase, Energy upp );
0117 
0118   /**
0119    * The particles produced by the current. This just returns the pseudoscalar
0120    * meson.
0121    * @param icharge The total charge of the particles in the current.
0122    * @param imode The mode for which the particles are being requested
0123    * @param iq The PDG code for the quark
0124    * @param ia The PDG code for the antiquark
0125    * @return The external particles for the current.
0126    */
0127   virtual tPDVector particles(int icharge, unsigned int imode, int iq, int ia);
0128   //@}
0129 
0130   /**
0131    * Hadronic current. This method is purely virtual and must be implemented in
0132    * all classes inheriting from this one.
0133    * @param resonance If specified only include terms with this particle
0134    * @param flavour Information on the required flavours of the quarks
0135    * @param imode The mode
0136    * @param ichan The phase-space channel the current is needed for.
0137    * @param scale The invariant mass of the particles in the current.
0138    * @param outgoing The particles produced in the decay
0139    * @param momenta  The momenta of the particles produced in the decay
0140    * @param meopt Option for the calculation of the matrix element
0141    * @return The current. 
0142    */
0143   virtual vector<LorentzPolarizationVectorE> 
0144   current(tcPDPtr resonance,
0145       FlavourInfo flavour,
0146       const int imode, const int ichan,Energy & scale,
0147       const tPDVector & outgoing,
0148       const vector<Lorentz5Momentum> & momenta,
0149       DecayIntegrator::MEOption meopt) const;
0150 
0151   /**
0152    *   Construct the SpinInfo for the decay products
0153    */
0154   virtual void constructSpinInfo(ParticleVector decay) const;
0155 
0156   /**
0157    * Accept the decay. Checks the meson against the list
0158    * @param id The id's of the particles in the current.
0159    * @return Can this current have the external particles specified.
0160    */
0161   virtual bool accept(vector<int> id);
0162 
0163   /**
0164    * Return the decay mode number for a given set of particles in the current. 
0165    * Checks the meson against the list
0166    * @param id The id's of the particles in the current.
0167    * @return The number of the mode
0168    */
0169   virtual unsigned int decayMode(vector<int> id);
0170 
0171   /**
0172    * Output the setup information for the particle database
0173    * @param os The stream to output the information to
0174    * @param header Whether or not to output the information for MySQL
0175    * @param create Whether or not to add a statement creating the object
0176    */
0177   virtual void dataBaseOutput(ofstream & os,bool header,bool create) const;
0178 
0179 protected:
0180 
0181   /** @name Clone Methods. */
0182   //@{
0183   /**
0184    * Make a simple clone of this object.
0185    * @return a pointer to the new object.
0186    */
0187   virtual IBPtr clone() const {return new_ptr(*this);}
0188 
0189   /** Make a clone of this object, possibly modifying the cloned object
0190    * to make it sane.
0191    * @return a pointer to the new object.
0192    */
0193   virtual IBPtr fullclone() const {return new_ptr(*this);}
0194   //@}
0195 
0196 private:
0197 
0198   /**
0199    * Private and non-existent assignment operator.
0200    */
0201   TwoPionPhotonCurrent & operator=(const TwoPionPhotonCurrent &) = delete;
0202 
0203 private:
0204   
0205   /**
0206    * Calculate the \f$F(q^2)\f$ function at a given scale
0207    * @param q2 The scale \f$q^2\f$.
0208    * @return The value of the function. 
0209    */
0210   complex<InvEnergy> FFunction(Energy2 q2) const {
0211     complex<InvEnergy2> output(ZERO);
0212     for(unsigned int ix=0; ix<_resweights.size();++ix) {
0213       output -= _resweights[ix]*BreitWigner(q2,ix);
0214     }
0215     return output*_grho*_grhoomegapi*sqrt(2.);
0216   }
0217 
0218   /**
0219    * Fixed width Breit wigner
0220    * @param q2 The scame \f$q^2\f$
0221    * @param ires The resonance required (0,1,3) are the \f$\rho\f$'s and 10 is the 
0222    * \f$\omega\f$.
0223    * @return The breit wigner
0224    */
0225   complex<InvEnergy2> BreitWigner(Energy2 q2,unsigned int ires) const {
0226     static const Complex ii(0.,1.);
0227     complex<Energy2> denom;
0228     if(ires<_rhomasses.size()) {
0229       denom = q2-_rhomasses[ires]*_rhomasses[ires]+ii*_rhomasses[ires]*_rhowidths[ires];
0230     }
0231     else if(ires==10) {
0232       denom = q2-_omegamass*_omegamass+ii*_omegamass*_omegawidth;
0233     }
0234     else assert(false);
0235     return 1./denom;
0236   }
0237   
0238 private:
0239   
0240   /**
0241    * Coupling of the rho to the photon, \f$F_\rho\f$.
0242    */
0243   Energy2 _grho;
0244   
0245   /**
0246    * Coupling of the rho to the omega and a pion, \f$g_{\rho\omega\pi}\f$.
0247    */
0248   InvEnergy _grhoomegapi;
0249   
0250   /**
0251    * Weights of the different rho resonances in the current
0252    */
0253   vector<double> _resweights;
0254 
0255   /**
0256    * Masses of the \f$\rho\f$ resonances
0257    */
0258   vector<Energy> _rhomasses; 
0259 
0260   /**
0261    * Widths of the \f$\rho\f$ resonances
0262    */
0263   vector<Energy> _rhowidths;
0264 
0265   /**
0266    * The \f$\omega\f$ mass.
0267    */
0268   Energy _omegamass;
0269 
0270   /**
0271    * The \f$\omega\f$ width.
0272    */
0273   Energy _omegawidth;
0274 
0275   /**
0276    * Mass for the intermediate in the phase-space, this is a technical parameter to
0277    * improve the phase-space integration efficiency.
0278    */
0279   Energy _intmass;
0280 
0281   /**
0282    * Width for the intermediate in the phase-space, this is a technical parameter to
0283    * improve the phase-space integration efficiency.
0284    */
0285   Energy _intwidth; 
0286 
0287 };
0288 
0289 }
0290 
0291 
0292 #endif /* HERWIG_TwoPionPhotonCurrent_H */