Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // DipoleSplittingInfo.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_DipoleSplittingInfo_H
0010 #define HERWIG_DipoleSplittingInfo_H
0011 //
0012 // This is the declaration of the DipoleIndex and DipoleSplittingInfo classes.
0013 //
0014 
0015 #include "ThePEG/PDF/PDF.h"
0016 #include "ThePEG/PDT/ParticleData.h"
0017 
0018 #include "Herwig/Shower/Dipole/Kinematics/DipoleSplittingKinematics.h"
0019 #include "Herwig/Shower/Dipole/Kernels/DipoleSplittingKernel.h"
0020 
0021 namespace Herwig {
0022 
0023 using namespace ThePEG;
0024 
0025 class DipoleSplittingKinematics;
0026 
0027 /**
0028  * \ingroup DipoleShower
0029  * \author Simon Platzer, Stephen Webster
0030  *
0031  * \brief DipoleIndex is used to index splitting generators
0032  * for a particular dipole.
0033  *
0034  */
0035 class DipoleIndex {
0036 
0037 public:
0038 
0039   /**
0040    * The default constructor.
0041    */
0042   DipoleIndex();
0043 
0044   /**
0045    * The standard constructor
0046    */
0047   DipoleIndex(tcPDPtr newEmitter, tcPDPtr newSpectator,
0048           const PDF& newEmitterPDF = PDF(), const PDF& newSpectatorPDF = PDF(),
0049           const bool decayingEmitter = false, const bool decayingSpectator = false,
0050           const bool offShellEmitter = false, const bool offShellSpectator = false);
0051 
0052 public:
0053 
0054   /**
0055    * Compare for equality.
0056    */
0057   bool operator ==(const DipoleIndex& x) const;
0058 
0059   /**
0060    * Compare for ordering.
0061    */
0062   bool operator <(const DipoleIndex& x) const;
0063 
0064   /**
0065    * Swap emitter and spectator.
0066    */
0067   void swap();
0068 
0069   /**
0070    * Produce a pair of dipole indices given
0071    * a particle data object for the emission.
0072    * The ME correction is ignored in the children.
0073    * The emission is inserted between the emitter
0074    * and spectator, being a spectator in the first
0075    * dipole index containing the original emitter,
0076    * and an emitter in the second dipole, containing
0077    * the original spectator.
0078    */
0079   pair<DipoleIndex,DipoleIndex> split(tcPDPtr) const;
0080 
0081 public:
0082   
0083   /**
0084    * Return the emitter particle data object.
0085    */
0086   tcPDPtr emitterData() const { return theEmitterData; }
0087 
0088   /**
0089    * Return true, if the emitter is an incoming parton
0090    */
0091   bool initialStateEmitter() const { return theInitialStateEmitter; }
0092 
0093   /**
0094    * Return true, if the emitter is incoming to a decay
0095    */
0096   bool incomingDecayEmitter() const { return theIncomingDecayEmitter; }
0097 
0098   /**
0099    * Return true, if the emitter can be off-shell
0100    */
0101   bool offShellEmitter() const { return theOffShellEmitter; }
0102   //bool offShellEmitter() const { return theEmitterData->width() != ZERO; }
0103 
0104   /**
0105    * Return the PDF object associated with the emitter
0106    */
0107   const PDF& emitterPDF() const { return theEmitterPDF; }
0108 
0109   /**
0110    * Return the spectator particle data object.
0111    */
0112   tcPDPtr spectatorData() const { return theSpectatorData; }
0113 
0114   /**
0115    * Return true, if the spectator is an incoming parton
0116    */
0117   bool initialStateSpectator() const { return theInitialStateSpectator; }
0118 
0119   /**
0120    * Return true, if the spectator is incoming to a decay
0121    */
0122   bool incomingDecaySpectator() const { return theIncomingDecaySpectator; }
0123 
0124   /**
0125    * Return true, if the spectator can be off-shell
0126    */
0127   bool offShellSpectator() const { return theOffShellSpectator; }
0128   //bool offShellSpectator() const { return theSpectatorData->width() != ZERO; }
0129 
0130   /**
0131    * Return the PDF object associated with the spectator
0132    */
0133   const PDF& spectatorPDF() const { return theSpectatorPDF; }
0134 
0135 public:
0136 
0137   /**
0138    * Put information to ostream
0139    */
0140   void print(ostream&) const;
0141 
0142 private:
0143 
0144   /**
0145    * The particle data object of the emitter.
0146    */
0147   tcPDPtr theEmitterData;
0148 
0149   /**
0150    * Whether or not the emitter is an incoming parton.
0151    */
0152   bool theInitialStateEmitter;
0153 
0154   /**
0155    * Whether or not the emitter is incoming to a decay.
0156    */
0157   bool theIncomingDecayEmitter;
0158 
0159   /**
0160    * Can the emitter be off-shell?
0161    */
0162   bool theOffShellEmitter;
0163   
0164   /**
0165    * The PDF object for the emitter.
0166    */
0167   PDF theEmitterPDF;
0168 
0169   /**
0170    * The particle data object of the spectator.
0171    */
0172   tcPDPtr theSpectatorData;
0173 
0174   /**
0175    * Whether or not the spectator is an incoming parton.
0176    */
0177   bool theInitialStateSpectator;
0178 
0179   /**
0180    * Whether or not the spectator is incoming to a decay.
0181    */
0182   bool theIncomingDecaySpectator;
0183   
0184   /**
0185    * Can the spectator be off-shell?
0186    */
0187   bool theOffShellSpectator;
0188 
0189   /**
0190    * The PDF object for the spectator.
0191    */
0192   PDF theSpectatorPDF;
0193 
0194 };
0195 
0196 inline ostream& operator << (ostream& os, const DipoleIndex& di) {
0197   di.print(os);
0198   return os;
0199 }
0200 
0201 /**
0202  * \ingroup DipoleShower
0203  * \author Simon Platzer
0204  *
0205  * \brief DipoleSplittingInfo contains all parameters to generate a full
0206  * dipole splitting.
0207  *
0208  */
0209 class DipoleSplittingInfo {
0210 
0211 public:
0212 
0213   /**
0214    * The default constructor.
0215    */
0216   DipoleSplittingInfo();
0217 
0218   /**
0219    * Destructor
0220    */
0221   virtual ~DipoleSplittingInfo() {}
0222   
0223 
0224   /**
0225    * Standard constructor.
0226    */
0227   DipoleSplittingInfo(DipoleIndex ind,pair<bool,bool> conf,double emitX,
0228                       double spectX,tPPtr emit,tPPtr spect){
0229         theIndex=ind;
0230     theConfiguration=conf;
0231     theEmitterX=emitX;
0232         theSpectatorX=spectX;
0233     theEmitter=emit;
0234     theSpectator=spect;
0235   }
0236   
0237 
0238 public:
0239 
0240   /**
0241    * Assign data from another splitting info
0242    */
0243   void fill(const DipoleSplittingInfo&);
0244 
0245 public:
0246 
0247   /**
0248    * Return the dipole index
0249    */
0250   const DipoleIndex& index() const { return theIndex; }
0251 
0252   /**
0253    * Return which of the particles
0254    * in the dipole should be considered emitter (true)
0255    * and spectator (false)
0256    */
0257   const pair<bool,bool>& configuration() const { return theConfiguration; }
0258 
0259   /**
0260    * Get the configuration marking the spectator
0261    */
0262   const pair<bool,bool>& spectatorConfiguration() const { return theSpectatorConfiguration; }
0263 
0264   /**
0265    * Return the particle data object of the emitter
0266    * after the splitting.
0267    */
0268   tcPDPtr emitterData() const { return theEmitterData; }
0269 
0270   /**
0271    * Return the particle data object of the emission
0272    * after the splitting.
0273    */
0274   tcPDPtr emissionData() const { return theEmissionData; }
0275 
0276   /**
0277    * Return the particle data object of the spectator
0278    * after the splitting.
0279    */
0280   tcPDPtr spectatorData() const { return theSpectatorData; }
0281 
0282   /**
0283    * Return the momentum fraction of the emitter.
0284    */
0285   double emitterX() const { return theEmitterX; }
0286 
0287   /**
0288    * Return the momentum fraction of the spectator.
0289    */
0290   double spectatorX() const { return theSpectatorX; }
0291 
0292 public:
0293 
0294   /**
0295    * Return a pointer to the DipoleSplittingKinematics object
0296    * which is to be used to perform the splitting.
0297    */
0298   Ptr<DipoleSplittingKinematics>::tptr splittingKinematics() const { return theSplittingKinematics; }
0299 
0300   /**
0301    * Return a pointer to the DipoleSplittingKernel object
0302    * which is used to perform the splitting.
0303    **/
0304   Ptr<DipoleSplittingKernel>::tptr splittingKernel() const { return theSplittingKernel;}
0305 
0306   /**
0307    * Return the dipole scale
0308    */
0309   Energy scale() const { return theScale; }
0310 
0311   /**
0312    * Return whether or not this dipole is 
0313    * part of a decay process.
0314    **/
0315   bool isDecayProc() const { return theIsDecayProc; }
0316 
0317   /**
0318    * Return the mass of the recoil system
0319    * in decay dipoles.
0320    */
0321   Energy recoilMass() const { return theRecoilMass; }
0322 
0323   /**
0324    * Return the spectator mass
0325    * (to cope with off-shell particles)
0326    **/
0327   Energy spectatorMass() const { return theSpectatorMass; }
0328   
0329   /**
0330    * Return the emitter mass
0331    * (to cope with off-shell particles)
0332    **/
0333   Energy emitterMass() const { return theEmitterMass; }
0334   
0335   /**
0336    * Return the pt below which this
0337    * splitting has been generated.
0338    */
0339   Energy hardPt() const { return theHardPt; }
0340 
0341   /**
0342    * Return the last generated pt
0343    */
0344   Energy lastPt() const { return theLastPt; }
0345 
0346   /**
0347    * Return the last generated momentum fraction.
0348    */
0349   double lastZ() const { return theLastZ; }
0350 
0351   /**
0352    * Return the last generated azimuthal angle.
0353    */
0354   double lastPhi() const { return theLastPhi; }
0355 
0356   /**
0357    * Return the momentum fraction, by which the emitter's
0358    * momentum fraction should be divided after the splitting.
0359    */
0360   double lastEmitterZ() const { return theLastEmitterZ; }
0361 
0362   /**
0363    * Return the momentum fraction, by which the spectator's
0364    * momentum fraction should be divided after the splitting.
0365    */
0366   double lastSpectatorZ() const { return theLastSpectatorZ; }
0367 
0368   /**
0369    * Return any additional parameters needed to
0370    * evaluate the splitting kernel or to generate the 
0371    * full splitting.
0372    */
0373   const vector<double>& lastSplittingParameters() const { return theLastSplittingParameters; }
0374 
0375   /**
0376    * Return true, if this splitting will terminate
0377    * the evolution of the dipole considered.
0378    */
0379   bool stoppedEvolving() const { return theStoppedEvolving; }
0380 
0381 public:
0382 
0383   /**
0384    * Set the index.
0385    */
0386   void index(const DipoleIndex& ind) { theIndex = ind; }
0387 
0388   /**
0389    * Set the DipoleSplittingKinematics object
0390    */
0391   void splittingKinematics(Ptr<DipoleSplittingKinematics>::tptr newSplittingKinematics) {
0392     theSplittingKinematics = newSplittingKinematics;
0393   }
0394 
0395   /**
0396    * Set the DipoleSplittingKernel object
0397    */
0398   void splittingKernel( Ptr<DipoleSplittingKernel>::tptr newSplittingKernel){
0399     theSplittingKernel = newSplittingKernel;
0400   }
0401 
0402   /**
0403    * Set the particle data object of the emitter
0404    * after the splitting.
0405    */
0406   void emitterData(tcPDPtr p) { theEmitterData = p; }
0407 
0408   /**
0409    * Set the particle data object of the emission
0410    * after the splitting.
0411    */
0412   void emissionData(tcPDPtr p) { theEmissionData = p; }
0413 
0414   /**
0415    * Set the particle data object of the spectator
0416    * after the splitting.
0417    */
0418   void spectatorData(tcPDPtr p) { theSpectatorData = p; }
0419 
0420   /**
0421    * Set the dipole scale
0422    */
0423   void scale(Energy s) { theScale = s; }
0424   
0425   /**
0426    * Set whether or not this dipole is 
0427    * part of a decay process.
0428    **/
0429   void isDecayProc(bool isDecayProc) { theIsDecayProc = isDecayProc; }
0430 
0431   /**
0432    * Set the mass of the recoil system
0433    * in decay dipoles
0434    */
0435   void recoilMass(Energy mass) { theRecoilMass = mass; }  
0436 
0437   /**
0438    * Set the spectator mass
0439    * (to cope with off-shell particles)
0440    **/
0441   void spectatorMass(Energy mass){ theSpectatorMass = mass; }
0442   
0443   /**
0444    * Set the emitter mass 
0445    * (to cope with off-shell particles)
0446    **/
0447   void emitterMass(Energy mass){ theEmitterMass = mass; }
0448   
0449   /**
0450    * Set the emitter's momentum fraction
0451    */
0452   void emitterX(double x) { theEmitterX = x; }
0453 
0454   /**
0455    * Set the spectator's momentum fraction
0456    */
0457   void spectatorX(double x) { theSpectatorX = x; }
0458 
0459   /**
0460    * Set the pt below which this
0461    * splitting has been generated.
0462    */
0463   void hardPt(Energy p) { theHardPt = p; }
0464 
0465   /**
0466    * Set the last generated pt
0467    */
0468   void lastPt(Energy p) { theLastPt = p; }
0469 
0470   /**
0471    * Set the last generated momentum fraction.
0472    */
0473   void lastZ(double z) { theLastZ = z; }
0474 
0475   /**
0476    * Set the last generated azimuthal angle.
0477    */
0478   void lastPhi(double p) { theLastPhi = p; }
0479 
0480   /**
0481    * Set the momentum fraction, by which the emitter's
0482    * momentum fraction should be divided after the splitting.
0483    */
0484   void lastEmitterZ(double z) { theLastEmitterZ = z; }
0485 
0486   /**
0487    * Set the momentum fraction, by which the spectator's
0488    * momentum fraction should be divided after the splitting.
0489    */
0490   void lastSpectatorZ(double z) { theLastSpectatorZ = z; }
0491 
0492   /**
0493    * Return the last splitting kernel value encountered.
0494    */
0495   double lastValue() const { return theLastValue; }
0496 
0497   /**
0498    * Set the last splitting kernel value encountered.
0499    */
0500   void lastValue(double v) { theLastValue = v; }
0501 
0502   /**
0503    * Set the flag to calculate the Sudakov with fixed scales.
0504    */
0505   void setCalcFixedExpansion(bool c){theCalcFixedExpansion=c;}
0506   
0507   /**
0508    * Flag to calculate the Sudakov with fixed scales.
0509    */
0510   bool calcFixedExpansion()const{ return theCalcFixedExpansion;}
0511   
0512  /**
0513    * Fixed scale for Sudakov sampling with fixed scales.
0514    */
0515   Energy fixedScale() const{return theFixedScale;}
0516   
0517  /**
0518    * Set the fixed scale.
0519    */
0520   void fixedScale(Energy fix){ theFixedScale=fix;}
0521   
0522   /**
0523    * Set the last splitting parameters.
0524    */
0525   void lastSplittingParameters(const vector<double>& p) { theLastSplittingParameters = p; }
0526 
0527   /**
0528    * Access the splitting parameters
0529    */
0530   vector<double>& splittingParameters() { return theLastSplittingParameters; }
0531 
0532   /**
0533    * Indicate that this splitting will terminate
0534    * the evolution of the dipole considered.
0535    */
0536   void didStopEvolving() { theStoppedEvolving = true; }
0537 
0538   /**
0539    * Indicate that this splitting will not terminate
0540    * the evolution of the dipole considered.
0541    */
0542   void continuesEvolving() { theStoppedEvolving = false; }
0543 
0544   /**
0545    * Reset the configuration.
0546    */
0547   void configuration(const pair<bool,bool>& newConfig) { theConfiguration = newConfig; }
0548 
0549   /**
0550    * Set the configuration marking the spectator
0551    */
0552   void spectatorConfiguration(const pair<bool,bool>& conf) { theSpectatorConfiguration = conf; }
0553 
0554 public:
0555 
0556   /**
0557    * Set a pointer to the emitter parton before emission.
0558    */
0559   void emitter(tPPtr newEmitter) { theEmitter = newEmitter; }
0560 
0561   /**
0562    * Set a pointer to the spectator parton before emission.
0563    */
0564   void spectator(tPPtr newSpectator) { theSpectator = newSpectator; }
0565 
0566   /**
0567    * Set a pointer to the emitter parton after emission.
0568    */
0569   void splitEmitter(tPPtr newEmitter) { theSplitEmitter = newEmitter; }
0570 
0571   /**
0572    * Set a pointer to the spectator parton after emission.
0573    */
0574   void splitSpectator(tPPtr newSpectator) { theSplitSpectator = newSpectator; }
0575 
0576   /**
0577    * Set a pointer to the emitted parton.
0578    */
0579   void emission(tPPtr newEmission) { theEmission = newEmission; }
0580 
0581   /**
0582    * Return a pointer to the emitter parton before emission.
0583    */
0584   tPPtr emitter() const { return theEmitter; }
0585 
0586   /**
0587    * Return a pointer to the spectator parton before emission.
0588    */
0589   tPPtr spectator() const { return theSpectator; }
0590 
0591   /**
0592    * Return a pointer to the emitter parton after emission.
0593    */
0594   tPPtr splitEmitter() const { return theSplitEmitter; }
0595 
0596   /**
0597    * Return a pointer to the spectator parton after emission.
0598    */
0599   tPPtr splitSpectator() const { return theSplitSpectator; }
0600 
0601   /**
0602    * Return a pointer to the emitted parton.
0603    */
0604   tPPtr emission() const { return theEmission; }
0605 
0606 public:
0607 
0608   /**
0609    * Put information to ostream
0610    */
0611   void print(ostream&) const;
0612 
0613 private:
0614 
0615   /**
0616    * The DipoleIndex associated 
0617    * with this splitting.
0618    */
0619   DipoleIndex theIndex;
0620 
0621   /**
0622    * Flags indicateing which of the particles
0623    * in the dipole should be considered emitter (true)
0624    * and spectator (false)
0625    */
0626   pair<bool,bool> theConfiguration;
0627 
0628   /**
0629    * The configuration marking the spectator
0630    */
0631   pair<bool,bool> theSpectatorConfiguration;
0632 
0633   /**
0634    * The particle data object of the emitter
0635    * after the splitting.
0636    */
0637   tcPDPtr theEmitterData;
0638 
0639   /**
0640    * The particle data object of the emission
0641    * after the splitting.
0642    */
0643   tcPDPtr theEmissionData;
0644 
0645   /**
0646    * The particle data object of the spectator
0647    * after the splitting.
0648    */
0649   tcPDPtr theSpectatorData;
0650 
0651   /**
0652    * A pointer to the DipoleSplittingKinematics object
0653    * which is to be used to perform the splitting.
0654    */
0655   Ptr<DipoleSplittingKinematics>::tptr theSplittingKinematics;
0656   
0657   /**
0658    * A pointer to the DipoleSplittingKernel object
0659    * which is used to perform the splitting.
0660    **/
0661   Ptr<DipoleSplittingKernel>::tptr theSplittingKernel;
0662 
0663   /**
0664    * The scale for this dipole.
0665    */
0666   Energy theScale;
0667 
0668   /**
0669    * Whether or not this dipole comes from a decay process.
0670    */
0671   bool theIsDecayProc;
0672 
0673   /**
0674    * The mass of the recoil system in
0675    * decay dipoles.
0676    */
0677   Energy theRecoilMass;
0678 
0679   /**
0680    * The mass of the emitter.
0681    * (To account for off-shell).
0682    */
0683   Energy theEmitterMass;
0684   
0685   /**
0686    * The mass of the spectator.
0687    * (To account for off-shell).
0688    */
0689   Energy theSpectatorMass;
0690 
0691   /**
0692    * The momentum fraction of the emitter.
0693    */
0694   double theEmitterX;
0695 
0696   /**
0697    * The momentum fraction of the spectator.
0698    */
0699   double theSpectatorX;
0700 
0701   /**
0702    * The pt below which this splitting has 
0703    * been generated.
0704    */
0705   Energy theHardPt;
0706 
0707   /**
0708    * The last generated pt
0709    */
0710   Energy theLastPt;
0711 
0712   /**
0713    * The last generated momentum fraction.
0714    */
0715   double theLastZ;
0716 
0717   /**
0718    * The last calculated zPrime required for massive FF
0719    * and decay kinematics dipoles.
0720    * zPrime := qi.nk / (qi+qj).nk (qj = emission momentum)
0721    */
0722   // Note: Not required in current implementation
0723   //double theLastZPrime;
0724 
0725   /**
0726    * The last generated azimuthal angle.
0727    */
0728   double theLastPhi;
0729 
0730   /**
0731    * The momentum fraction, by which the emitter's
0732    * momentum fraction should be divided after the splitting.
0733    */
0734   double theLastEmitterZ;
0735 
0736   /**
0737    * The momentum fraction, by which the spectator's
0738    * momentum fraction should be divided after the splitting.
0739    */
0740   double theLastSpectatorZ;
0741 
0742   /**
0743    * The last splitting kernel value encountered.
0744    */
0745   double theLastValue;
0746 
0747   /**
0748    * Any additional parameters needed to
0749    * evaluate the splitting kernel or to generate the 
0750    * full splitting.
0751    */
0752   vector<double> theLastSplittingParameters;
0753 
0754   /**
0755    * True, if this splitting will terminate
0756    * the evolution of the dipole considered.
0757    */
0758   bool theStoppedEvolving;
0759 
0760   /**
0761    * A pointer to the emitter parton before emission.
0762    */
0763   PPtr theEmitter;
0764 
0765   /**
0766    * A pointer to the spectator parton before emission.
0767    */
0768   PPtr theSpectator;
0769 
0770   /**
0771    * A pointer to the emitter parton after emission.
0772    */
0773   PPtr theSplitEmitter;
0774 
0775   /**
0776    * A pointer to the spectator parton after emission.
0777    */
0778   PPtr theSplitSpectator;
0779 
0780   /**
0781    * A pointer to the emitted parton.
0782    */
0783   PPtr theEmission;
0784 
0785   /**
0786    * Flag to calculate Splitting kernels with a fixed scale
0787    * and without alphas/2pi
0788    **/
0789   bool theCalcFixedExpansion;
0790   
0791   /**
0792    * Fixed scale for Sudakov evaluation.
0793    */
0794   Energy theFixedScale;
0795   
0796   
0797 
0798 };
0799 
0800 inline ostream& operator << (ostream& os, const DipoleSplittingInfo& di) {
0801   di.print(os);
0802   return os;
0803 }
0804 
0805 }
0806 
0807 #endif /* HERWIG_DipoleSplittingInfo_H */