Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // HwRemDecayer.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_HwRemDecayer_H
0010 #define HERWIG_HwRemDecayer_H
0011 //
0012 // This is the declaration of the HwRemDecayer class.
0013 //
0014 
0015 #include "ThePEG/PDT/RemnantDecayer.h"
0016 #include "ThePEG/Handlers/EventHandler.h"
0017 #include "ThePEG/Repository/EventGenerator.h"
0018 #include "ThePEG/EventRecord/SubProcess.h"
0019 #include "ThePEG/PDF/BeamParticleData.h"
0020 #include "Herwig/Shower/ShowerAlpha.h"
0021 #include "Herwig/PDT/StandardMatchers.h"
0022 #include "ThePEG/PDT/StandardMatchers.h"
0023 #include "HwRemDecayer.fh"
0024 
0025 namespace Herwig {
0026 using namespace ThePEG;
0027 /**
0028  * The HwRemDecayer class is responsible for the decay of the remnants. Additional 
0029  * secondary scatters have to be evolved backwards to a gluon, the
0030  * first/hard interaction has to be evolved back to a valence quark.
0031  * This is all generated inside this class,
0032  * which main methods are then called by the ShowerHandler.
0033  *
0034  * A simple forced splitting algorithm is used.
0035  * This takes the Remnant object produced from the PDF and backward
0036  * evolution (hadron - parton) and produce partons with the remaining 
0037  * flavours and with the correct colour connections.
0038  *
0039  * The algorithim operates by starting with the parton which enters the hard process.
0040  * If this is from the sea there is a forced branching to produce the antiparticle
0041  * from a gluon branching. If the parton entering the hard process was a gluon, or
0042  * a gluon was produced from the first step of the algorithm, there is then a further
0043  * branching back to a valence parton. After these partons have been produced a quark or
0044  * diquark is produced to give the remaining valence content of the incoming hadron.
0045  *
0046  * The forced branching are generated using a scale between QSpac and EmissionRange times
0047  * the minimum scale. The energy fractions are then distributed using
0048  * \f[\frac{\alpha_S}{2\pi}\frac{P(z)}{z}f(x/z,\tilde{q})\f]
0049  * with the massless splitting functions.
0050  *
0051  * \author Manuel B\"ahr
0052  *
0053  * @see \ref HwRemDecayerInterfaces "The interfaces"
0054  * defined for HwRemDecayer.
0055  */
0056 class HwRemDecayer: public RemnantDecayer {
0057 
0058 public:
0059 
0060   /** Typedef to store information about colour partners */
0061   typedef vector<pair<tPPtr, tPPtr> > PartnerMap;
0062 
0063 public:
0064 
0065   /**
0066    * The default constructor.
0067    */
0068   HwRemDecayer() : allowTop_(false), allowLeptons_(false), 
0069            multiPeriph_(true), quarkPair_(false),
0070                    ptmin_(-1.*GeV), beta_(ZERO),
0071            maxtrySoft_(10), 
0072            colourDisrupt_(1.0),
0073            ladderbFactor_(0.0),
0074            ladderPower_(-0.08),
0075            ladderNorm_(1.0),
0076            ladderMult_(1.0),
0077            gaussWidth_(0.1),
0078            valOfN_(0), 
0079            initTotRap_(0),
0080            _kinCutoff(0.75*GeV), 
0081            _forcedSplitScale(2.5*GeV),
0082            _range(1.1), _zbin(0.05),_ybin(0.),
0083            _nbinmax(100), DISRemnantOpt_(0),
0084                    PtDistribution_(0),
0085            pomeronStructure_(0), mg_(ZERO) {}
0086 
0087   /** @name Virtual functions required by the Decayer class. */
0088   //@{
0089   /**
0090    * Check if this decayer can perfom the decay specified by the
0091    * given decay mode.
0092    * @return true if this decayer can handle the given mode, otherwise false.
0093    */
0094   virtual bool accept(const DecayMode &) const {
0095     return true;
0096   }
0097 
0098   /**
0099    * Return true if this decayer can handle the extraction of the \a   
0100    * extracted parton from the given \a particle.   
0101    */  
0102   virtual bool canHandle(tcPDPtr particle, tcPDPtr parton) const;
0103   
0104   /**   
0105    * Return true if this decayed can extract more than one parton from   
0106    * a particle.   
0107    */  
0108   virtual bool multiCapable() const {  
0109     return true;
0110   }
0111   
0112   /**
0113    * Perform a decay for a given DecayMode and a given Particle instance.
0114    * @param dm the DecayMode describing the decay.
0115    * @param p the Particle instance to be decayed.
0116    * @param step the step we are working on.
0117    * @return a ParticleVector containing the decay products.
0118    */
0119   virtual ParticleVector decay(const DecayMode & dm, const Particle & p, Step & step) const;
0120   //@}
0121 
0122 public:
0123 
0124   /** 
0125    * struct that is used to catch exceptions which are thrown
0126    * due to energy conservation issues of additional soft scatters
0127    */
0128   struct ExtraSoftScatterVeto {};
0129 
0130   /** @name Functions used by the persistent I/O system. */
0131   //@{
0132   /**
0133    * Function used to write out object persistently.
0134    * @param os the persistent output stream written to.
0135    */
0136   void persistentOutput(PersistentOStream & os) const;
0137 
0138   /**
0139    * Function used to read in object persistently.
0140    * @param is the persistent input stream read from.
0141    * @param version the version number of the object when written.
0142    */
0143   void persistentInput(PersistentIStream & is, int version);
0144   //@}
0145 
0146   /**
0147    * The standard Init function used to initialize the interfaces.
0148    * Called exactly once for each class by the class description system
0149    * before the main function starts or
0150    * when this class is dynamically loaded.
0151    */
0152   static void Init();
0153 
0154   /**
0155    * Do several checks and initialization, for remnantdecay inside ShowerHandler.
0156    */
0157   void initialize(pair<tRemPPtr, tRemPPtr> rems, tPPair beam, Step & step,
0158           Energy forcedSplitScale);
0159 
0160   /**
0161    * Initialize the soft scattering machinery.
0162    * @param ptmin = the pt cutoff used in the UE model
0163    * @param beta = slope of the soft pt-spectrum
0164    */
0165   void initSoftInteractions(Energy ptmin, InvEnergy2 beta);
0166 
0167   /**
0168    * Perform the acual forced splitting.
0169    * @param partons is a pair of ThePEG::Particle pointers which store the final 
0170    * partons on which the shower ends.
0171    * @param pdfs are pointers to the pdf objects for both beams
0172    * @param first is a flage wether or not this is the first or a secondary interation
0173    */
0174   void doSplit(pair<tPPtr, tPPtr> partons, pair<tcPDFPtr, tcPDFPtr> pdfs, bool first);
0175 
0176   /**
0177    * Perform the final creation of the diquarks. Set the remnant masses and do 
0178    * all colour connections.
0179    * @param colourDisrupt = variable to control how many "hard" scatters
0180    * are colour isolated
0181    * @param softInt = parameter for the number of soft scatters
0182    */
0183   void finalize(double colourDisrupt=0.0, unsigned int softInt=0);
0184 
0185   /**
0186    *  Find the children
0187    */
0188   void findChildren(tPPtr,vector<PPtr> &) const;
0189 
0190 protected:
0191 
0192   /** @name Clone Methods. */
0193   //@{
0194   /**
0195    * Make a simple clone of this object.
0196    * @return a pointer to the new object.
0197    */
0198   virtual IBPtr clone() const {return new_ptr(*this);}
0199 
0200   /** Make a clone of this object, possibly modifying the cloned object
0201    * to make it sane.
0202    * @return a pointer to the new object.
0203    */
0204   virtual IBPtr fullclone() const {return new_ptr(*this);}
0205   //@}
0206 
0207 protected:
0208 
0209   /** @name Standard Interfaced functions. */
0210   //@{
0211   /**
0212    * Initialize this object after the setup phase before saving an
0213    * EventGenerator to disk.
0214    * @throws InitException if object could not be initialized properly.
0215    */
0216   virtual void doinit() {
0217     Interfaced::doinit();
0218     _ybin=0.25/_zbin;
0219     mg_ = getParticleData(ParticleID::g)->constituentMass();
0220   }
0221   //@}
0222 
0223 private:
0224 
0225   /**
0226    * The assignment operator is private and must never be called.
0227    * In fact, it should not even be implemented.
0228    */
0229   HwRemDecayer & operator=(const HwRemDecayer &) = delete;
0230 
0231 public:
0232   
0233   /**                                                                           
0234    * Simple struct to store info about baryon quark and di-quark                
0235    * constituents.                                                              
0236    */                                                                           
0237   struct HadronContent {
0238 
0239     /**
0240      * manually extract the valence flavour \a id.
0241      */
0242     inline void extract(int id) {
0243       for(unsigned int i=0; i<flav.size(); i++) {
0244     if(id == sign*flav[i]){
0245       if(hadron->id() == ParticleID::gamma || 
0246          (hadron->id() == ParticleID::pomeron && pomeronStructure==1) ||
0247          hadron->id() == ParticleID::reggeon) {
0248         flav[0] =  id;
0249         flav[1] = -id;
0250         extracted = 0;
0251         flav.resize(2);
0252       }
0253       else if (hadron->id() == ParticleID::pomeron && pomeronStructure==0) {
0254         extracted = 0;
0255       }
0256       else {
0257         extracted = i;
0258       }
0259       break;
0260     }
0261       }      
0262     }
0263     
0264     /**
0265      * Return a proper particle ID assuming that \a id has been removed
0266      * from the hadron.
0267      */
0268     long RemID() const;
0269 
0270     /**
0271      * Method to determine whether \a parton is a quark from the sea.
0272      * @return TRUE if \a parton is neither a valence quark nor a gluon.
0273      */
0274     bool isSeaQuark(tcPPtr parton) const {
0275       return ((parton->id() != ParticleID::g) && ( !isValenceQuark(parton) ) );
0276     }
0277 
0278     /**
0279      * Method to determine whether \a parton is a valence quark.
0280      */
0281     bool isValenceQuark(tcPPtr parton) const {
0282       return isValenceQuark(parton->id());
0283     }
0284 
0285     /**
0286      * Method to determine whether \a parton is a quark from the sea.
0287      * @return TRUE if \a parton is neither a valence quark nor a gluon.
0288      */
0289     bool isSeaQuarkData(tcPDPtr partonData) const {
0290       return ((partonData->id() != ParticleID::g) && ( !isValenceQuarkData(partonData) ) );
0291     }
0292 
0293     /**
0294      * Method to determine whether \a parton is a valence quark.
0295      */
0296     bool isValenceQuarkData(tcPDPtr partonData) const {
0297       int id(sign*partonData->id());
0298       return find(flav.begin(),flav.end(),id) != flav.end();
0299     }
0300 
0301     /**
0302      * Method to determine whether \a parton is a valence quark.
0303      */
0304     bool isValenceQuark(int id) const {
0305       return find(flav.begin(),flav.end(),sign*id) != flav.end();
0306     }
0307 
0308     /** The valence flavours of the corresponding baryon. */                    
0309     vector<int> flav;                                                           
0310 
0311     /** The array index of the extracted particle. */
0312     int extracted;
0313 
0314     /** -1 if the particle is an anti-particle. +1 otherwise. */                
0315     int sign;
0316 
0317     /** The ParticleData objects of the hadron */
0318     tcPDPtr hadron;
0319 
0320     /** Pomeron treatment */
0321     unsigned int pomeronStructure;
0322   }; 
0323 
0324   /**
0325    * Return the hadron content objects for the incoming particles.
0326    */
0327   const pair<HadronContent, HadronContent>& content() const {
0328     return theContent;
0329   }
0330 
0331   /**
0332    * Return a HadronContent struct from a PPtr to a hadron.
0333    */
0334   HadronContent getHadronContent(tcPPtr hadron) const;
0335 
0336   /**
0337    * Set the hadron contents.
0338    */
0339   void setHadronContent(tPPair beam) {
0340     theContent.first  = getHadronContent(beam.first);
0341     theContent.second = getHadronContent(beam.second);
0342   }
0343 
0344 private:
0345 
0346   /**
0347    * Do the forced Splitting of the Remnant with respect to the 
0348    * extracted parton \a parton.
0349    * @param parton = PPtr to the parton going into the subprocess.
0350    * @param content = HadronContent struct to keep track of flavours.
0351    * @param rem = Pointer to the ThePEG::RemnantParticle.
0352    * @param used = Momentum vector to keep track of remaining momenta.
0353    * @param partners = Vector of pairs filled with tPPtr to the particles 
0354    * which should be colour connected.
0355    * @param pdf pointer to the PDF Object which is used for this particle
0356    * @param first = Flag for the first interaction.
0357    */
0358   void split(tPPtr parton, HadronContent & content, tRemPPtr rem, 
0359          Lorentz5Momentum & used, PartnerMap & partners, tcPDFPtr pdf, bool first);
0360 
0361   /**
0362    * Merge the colour lines of two particles
0363    * @param p1 = Pointer to particle 1
0364    * @param p2 = Pointer to particle 2
0365    * @param anti = flag to indicate, if (anti)colour was extracted as first parton.
0366    */
0367   void mergeColour(tPPtr p1, tPPtr p2, bool anti) const;
0368 
0369   /**
0370    * Set the colour connections.
0371    * @param partners = Object that holds the information which particles to connect.
0372    * @param anti = flag to indicate, if (anti)colour was extracted as first parton.
0373    * @param disrupt parameter for disruption of the colour structure
0374    */
0375   void fixColours(PartnerMap partners, bool anti, double disrupt) const;
0376 
0377   /**
0378    * Set the momenta of the Remnants properly and boost the decay particles.
0379    */
0380   void setRemMasses(PPair diquarks) const;
0381 
0382   /**
0383    * This creates a parton from the remaining flavours of the hadron. The
0384    * last parton used was a valance parton, so only 2 (or 1, if meson) flavours
0385    * remain to be used.
0386    */
0387   PPtr finalSplit(const tRemPPtr rem, long remID,
0388           Lorentz5Momentum usedMomentum) const {
0389     // Create the remnant and set its momentum, also reset all of the decay 
0390     // products from the hadron
0391     PPtr remnant = new_ptr(Particle(getParticleData(remID)));
0392     Lorentz5Momentum prem(rem->momentum()-usedMomentum);
0393     prem.setMass(getParticleData(remID)->constituentMass());
0394     prem.rescaleEnergy();
0395     remnant->set5Momentum(prem);
0396     // Add the remnant to the step, but don't do colour connections
0397     thestep->addDecayProduct(rem,remnant,false);
0398     return remnant;
0399   }
0400   
0401 
0402   /**
0403    * This takes the particle and find a splitting for np -> p + child and 
0404    * creates the correct kinematics and connects for such a split. This
0405    * Splitting has an upper bound on qtilde given by the energy argument
0406    * @param rem The Remnant
0407    * @param child The PDG code for the outgoing particle
0408    * @param oldQ  The maximum scale for the evolution
0409    * @param oldx  The fraction of the hadron's momentum carried by the last parton
0410    * @param pf    The momentum of the last parton at input and after branching at output
0411    * @param p     The total emitted momentum
0412    * @param content The content of the hadron
0413    */
0414   PPtr forceSplit(const tRemPPtr rem, long child, Energy &oldQ, double &oldx, 
0415           Lorentz5Momentum &pf, Lorentz5Momentum &p,
0416           HadronContent & content) const;
0417 
0418   /**
0419    *  Check if a particle is a parton from a hadron or not
0420    * @param parton The parton to be tested
0421    */
0422   bool isPartonic(tPPtr parton) const;
0423 
0424   /** @name Soft interaction methods. */
0425   //@{
0426 
0427   /**
0428    * Produce pt values according to dN/dp_T = N p_T exp(-beta_*p_T^2)
0429    */
0430   Energy softPt() const;
0431 
0432   /**
0433    * Get the 2 pairs of 5Momenta for the scattering. Needs calling of
0434    * initSoftInteractions.
0435    */
0436   void softKinematics(Lorentz5Momentum &r1, Lorentz5Momentum &r2, 
0437               Lorentz5Momentum &g1, Lorentz5Momentum &g2) const;
0438 
0439   /**
0440    * Create N soft gluon interactions
0441    */
0442   void doSoftInteractions(unsigned int N){
0443     if(!multiPeriph_){
0444         doSoftInteractions_old(N);} //outdated model for soft interactions
0445     else{
0446                 doSoftInteractions_multiPeriph(N); // Multiperipheral model
0447     }
0448   }
0449   
0450   /**
0451    * Create N soft gluon interactions (old version)
0452    */
0453   void doSoftInteractions_old(unsigned int N);
0454   
0455   /**
0456    * Create N soft gluon interactions with multiperhpheral kinematics
0457    */
0458   void doSoftInteractions_multiPeriph(unsigned int N);
0459 
0460   /**
0461    * Phase space generation for the ladder partons
0462    */
0463   bool doPhaseSpaceGenerationGluons(vector<Lorentz5Momentum> &softGluons, Energy energy, unsigned int &its)
0464     const;
0465 
0466   /**
0467    * This returns the rotation matrix needed to rotate p into the z axis
0468    */
0469   LorentzRotation rotate(const LorentzMomentum &p) const;
0470 
0471    /**
0472     * Methods to generate random distributions also all stolen form UA5Handler
0473     **/
0474 
0475   template <typename T>
0476   inline T gaussDistribution(T mean, T stdev) const{
0477     double x = rnd();
0478     x = sqrt(-2.*log(x));
0479     double y;
0480     randAzm(x,x,y);
0481     return mean + stdev*x;
0482   }
0483 
0484 
0485   /**
0486    * This returns a random number with a flat distribution
0487    * [-A,A] plus gaussian tail with stdev B 
0488    * TODO: Should move this to Utilities
0489    * @param A The width of the flat part
0490    * @param B The standard deviation of the gaussian tail
0491    * @return the randomly generated value
0492    */
0493   inline double randUng(double A, double B) const{
0494     double prun;
0495     if(A == 0.) prun = 0.;
0496     else prun = 1./(1.+B*1.2533/A);
0497     if(rnd() < prun) return 2.*(rnd()-0.5)*A;
0498     else {
0499       double temp = gaussDistribution(0.,B);
0500       if(temp < 0) return temp - abs(A);
0501       else return temp + abs(A);
0502     }
0503   }
0504   template <typename T>
0505   inline void randAzm(T pt, T &px, T &py) const{
0506     double c,s,cs;
0507     while(true) {
0508       c = 2.*rnd()-1.;
0509       s = 2.*rnd()-1.;
0510       cs = c*c+s*s;
0511       if(cs <= 1.&&cs!=0.) break;
0512     }
0513     T qt = pt/cs;
0514     px = (c*c-s*s)*qt;
0515     py = 2.*c*s*qt;
0516   }
0517 
0518   inline Energy randExt(Energy AM0,InvEnergy B) const{
0519     double r = rnd();
0520     // Starting value
0521     Energy am = AM0-log(r)/B;
0522     for(int i = 1; i<20; ++i) {
0523       double a = exp(-B*(am-AM0))/(1.+B*AM0);
0524       double f = (1.+B*am)*a-r;
0525       InvEnergy df = -B*B*am*a;
0526       Energy dam = -f/df;
0527       am += dam;
0528       if(am<AM0) am = AM0 + .001*MeV;
0529       if(abs(dam) < .001*MeV) break;
0530     }
0531     return am;
0532   }
0533 
0534   /**
0535    * Method to add a particle to the step
0536    * @param parent = pointer to the parent particle
0537    * @param id = Particle ID of the newly created particle
0538    * @param p = Lorentz5Momentum of the new particle
0539    */
0540   tPPtr addParticle(tcPPtr parent, long id, Lorentz5Momentum p) const;
0541   //@}
0542 
0543   /**
0544    * A flag which indicates, whether the extracted valence quark was a 
0545    * anti particle.
0546    */
0547   pair<bool, bool> theanti;
0548 
0549   /**
0550    * variable to sum up the x values of the extracted particles
0551    */
0552   pair<double, double> theX;
0553 
0554   /**Pair of HadronContent structs to know about the quark content of the beams*/
0555   pair<HadronContent, HadronContent> theContent;
0556 
0557   /**Pair of Lorentz5Momentum to keep track of the forced splitting product momenta*/
0558   pair<Lorentz5Momentum, Lorentz5Momentum> theUsed;
0559 
0560   /**
0561    * Pair of PartnerMap's to store the particles, which will be colour
0562    * connected in the end.
0563    */
0564   pair<PartnerMap, PartnerMap> theMaps;
0565 
0566   /**
0567    * Variable to hold a pointer to the current step. The variable is used to 
0568    * determine, wether decay(const DecayMode & dm, const Particle & p, Step & step) 
0569    * has been called in this event or not.
0570    */
0571   StepPtr thestep;
0572 
0573   /**
0574    * Pair of Remnant pointers. This is needed to boost
0575    * in the Remnant-Remnant CMF after all have been decayed.
0576    */
0577   pair<RemPPtr, RemPPtr> theRems;
0578 
0579   /**
0580    *  The beam particle data for the current incoming hadron
0581    */
0582   mutable tcPPtr theBeam;
0583 
0584   /**
0585    *  the beam data
0586    */
0587   mutable Ptr<BeamParticleData>::const_pointer theBeamData;
0588 
0589   /** 
0590    *  The PDF for the current initial-state shower 
0591    */ 
0592   mutable tcPDFPtr _pdf; 
0593   
0594 private:
0595 
0596   /**
0597    *  Switch to control handling of top quarks in proton
0598    */
0599   bool allowTop_;
0600   
0601   /**
0602    *  Switch to control handling of charged leptons in proton
0603    */
0604   bool allowLeptons_;
0605   
0606   /**
0607    *  Switch to control using multiperipheral kinemaics
0608    */
0609   bool multiPeriph_;
0610   
0611   /**
0612    *  True if kinematics is to be calculated for quarks
0613    */
0614   bool quarkPair_;
0615 
0616   /** @name Soft interaction variables. */
0617   //@{
0618 
0619   /**
0620    * Pair of soft Remnant pointers, i.e. Diquarks.
0621    */
0622   tPPair softRems_;
0623 
0624   /**
0625    * ptcut of the UE model
0626    */
0627   Energy ptmin_;
0628 
0629   /**
0630    * slope of the soft pt-spectrum: dN/dp_T = N p_T exp(-beta*p_T^2)
0631    */
0632   InvEnergy2 beta_;
0633 
0634   /**
0635    *  Maximum number of attempts for the regeneration of an additional
0636    *  soft scattering, before the number of scatters is reduced.
0637    */
0638   unsigned int maxtrySoft_;
0639 
0640   /**
0641    * Variable to store the relative number of colour disrupted
0642    * connections to additional soft subprocesses.
0643    */
0644   double colourDisrupt_;
0645   
0646   /**
0647    * Variable to store the additive factor of the 
0648    multiperipheral ladder multiplicity.
0649    */
0650   double ladderbFactor_;
0651   
0652   /**
0653    * Variable of the parameterization of the ladder multiplicity.
0654    */
0655   double ladderPower_;
0656 
0657   /**
0658    * Variable of the parameterization of the ladder multiplicity.
0659    */
0660   double ladderNorm_;
0661 
0662   double ladderMult_;
0663   /**
0664    * Variable to store the gaussian width of the 
0665    * fluctuation of the longitudinal momentum
0666    * fraction.
0667    */
0668   double gaussWidth_;
0669   
0670   /**
0671    * Variable to store the current total multiplicity 
0672    of a ladder.
0673    */
0674   double valOfN_;
0675   
0676   /**
0677    * Variable to store the initial total rapidity between 
0678    of the remnants.
0679    */
0680   double initTotRap_;
0681 
0682   //@}
0683 
0684   /** @name Forced splitting variables. */
0685   //@{
0686 
0687   /**
0688    *  The kinematic cut-off
0689    */
0690   Energy _kinCutoff;
0691   
0692   /**
0693    * The PDF freezing scale as set in ShowerHandler
0694    */
0695   Energy _forcedSplitScale;
0696 
0697   /**
0698    *  Range for emission
0699    */
0700   double _range;
0701 
0702   /**
0703    *  Size of the bins in z for the interpolation
0704    */
0705   double _zbin;
0706 
0707   /**
0708    *  Size of the bins in y for the interpolation
0709    */
0710   double _ybin;
0711 
0712   /**
0713    *  Maximum number of bins for the z interpolation
0714    */
0715   int _nbinmax;
0716 
0717   /**
0718    *  Pointer to the object calculating the QCD coupling
0719    */
0720   ShowerAlphaPtr _alphaS;
0721 
0722   /**
0723    *  Pointer to the object calculating the QED coupling
0724    */
0725   ShowerAlphaPtr _alphaEM; 
0726 
0727   /**
0728    *  Option for the DIS remnant
0729    */
0730   unsigned int DISRemnantOpt_;
0731 
0732   /**
0733    *  Option for the pT generation
0734    */
0735   unsigned int PtDistribution_;
0736 
0737   /**
0738    *  Option for the treatment of the pomeron structure
0739    */
0740   unsigned int pomeronStructure_;
0741   //@}
0742 
0743   /**
0744    * The gluon constituent mass.
0745    */
0746   Energy mg_;
0747 
0748 };
0749 
0750 
0751 }
0752 
0753 #endif /* HERWIG_HwRemDecayer_H */