Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // a1SimpleDecayer.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_a1SimpleDecayer_H
0010 #define HERWIG_a1SimpleDecayer_H
0011 //
0012 // This is the declaration of the a1SimpleDecayer class.
0013 //
0014 
0015 #include "Herwig/Decay/DecayIntegrator.h"
0016 #include "Herwig/Decay/PhaseSpaceMode.h"
0017 #include "ThePEG/Helicity/LorentzPolarizationVector.h"
0018 #include "Herwig/Decay/ResonanceHelpers.h"
0019 
0020 namespace Herwig {
0021 
0022 using namespace ThePEG;
0023 
0024 /**
0025  * The a1SimpleDecayer class provides a simple model of the decay of the
0026  * \f$a_1\f$ meson to three pions including \f$\rho\f$ meson intermediate states.
0027  *
0028  * @see \ref a1SimpleDecayerInterfaces "The interfaces"
0029  * defined for a1SimpleDecayer.
0030  */
0031 class a1SimpleDecayer: public DecayIntegrator {
0032 
0033 public:
0034 
0035   /**
0036    * The default constructor.
0037    */
0038   a1SimpleDecayer();
0039 
0040   /**
0041    * Which of the possible decays is required
0042    * @param cc Is this mode the charge conjugate
0043    * @param parent The decaying particle
0044    * @param children The decay products
0045    */
0046   virtual int modeNumber(bool & cc, tcPDPtr parent, 
0047              const tPDVector & children) const;
0048 
0049   /**
0050    * Return the matrix element squared for a given mode and phase-space channel.
0051    * @param ichan The channel we are calculating the matrix element for. 
0052    * @param part The decaying Particle.
0053    * @param outgoing The particles produced in the decay
0054    * @param momenta  The momenta of the particles produced in the decay
0055    * @param meopt Option for the calculation of the matrix element
0056    * @return The matrix element squared for the phase-space configuration.
0057    */
0058   double me2(const int ichan,const Particle & part,
0059          const tPDVector & outgoing,
0060          const vector<Lorentz5Momentum> & momenta,
0061          MEOption meopt) const;
0062 
0063   /**
0064    *   Construct the SpinInfos for the particles produced in the decay
0065    */
0066   virtual void constructSpinInfo(const Particle & part,
0067                  ParticleVector outgoing) const;
0068 
0069   /**
0070    * Method to return an object to calculate the 3 body partial width.
0071    * @param dm The DecayMode
0072    * @return A pointer to a WidthCalculatorBase object capable of calculating the width
0073    */
0074   virtual WidthCalculatorBasePtr threeBodyMEIntegrator(const DecayMode & dm) const;
0075 
0076   /**
0077    * The matrix element to be integrated for the three-body decays as a function
0078    * of the invariant masses of pairs of the outgoing particles.
0079    * @param imode The mode for which the matrix element is needed.
0080    * @param q2 The scale, \e i.e. the mass squared of the decaying particle.
0081    * @param s3 The invariant mass squared of particles 1 and 2, \f$s_3=m^2_{12}\f$.
0082    * @param s2 The invariant mass squared of particles 1 and 3, \f$s_2=m^2_{13}\f$.
0083    * @param s1 The invariant mass squared of particles 2 and 3, \f$s_1=m^2_{23}\f$.
0084    * @param m1 The mass of the first  outgoing particle.
0085    * @param m2 The mass of the second outgoing particle.
0086    * @param m3 The mass of the third  outgoing particle.
0087    * @return The matrix element
0088    */
0089   virtual double threeBodyMatrixElement(const int imode , const Energy2 q2,
0090                     const Energy2 s3, const Energy2 s2,
0091                     const Energy2 s1, const Energy  m1,
0092                     const Energy  m2, const Energy m3) const;
0093 
0094   /**
0095    * Output the setup information for the particle database
0096    * @param os The stream to output the information to
0097    * @param header Whether or not to output the information for MySQL
0098    */
0099   virtual void dataBaseOutput(ofstream & os,bool header) const;
0100 
0101 public:
0102 
0103   /** @name Functions used by the persistent I/O system. */
0104   //@{
0105   /**
0106    * Function used to write out object persistently.
0107    * @param os the persistent output stream written to.
0108    */
0109   void persistentOutput(PersistentOStream & os) const;
0110 
0111   /**
0112    * Function used to read in object persistently.
0113    * @param is the persistent input stream read from.
0114    * @param version the version number of the object when written.
0115    */
0116   void persistentInput(PersistentIStream & is, int version);
0117   //@}
0118 
0119   /**
0120    * The standard Init function used to initialize the interfaces.
0121    * Called exactly once for each class by the class description system
0122    * before the main function starts or
0123    * when this class is dynamically loaded.
0124    */
0125   static void Init();
0126 
0127 protected:
0128 
0129   /** @name Clone Methods. */
0130   //@{
0131   /**
0132    * Make a simple clone of this object.
0133    * @return a pointer to the new object.
0134    */
0135   virtual IBPtr clone() const  {return new_ptr(*this);}
0136 
0137   /** Make a clone of this object, possibly modifying the cloned object
0138    * to make it sane.
0139    * @return a pointer to the new object.
0140    */
0141   virtual IBPtr fullclone() const {return new_ptr(*this);}
0142   //@}
0143 
0144 
0145 protected:
0146 
0147   /** @name Standard Interfaced functions. */
0148   //@{
0149   /**
0150    * Initialize this object after the setup phase before saving an
0151    * EventGenerator to disk.
0152    * @throws InitException if object could not be initialized properly.
0153    */
0154   virtual void doinit();
0155 
0156   /**
0157    * Initialize this object. Called in the run phase just before
0158    * a run begins.
0159    */
0160   virtual void doinitrun();
0161   //@}
0162 
0163 private:
0164   
0165   /**
0166    * The \f$\rho\f$ form factors
0167    * @param q2 The scale \f$q^2\f$ for the Breit-Wigner
0168    * @param ires Which \f$\rho\f$ multiplet
0169    * @return The form factor
0170    */
0171   Complex rhoFormFactor(Energy2 q2,int ires) const {
0172     Complex output(0.),norm(0.);
0173     for(unsigned int ix=0;ix<3;++ix) norm += _rhowgts[ix];
0174     if(ires<0) {
0175       for(unsigned int ix=0;ix<3;++ix)
0176     output+=_rhowgts[ix]*Resonance::BreitWignerPWave(q2,_rhomass[ix],_rhowidth[ix],_mpi,_mpi);
0177     }
0178     else {
0179       assert(ires<3);
0180       output=_rhowgts[ires]*Resonance::BreitWignerPWave(q2,_rhomass[ires],_rhowidth[ires],_mpi,_mpi);
0181     }
0182     return output/norm;
0183   }
0184 
0185 private:
0186 
0187   /**
0188    * The assignment operator is private and must never be called.
0189    * In fact, it should not even be implemented.
0190    */
0191   a1SimpleDecayer & operator=(const a1SimpleDecayer &) = delete;
0192 
0193 private:
0194 
0195   /**
0196    * The \f$\rho\f$ masses
0197    */
0198   vector<Energy> _rhomass;
0199   
0200   /**
0201    * The \f$\rho\f$ widths
0202    */
0203   vector<Energy> _rhowidth;
0204 
0205   /**
0206    * Weights for the different \f$\rho\f$ resonances 
0207    */
0208   vector<double> _rhowgts;
0209 
0210   /**
0211    *  Use local values of the parameters
0212    */
0213   bool _localparameters;
0214 
0215   /**
0216    *  The overall coupling for the decay
0217    */
0218   InvEnergy _coupling;
0219 
0220   /**
0221    * Maximum weight for the one charged pion channel.
0222    */
0223   double _onemax;
0224 
0225   /**
0226    * Maximum weight for the two charged pion channel.
0227    */
0228   double _twomax;
0229 
0230   /**
0231    * Maximum weight for the three charged pion channel.
0232    */
0233   double _threemax;
0234   
0235   /**
0236    * Weights for the channels for the one charged pion channel.
0237    */
0238   vector<double> _onewgts;
0239   
0240   /**
0241    * Weights for the channels for the two charged pion channel.
0242    */
0243   vector<double> _twowgts;
0244   
0245   /**
0246    * Weights for the channels for the three charged pion channel.
0247    */
0248   vector<double> _threewgts;
0249 
0250   /**
0251    * The pion mass
0252    */
0253   Energy _mpi;
0254 
0255   /**
0256    *  Spin Density matrix
0257    */
0258   mutable RhoDMatrix _rho;
0259 
0260   /**
0261    *  Polarization vectors
0262    */
0263   mutable vector<Helicity::LorentzPolarizationVector> _vectors;
0264 
0265 };
0266 
0267 }
0268 
0269 #endif /* HERWIG_a1SimpleDecayer_H */