Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // XComb.h is a part of ThePEG - Toolkit for HEP Event Generation
0004 // Copyright (C) 1999-2019 Leif Lonnblad
0005 //
0006 // ThePEG 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 ThePEG_XComb_H
0010 #define ThePEG_XComb_H
0011 // This is the declaration of the XComb class.
0012 
0013 #include "ThePEG/Config/ThePEG.h"
0014 #include "ThePEG/PDF/PartonExtractor.fh"
0015 #include "ThePEG/PDF/PartonBin.h"
0016 #include "ThePEG/PDF/PartonBinInstance.h"
0017 #include "ThePEG/Utilities/AnyReference.h"
0018 #include "ThePEG/Utilities/VSelector.h"
0019 #include "ThePEG/Utilities/ClassDescription.h"
0020 #include "ThePEG/Utilities/Maths.h"
0021 #include "ThePEG/EventRecord/Particle.h"
0022 #include "ThePEG/Handlers/EventHandler.fh"
0023 #include "ThePEG/Cuts/Cuts.fh"
0024 
0025 namespace ThePEG {
0026 
0027 /**
0028  * The XComb class stores all information about the generation of a
0029  * hard sub-proces for a given pair of incoming particles, a pair of
0030  * extracted partons, total parton-parton energy squared and a
0031  * PartonExtractor object.
0032  *
0033  * When an event is generated, the objects used in the generation can
0034  * be assigned an XComb object for easy acces to the corresponding
0035  * information. To facilitate this, the corresponding classes inherits
0036  * from the LastXCombInfo class which provides the relefant access
0037  * functions.
0038  *
0039  * @see PartonExtractor
0040  * @see Cuts
0041  * @see LastXCombInfo
0042  */
0043 class XComb: public Base {
0044 
0045 public:
0046 
0047   /** @name Standard constructors and destructors. */
0048   //@{
0049   /**
0050    * Standard constructor.
0051    */
0052   XComb(Energy newMaxEnergy, const cPDPair & inc,
0053     tEHPtr newEventHandler, tPExtrPtr newExtractor, tCascHdlPtr newCKKW,
0054     const PBPair & newPartonBins,   tCutsPtr newCuts);
0055 
0056   /**
0057    * Default constructor.
0058    */
0059   XComb();
0060 
0061   /**
0062    * Destructor.
0063    */
0064   virtual ~XComb();
0065   //@}
0066 
0067 
0068 
0069   /** @name Access the assigned objects used in the generation. */
0070   //@{
0071   /**
0072    * Return a reference to the corresponding collision handler
0073    */
0074   const EventHandler & eventHandler() const { return *theEventHandler; }
0075 
0076   /**
0077    * Return a pointer to the corresponding collision handler
0078    */
0079   tEHPtr eventHandlerPtr() const { return theEventHandler; }
0080 
0081   /**
0082    * A pointer to the parton extractor.
0083    */
0084   tPExtrPtr pExtractor() const { return thePartonExtractor; }
0085 
0086   /**
0087    * A pointer to the kinematical cuts.
0088    */
0089   tCutsPtr cuts() const { return theCuts; }
0090 
0091   /**
0092    * Return a possibly null pointer to a CascadeHandler to be used for
0093    * CKKW-reweighting.
0094    */
0095   tCascHdlPtr CKKWHandler() const { return theCKKW; }
0096   //@}
0097 
0098   /** @name Access information about incoming particles and partons. */
0099   //@{
0100   /**
0101    * The incoming particle types.
0102    */
0103   const cPDPair & particles() const { return theParticles; }
0104 
0105   /**
0106    * The incoming parton types.
0107    */
0108   const cPDPair & partons() const { return thePartons; }
0109 
0110   /**
0111    * Additional information about the incoming partons.
0112    */
0113   const PBPair & partonBins() const { return thePartonBins; }
0114   
0115   /**
0116    * The maximum cm energy for this process.
0117    */
0118   Energy maxEnergy() const { return theMaxEnergy; }
0119 
0120   /**
0121    * Returns true if this XComb does not correspond to a proper
0122    * subprocess generation. I.e. if we are only generating a partial
0123    * event and the incoming particles and partons are not used
0124    * explicitly.
0125    */
0126   bool empty() const { return !theEventHandler; }
0127   //@}
0128 
0129   /** @name Manipulate and acces information about the last selected
0130       phase space point. */
0131   //@{
0132 
0133   /**
0134    * Reset all saved data about last generated phasespace point;
0135    */
0136   virtual void clean();
0137 
0138   /**
0139    * Set information about currently generated partons.
0140    */
0141   void setPartonBinInstances(PBIPair pbis, Energy2 scale);
0142 
0143   /**
0144    * Prepare this XComb for producing a sub-process.
0145    */
0146   void prepare(const PPair &);
0147 
0148   /**
0149    * Return the pair of incoming particle instances.
0150    */
0151   const PPair & lastParticles() const { return theLastParticles; }
0152 
0153   /**
0154    * Return the pair of incoming parton instances.
0155    */
0156   const PPair & lastPartons() const { return theLastPartons; }
0157 
0158   /**
0159    * Set the pair of incoming parton instances.
0160    */
0161   void lastPartons(PPair pp) { theLastPartons = pp; }
0162 
0163   /**
0164    * Return the SubProcess object corresponding to the last generated
0165    * sub-process.
0166    */
0167   tSubProPtr subProcess() const { return theSub; }
0168 
0169   /**
0170    * Set the SubProcess object corresponding to the last generated
0171    * sub-process.
0172    */
0173   void subProcess(tSubProPtr);
0174 
0175   /** A map of PartonBinInstance objects indexed by the extracted parton. */
0176   typedef map<cPPtr,PBIPtr> PartonBinInstanceMap;
0177 
0178   /**
0179    * Access the parton bin instance map (used by the parton extractor)
0180    */
0181   PartonBinInstanceMap& partonBinInstanceMap() { return thePartonBinInstanceMap; }
0182 
0183   /**
0184    * Return the parton bin instance map (used by the parton extractor)
0185    */
0186   const PartonBinInstanceMap& partonBinInstanceMap() const { return thePartonBinInstanceMap; }
0187 
0188   /**
0189    * Additional information about the incoming partons.
0190    */
0191   const PBIPair & partonBinInstances() const { return thePartonBinInstances; }
0192 
0193   /**
0194    * Additional information about the incoming partons.
0195    */
0196   PBIPair & partonBinInstances() { return thePartonBinInstances; }
0197 
0198   /**
0199    * Return the corresponding parton bin instance for a given
0200    * extracted parton.
0201    */
0202   tPBIPtr partonBinInstance(tcPPtr) const;
0203 
0204   /**
0205    * The last generated total energy squared of the incoming particles.
0206    */
0207   Energy2 lastS() const { return theLastS; }
0208 
0209   /**
0210    * Set the last generated total energy squared of the incoming
0211    * particles.
0212    */
0213   void lastS(Energy2 s) { theLastS = s; }
0214 
0215   /**
0216    * The last generated total energy squared of the incoming prtons.
0217    */
0218   Energy2 lastSHat() const { return theLastSHat; }
0219 
0220   /**
0221    * Set the last generated total energy squared of the incoming
0222    * prtons.
0223    */
0224   void lastSHat(Energy2 sh) { theLastSHat = sh; }
0225 
0226   /**
0227    * lastSHat()/lastS().
0228    */
0229   double lastTau() const { return lastSHat()/lastS(); }
0230 
0231   /**
0232    * The last generated rapidity of the hard scattering sub-system.
0233    */
0234   double lastY() const { return theLastY; }
0235 
0236   /**
0237    * Set the last generated rapidity of the hard scattering sub-system.
0238    */
0239   void lastY(double y) { theLastY = y; }
0240 
0241   /**
0242    * Log of one over the momentum fraction of the first incoming
0243    * particle w.r.t. the maximum allowed energy.
0244    */
0245   double lastP1() const { return theLastP1P2.first; }
0246 
0247   /**
0248    * Log of one over the momentum fraction of the second incoming
0249    * particle w.r.t. the maximum allowed energy.
0250    */
0251   double lastP2() const { return theLastP1P2.second; }
0252 
0253   /**
0254    * Set log of one over the momentum fraction of the incoming
0255    * particles w.r.t. the maximum allowed energy.
0256    */
0257   void lastP1P2(pair<double,double> pp) { theLastP1P2 = pp; }
0258 
0259   /**
0260    * Log of one over the first incoming parton momentum fraction
0261    * w.r.t. the first incoming particle.
0262    */
0263   double lastL1() const { return theLastL1L2.first; }
0264 
0265   /**
0266    * Log of one over the second incoming parton momentum fraction
0267    * w.r.t. the second incoming particle.
0268    */
0269   double lastL2() const { return theLastL1L2.second; }
0270 
0271   /**
0272    * Set log of one over the incoming parton momentum fractions
0273    * w.r.t. the incoming particles.
0274    */
0275   void lastL1L2(pair<double,double>);
0276 
0277   /**
0278    * The first incoming parton momentum fraction w.r.t. the
0279    * first incoming particle.
0280    */
0281   double lastX1() const { return theLastX1X2.first; }
0282 
0283   /**
0284    * The second incoming parton momentum fraction
0285    * w.r.t. the second incoming particle.
0286    */
0287   double lastX2() const { return theLastX1X2.second; }
0288 
0289   /**
0290    * Set the incoming parton momentum fractions w.r.t. the incoming
0291    * particles.
0292    */
0293   void lastX1X2(pair<double,double>);
0294 
0295   /**
0296    * Return 1-lastX1() to highest possible precision for
0297    * x\f$\rightarrow\f$ 1.
0298    */
0299   double lastE1() const { return theLastE1E2.first; }
0300 
0301   /**
0302    * Return 1-lastX2() to highest possible precision for
0303    * x\f$\rightarrow\f$ 1.
0304    */
0305   double lastE2() const { return theLastE1E2.second; }
0306 
0307   /**
0308    * Set one minus the incoming parton momentum fractions w.r.t. the
0309    * incoming particles.
0310    */
0311   void lastE1E2(pair<double,double>);
0312 
0313   /**
0314    * Get the last chosen scale of the hard scattering.
0315    */
0316   Energy2 lastScale() const { return theLastScale; }
0317 
0318   /**
0319    * Set the last chosen scale of the hard scattering.
0320    */
0321   void lastScale(Energy2 Q2) { theLastScale = Q2; }
0322 
0323   /**
0324    * Get the last chosen central scale of the hard scattering.
0325    */
0326   Energy2 lastCentralScale() const { 
0327     return 
0328       theLastCentralScale != ZERO ?
0329       theLastCentralScale :
0330       lastScale(); 
0331   }
0332 
0333   /**
0334    * Set the last chosen central scale of the hard scattering.
0335    */
0336   void lastCentralScale(Energy2 Q2) { theLastCentralScale = Q2; }
0337 
0338   /**
0339    * Get the last chosen shower scale.
0340    */
0341   Energy2 lastShowerScale() const { 
0342     return 
0343       theLastShowerScale != ZERO ?
0344       theLastShowerScale :
0345       lastCentralScale(); 
0346   }
0347 
0348   /**
0349    * Set the last chosen showr scale.
0350    */
0351   void lastShowerScale(Energy2 Q2) { theLastShowerScale = Q2; }
0352 
0353   /**
0354    * Get the \f$\alpha_S\f$ used in the hard scattering. Is negative
0355    * if no value has been set.
0356    */
0357   double lastAlphaS() const { return theLastAlphaS; }
0358 
0359   /**
0360    * Set the \f$\alpha_S\f$ used in the hard scattering.
0361    */
0362   void lastAlphaS(double a) { theLastAlphaS = a; }
0363 
0364   /**
0365    * Get the \f$\alpha_{EM}\f$ used in the hard scattering. Is negative
0366    * if no value has been set.
0367    */
0368   double lastAlphaEM() const { return theLastAlphaEM; }
0369 
0370   /**
0371    * Set the \f$\alpha_{EM}\f$ used in the hard scattering.
0372    */
0373   void lastAlphaEM(double a) { theLastAlphaEM = a; }
0374   //@}
0375 
0376 public:
0377 
0378   /**
0379    * Check for meta information
0380    */
0381   bool hasMeta(int id) const {
0382     return theMeta.find(id) != theMeta.end();
0383   }
0384 
0385   /**
0386    * Set meta information.
0387    */
0388   template<class T>
0389   void meta(int id, T& ref) {
0390     theMeta[id] = AnyReference(ref);
0391   }
0392 
0393   /**
0394    * Erase meta information.
0395    */
0396   void eraseMeta(int id) {
0397     theMeta.erase(id);
0398   }
0399 
0400   /**
0401    * Retrieve meta information.
0402    */
0403   template<class T>
0404   T& meta(int id) const {
0405     return theMeta.find(id)->second.cast<T>();
0406   }
0407 
0408   /**
0409    * Set the local parton bin info objects for this XComb.
0410    */
0411   void setPartonBinInfo();
0412 
0413   /**
0414    * Create PartonBinInstance objects for this XComb.
0415    */
0416   void createPartonBinInstances();
0417 
0418   /**
0419    * Set the pair of incoming particle instances.
0420    */
0421   void lastParticles(const PPair & p) { theLastParticles = p; }
0422 
0423   /**
0424    * Set information about currently generated partons.
0425    */
0426   void resetPartonBinInstances(const PBIPair & newBins) { thePartonBinInstances = newBins; }
0427 
0428 public:
0429 
0430   /** @name Functions used by the persistent I/O system. */
0431   //@{
0432   /**
0433    * Function used to write out object persistently.
0434    * @param os the persistent output stream written to.
0435    */
0436   void persistentOutput(PersistentOStream & os) const;
0437 
0438   /**
0439    * Function used to read in object persistently.
0440    * @param is the persistent input stream read from.
0441    * @param version the version number of the object when written.
0442    */
0443   void persistentInput(PersistentIStream & is, int version);
0444   //@}
0445 
0446   /**
0447    * Standard Init function used to initialize the interface.
0448    */
0449   static void Init();
0450 
0451 private:
0452 
0453   /**
0454    * The corresponding collision handler
0455    */
0456   tEHPtr theEventHandler;
0457 
0458   /**
0459    * A pointer to the parton extractor.
0460    */
0461   tPExtrPtr thePartonExtractor;
0462 
0463   /**
0464    * A pointer to a CascadeHandler to be used for CKKW-reweighting.
0465    */
0466   tCascHdlPtr theCKKW;
0467 
0468   /**
0469    * A pointer to the kinematical cuts used.
0470    */
0471   tCutsPtr theCuts;
0472 
0473   /**
0474    * The incoming particle types.
0475    */
0476   cPDPair theParticles;
0477 
0478   /**
0479    * The incoming parton types.
0480    */
0481   cPDPair thePartons;
0482 
0483   /**
0484    * The parton bin instance map (used by the parton extractor)
0485    */
0486   PartonBinInstanceMap thePartonBinInstanceMap;
0487 
0488   /**
0489    * Additional information about the incoming partons.
0490    */
0491   PBPair thePartonBins;
0492 
0493   /**
0494    * Additional information about the origins of the incoming partons.
0495    */
0496   PBPair theParticleBins;
0497 
0498   /**
0499    * Additional information about the incoming partons.
0500    */
0501   PBIPair thePartonBinInstances;
0502 
0503   /**
0504    * The pair of incoming particle instances.
0505    */
0506   PPair theLastParticles;
0507 
0508   /**
0509    * The pair of incoming parton instances.
0510    */
0511   PPair theLastPartons;
0512 
0513   /**
0514    * The last generated total energy squared of the incoming particles.
0515    */
0516   Energy2 theLastS;
0517 
0518   /**
0519    * The last generated total energy squared of the incoming prtons.
0520    */
0521   Energy2 theLastSHat;
0522 
0523   /**
0524    * The last rapidity of the sub process, log(x1/x2)/2.
0525    */
0526   double theLastY;
0527 
0528   /**
0529    * Log of one over the momentum fraction of the incoming particles.
0530    */
0531   DPair theLastP1P2;
0532 
0533   /**
0534    * Log of one over the incoming partons momentum fraction wrt. the
0535    * incoming particles.
0536    */
0537   DPair theLastL1L2;
0538 
0539   /**
0540    * The incoming partons momentum fraction wrt. the incoming
0541    * particles.
0542    */
0543   DPair theLastX1X2;
0544 
0545   /**
0546    * 1-lastX1() and 1-lastX2() to highest possible precision for
0547    * x\f$\rightarrow\f$ 1.
0548    */
0549   DPair theLastE1E2;
0550 
0551   /**
0552    * The last chosen scale of the hard scattering.
0553    */
0554   Energy2 theLastScale;
0555 
0556   /**
0557    * The last chosen central scale of the hard scattering.
0558    */
0559   Energy2 theLastCentralScale;
0560 
0561   /**
0562    * The last chosen shower scale.
0563    */
0564   Energy2 theLastShowerScale;
0565 
0566   /**
0567    * The \f$\alpha_S\f$ used in the hard scattering.
0568    */
0569   double theLastAlphaS;
0570 
0571   /**
0572    * The \f$\alpha_{EM}\f$ used in the hard scattering.
0573    */
0574   double theLastAlphaEM;
0575 
0576   /**
0577    * The maximum cm energy for this process.
0578    */
0579   Energy theMaxEnergy;
0580 
0581   /**
0582    * Information saved by the matrix element in the calculation of the
0583    * cross section to be used later when selecting diagrams and colour
0584    * flow.
0585    */
0586   DVector theMEInfo;
0587 
0588   /**
0589    * The SubProcess object corresponding to the last generated
0590    * sub-process.
0591    */
0592   SubProPtr theSub;
0593 
0594   /**
0595    * The meta information
0596    */
0597   map<int,AnyReference> theMeta;
0598 
0599 private:
0600 
0601   /**
0602    * Describe a concrete class with persistent data.
0603    */
0604   static ClassDescription<XComb> initXComb;
0605  
0606   /**
0607    * Private and non-existent assignment operator.
0608    */
0609   XComb & operator=(const XComb &) = delete;
0610 
0611 };
0612 
0613 /** @cond TRAITSPECIALIZATIONS */
0614 
0615 /**
0616  * This template specialization informs ThePEG about the base class of
0617  * XComb.
0618  */
0619 template <>
0620 struct BaseClassTrait<XComb,1>: public ClassTraitsType {
0621   /** Typedef of the base class of XComb. */
0622   typedef Base NthBase;
0623 };
0624 
0625 /**
0626  * This template specialization informs ThePEG about the name of the
0627  * XComb class.
0628  */
0629 template <>
0630 struct ClassTraits<XComb>:
0631     public ClassTraitsBase<XComb> {
0632   /** Return the class name. */
0633   static string className() { return "ThePEG::XComb"; }
0634 };
0635 
0636 /** @endcond */
0637 
0638 }
0639 
0640 #endif /* ThePEG_XComb_H */