Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // OneKaonTwoPionCurrent.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_OneKaonTwoPionCurrent_H
0010 #define HERWIG_OneKaonTwoPionCurrent_H
0011 //
0012 // This is the declaration of the OneKaonTwoPionCurrent class.
0013 //
0014 
0015 #include "WeakCurrent.h"
0016 #include "Herwig/Decay/ResonanceHelpers.h"
0017 #include <numeric>
0018 
0019 namespace Herwig {
0020 
0021 using namespace ThePEG;
0022 
0023 /**
0024  * The OneKaonTwoPionCurrent class implements the model of M. Finkemeier 
0025  * and E.~Mirkes, Z. Phys. C 69 (1996) 243 [arXiv:hep-ph/9503474],
0026  * for the weak current for three mesons where at least one of the mesons is
0027  * a kaon.
0028  *
0029  * \ingroup Decay
0030  *
0031  *  This is the base class for the three meson decays of the weak current.
0032  *  It is designed so that the currents for the following modes can be implemented
0033  *  in classes inheriting from this
0034  * - \f$    \pi^-  \pi^-    \pi^+ \f$, (imode=0)
0035  * - \f$    \pi^0  \pi^0    \pi^- \f$, (imode=1)
0036  * - \f$    K^-   \pi^-    K^+ \f$, (imode=2)
0037  * - \f$    K^0   \pi^-    \bar{K}^0\f$, (imode=3)
0038  * - \f$    K^-   \pi^0    K^0 \f$, (imode=4)
0039  * - \f$    \pi^0  \pi^0    K^- \f$, (imode=5)
0040  * - \f$    K^-   \pi^-    \pi^+ \f$, (imode=6)
0041  * - \f$    \pi^-  \bar{K}^0  \pi^0 \f$, (imode=7)
0042  * - \f$    \pi^-  \pi^0    \eta \f$, (imode=8)
0043  *
0044  * obviously there are other modes with three pseudoscalar mesons for the decay
0045  * of the weak current but this model original came from \f$\tau\f$ decay where
0046  * these are the only modes. However one case which is important is the inclusion
0047  * of the mixing in the neutral kaon sector for which we include the additional
0048  * currents
0049  * - \f$    K^0_S \pi^- K^0_S\f$, (imode=9)
0050  * - \f$    K^0_L \pi^- K^0_L\f$, (imode=10)
0051  * - \f$    K^0_S \pi^- K^0_L\f$, (imode=11)
0052  *
0053  *  In this case the current is given by
0054  *  \f[ J^\mu = \left(g^{\mu\nu}-\frac{q^\mu q^\nu}{q^2}\right)
0055  *   \left[F_1(p_2-p_3)^\mu +F_2(p_3-p_1)^\mu+F_3(p_1-p_2)^\mu\right]
0056  *  +q^\mu F_4
0057  *  +F_5\epsilon^{\mu\alpha\beta\gamma}p_1^\alpha p_2^\beta p_3^\gamma
0058  *  \f]
0059  * where
0060  * - \f$p_{1,2,3}\f$ are the momenta of the mesons in the order given above.
0061  * - \f$F_1,F_2,F_3,F_4,F_5\f$ are the form factors which must be 
0062  *  calculated in the calculateFormFactors member which should be implemented
0063  * in classes inheriting from this.
0064  *
0065  * @see WeakCurrent.
0066  *  
0067  * \author Peter Richardson
0068  * @see \ref OneKaonTwoPionCurrentInterfaces "The interfaces"
0069  * defined for OneKaonTwoPionCurrent.
0070  */
0071 class OneKaonTwoPionCurrent: public WeakCurrent {
0072 
0073 public:
0074 
0075   /**
0076    * The default constructor.
0077    */
0078   OneKaonTwoPionCurrent();
0079 
0080   /** @name Methods for the construction of the phase space integrator. */
0081   //@{
0082   /**
0083    * Complete the construction of the decay mode for integration.classes inheriting
0084    * from this one.
0085    * This method is purely virtual and must be implemented in the classes inheriting
0086    * from WeakCurrent.
0087    * @param icharge   The total charge of the outgoing particles in the current.
0088    * @param resonance If specified only include terms with this particle
0089    * @param flavour Information on the required flavours of the quarks
0090    * @param imode     The mode in the current being asked for.
0091    * @param mode      The phase space mode for the integration
0092    * @param iloc      The location of the of the first particle from the current in
0093    *                  the list of outgoing particles.
0094    * @param ires      The location of the first intermediate for the current.
0095    * @param phase     The prototype phase space channel for the integration.
0096    * @param upp       The maximum possible mass the particles in the current are
0097    *                  allowed to have.
0098    * @return Whether the current was sucessfully constructed.
0099    */
0100   virtual bool createMode(int icharge, tcPDPtr resonance,
0101               FlavourInfo flavour,
0102               unsigned int imode,PhaseSpaceModePtr mode,
0103               unsigned int iloc,int ires,
0104               PhaseSpaceChannel phase, Energy upp );
0105   //@}
0106 
0107 
0108   /**
0109    * Hadronic current. This method is purely virtual and must be implemented in
0110    * all classes inheriting from this one.
0111    * @param resonance If specified only include terms with this particle
0112    * @param flavour Information on the required flavours of the quarks
0113    * @param imode The mode
0114    * @param ichan The phase-space channel the current is needed for.
0115    * @param scale The invariant mass of the particles in the current.
0116    * @param outgoing The particles produced in the decay
0117    * @param momenta  The momenta of the particles produced in the decay
0118    * @param meopt Option for the calculation of the matrix element
0119    * @return The current. 
0120    */
0121   virtual vector<LorentzPolarizationVectorE> 
0122   current(tcPDPtr resonance,
0123       FlavourInfo flavour,
0124       const int imode, const int ichan,Energy & scale,
0125       const tPDVector & outgoing,
0126       const vector<Lorentz5Momentum> & momenta,
0127       DecayIntegrator::MEOption meopt) const;
0128 
0129   /**
0130    * Accept the decay. Checks the mesons against the list.
0131    * @param id The id's of the particles in the current.
0132    * @return Can this current have the external particles specified.
0133    */
0134   virtual bool accept(vector<int> id);
0135 
0136   /**
0137    * Return the decay mode number for a given set of particles in the current. 
0138    * Checks the mesons against the list.
0139    * @param id The id's of the particles in the current.
0140    * @return The number of the mode
0141    */
0142   virtual unsigned int decayMode(vector<int> id);
0143 
0144   /**
0145    * The particles produced by the current. This returns the mesons for the mode.
0146    * @param icharge The total charge of the particles in the current.
0147    * @param imode The mode for which the particles are being requested
0148    * @param iq The PDG code for the quark
0149    * @param ia The PDG code for the antiquark
0150    * @return The external particles for the current.
0151    */
0152   virtual tPDVector particles(int icharge, unsigned int imode, int iq, int ia);
0153   
0154   /**
0155    * Output the setup information for the particle database
0156    * @param os The stream to output the information to
0157    * @param header Whether or not to output the information for MySQL
0158    * @param create Whether or not to add a statement creating the object
0159    */
0160   virtual void dataBaseOutput(ofstream & os,bool header,bool create) const;
0161 
0162 public:
0163 
0164   /** @name Functions used by the persistent I/O system. */
0165   //@{
0166   /**
0167    * Function used to write out object persistently.
0168    * @param os the persistent output stream written to.
0169    */
0170   void persistentOutput(PersistentOStream & os) const;
0171 
0172   /**
0173    * Function used to read in object persistently.
0174    * @param is the persistent input stream read from.
0175    * @param version the version number of the object when written.
0176    */
0177   void persistentInput(PersistentIStream & is, int version);
0178   //@}
0179 
0180   /**
0181    * The standard Init function used to initialize the interfaces.
0182    * Called exactly once for each class by the class description system
0183    * before the main function starts or
0184    * when this class is dynamically loaded.
0185    */
0186   static void Init();
0187 
0188 protected:
0189 
0190   /** @name Clone Methods. */
0191   //@{
0192   /**
0193    * Make a simple clone of this object.
0194    * @return a pointer to the new object.
0195    */
0196   virtual IBPtr clone() const;
0197 
0198   /** Make a clone of this object, possibly modifying the cloned object
0199    * to make it sane.
0200    * @return a pointer to the new object.
0201    */
0202   virtual IBPtr fullclone() const;
0203   //@}
0204 
0205 protected:
0206 
0207   /**
0208    * Initialize this object after the setup phase before saving and
0209    * EventGenerator to disk.
0210    * @throws InitException if object could not be initialized properly.
0211    */
0212   virtual void doinit();
0213 
0214 private:
0215 
0216   /**
0217    * The assignment operator is private and must never be called.
0218    * In fact, it should not even be implemented.
0219    */
0220   OneKaonTwoPionCurrent & operator=(const OneKaonTwoPionCurrent &) = delete;
0221 
0222 private:
0223 
0224   /**
0225    *  The \f$\rho\f$ lineshape for the axial-vector terms
0226    * @param q2 The scale \f$q^2\f$ for the lineshape
0227    * @param ires Which \f$\rho\f$ multiplet
0228    */
0229   Complex Trho1(Energy2 q2,int ires) const {
0230     if(ires>=int(_rho1wgts.size())) return 0.;
0231     double norm = std::accumulate(_rho1wgts.begin(),_rho1wgts.end(),0.);
0232     unsigned int imin=0,imax=_rho1wgts.size();
0233     if(ires>0) {
0234       imin=ires;
0235       imax=imin+1;
0236     }
0237     Complex output(0.);
0238     for(unsigned int ix=imin;ix<imax;++ix)
0239       output+=_rho1wgts[ix]*
0240     Resonance::BreitWignerPWave(q2,_rho1mass[ix],_rho1width[ix],_mpi,_mpi);
0241     return output/norm;
0242   }
0243 
0244   /**
0245    *  The \f$K^*\f$ lineshape for the axial-vector terms
0246    * @param q2 The scale \f$q^2\f$ for the lineshape
0247    * @param ires Which \f$K^*\f$ multiplet
0248    */
0249   Complex TKstar1(Energy2 q2,int ires) const {
0250     if(ires>=int(_kstar1wgts.size())) return 0.;
0251     double norm = std::accumulate(_kstar1wgts.begin(),_kstar1wgts.end(),0.);
0252     unsigned int imin=0,imax=_kstar1wgts.size();
0253     if(ires>0) {
0254       imin=ires;
0255       imax=imin+1;
0256     }
0257     Complex output(0.);
0258     for(unsigned int ix=imin;ix<imax;++ix)
0259       output+=_kstar1wgts[ix]*
0260     Resonance::BreitWignerPWave(q2,_kstar1mass[ix],_kstar1width[ix],_mK,_mpi);
0261     return output/norm;
0262   }
0263 
0264   /**
0265    *  The \f$K^*\f$ lineshape for the vector terms
0266    * @param q2 The scale \f$q^2\f$ for the lineshape
0267    * @param ires Which \f$K^*\f$ multiplet
0268    */
0269   Complex TKstar2(Energy2 q2,int ires) const {
0270     if(ires>=int(_kstar2wgts.size())) return 0.;
0271     double norm = std::accumulate(_kstar2wgts.begin(),_kstar2wgts.end(),0.);
0272     unsigned int imin=0,imax=_kstar2wgts.size();
0273     if(ires>0) {
0274       imin=ires;
0275       imax=imin+1;
0276     }
0277     Complex output(0.);
0278     for(unsigned int ix=imin;ix<imax;++ix)
0279       output+=_kstar2wgts[ix]*
0280     Resonance::BreitWignerPWave(q2,_kstar2mass[ix],_kstar2width[ix],_mK,_mpi);
0281     return output/norm;
0282   }
0283 
0284   /**
0285    *  The \f$K_1\f$ line shape
0286    * @param q2 The scale \f$q^2\f$ for the Breit-Wigner
0287    * @param iopt Whether this is \f$K^*\pi\f$ or \f$\rho K\f$.
0288    * @param ires the resonance
0289    */
0290   Complex TK1(Energy2 q2,unsigned int iopt,int ires) const;
0291 
0292 private:
0293 
0294   /**
0295    *  Parameters for the \f$\rho\f$ in the axial-vector terms
0296    */
0297   //@{
0298   /**
0299    *  Weight for the different resonances
0300    */
0301   vector<double> _rho1wgts;
0302 
0303   /**
0304    *  Masses
0305    */
0306   vector<Energy> _rho1mass;
0307 
0308   /**
0309    *  Widths
0310    */
0311   vector<Energy> _rho1width;
0312   //@}
0313 
0314   /**
0315    *  Parameters for the \f$K^*\f$ in the axial-vector terms
0316    */
0317   //@{
0318   /**
0319    *  Weight for the different resonances
0320    */
0321   vector<double> _kstar1wgts;
0322 
0323   /**
0324    *  Masses
0325    */
0326   vector<Energy> _kstar1mass;
0327 
0328   /**
0329    *  Widths
0330    */
0331   vector<Energy> _kstar1width;
0332   //@}
0333 
0334   /**
0335    *  Parameters for the \f$K^*\f$ in the vector terms
0336    */
0337   //@{
0338   /**
0339    *  Weight for the different resonances
0340    */
0341   vector<double> _kstar2wgts;
0342 
0343   /**
0344    *  Masses
0345    */
0346   vector<Energy> _kstar2mass;
0347 
0348   /**
0349    *  Widths
0350    */
0351   vector<Energy> _kstar2width;
0352   //@}
0353 
0354   /**
0355    *  Parameters for the three meson resonances
0356    */
0357   //@{
0358 
0359   /**
0360    *  The masses of the \f$aK1\f$ resonances.
0361    */
0362   vector<Energy> _k1mass;
0363 
0364   /**
0365    *  The widths of the \f$K_1\f$ resonances.
0366    */
0367   vector<Energy> _k1width;
0368 
0369   /**
0370    *  The weights for the different \f$K_1\f$ resonances for \f$K_1\to K^*\pi\f$
0371    */
0372   vector<double> _k1wgta;
0373 
0374   /**
0375    *  The weights for the different \f$K_1\f$ resonaces for \f$K_1\to\rho K\f$.
0376    */
0377   vector<double> _k1wgtb;
0378   //@}
0379 
0380   /**
0381    * The pion decay constant, \f$f_\pi\f$.
0382    */
0383   Energy _fpi;
0384 
0385   /**
0386    * The pion mass
0387    */
0388   Energy _mpi;
0389 
0390   /**
0391    * The kaon mass
0392    */
0393   Energy _mK;
0394   //@}
0395 };
0396 
0397 }
0398 
0399 #endif /* HERWIG_OneKaonTwoPionCurrent_H */