Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // MatchboxXCombData.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_MatchboxXCombData_H
0010 #define Herwig_MatchboxXCombData_H
0011 //
0012 // This is the declaration of the MatchboxXCombData class.
0013 //
0014 
0015 // work around a Boost 1.64 bug where ublas headers would fail otherwise
0016 #include <boost/version.hpp>
0017 #if (BOOST_VERSION / 100 >= 1064)
0018 #include <boost/serialization/array_wrapper.hpp>
0019 #endif
0020 
0021 #include <boost/numeric/ublas/matrix.hpp>
0022 #include <boost/numeric/ublas/matrix_sparse.hpp>
0023 #include <boost/numeric/ublas/symmetric.hpp>
0024 #include <boost/numeric/ublas/vector.hpp>
0025 
0026 #include "ThePEG/MatrixElement/MEBase.h"
0027 #include "Herwig/MatrixElement/Matchbox/MatchboxFactory.fh"
0028 #include "Herwig/MatrixElement/Matchbox/Base/MatchboxMEBase.fh"
0029 #include "Herwig/MatrixElement/Matchbox/Dipoles/SubtractionDipole.fh"
0030 #include "Herwig/Models/StandardModel/StandardModel.h"
0031 
0032 #include "ThePEG/Persistency/PersistentOStream.fh"
0033 #include "ThePEG/Persistency/PersistentIStream.fh"
0034 
0035 namespace Herwig {
0036 
0037   using namespace ThePEG;
0038 
0039   /**
0040    * \ingroup Matchbox
0041    * \author Simon Platzer
0042    *
0043    * \brief Define complex vector from boost::uBLAS
0044    */
0045   typedef boost::numeric::ublas::vector<Complex> CVector;
0046 
0047   /**
0048    * \ingroup Matchbox
0049    * \author Simon Platzer
0050    *
0051    * \brief Define how amplitudes are stored
0052    */
0053   typedef map<vector<int>,CVector> AmplitudeMap;
0054 
0055   /**
0056    * \ingroup Matchbox
0057    * \author Simon Platzer
0058    *
0059    * \brief Define amplitude iterators
0060    */
0061   typedef map<vector<int>,CVector>::iterator AmplitudeIterator;
0062 
0063   /**
0064    * \ingroup Matchbox
0065    * \author Simon Platzer
0066    *
0067    * \brief Define amplitude const iterators
0068    */
0069   typedef map<vector<int>,CVector>::const_iterator AmplitudeConstIterator;
0070 
0071   /**
0072    * \ingroup Matchbox
0073    * \author Simon Platzer
0074    *
0075    * \brief Matchbox extensions to StandardXComb
0076    */
0077   class MatchboxXCombData {
0078 
0079   public:
0080 
0081     /** @name Standard constructors and destructors. */
0082     //@{
0083     /**
0084      * Standard constructor.
0085      */
0086     explicit MatchboxXCombData(tMEPtr newME);
0087 
0088     /**
0089      * Default constructor.
0090      */
0091     MatchboxXCombData();
0092 
0093     /**
0094      * Destructor.
0095      */
0096     virtual ~MatchboxXCombData();
0097 
0098     //@}
0099 
0100   public:
0101 
0102     /**
0103      * Reset all cache flags
0104      */
0105     void flushCaches();
0106 
0107   public:
0108 
0109     /**
0110      * Get the factory
0111      */
0112     Ptr<MatchboxFactory>::tcptr factory() const;
0113 
0114     /**
0115      * Get the matrix element; may return null
0116      */
0117     Ptr<MatchboxMEBase>::tptr matchboxME() const;
0118 
0119     /**
0120      * Get the dipole; may return null
0121      */
0122     Ptr<SubtractionDipole>::tptr subtractionDipole() const;
0123 
0124     /**
0125      * The crossing information as filled by the last call to
0126      * fillCrossingMap()
0127      */
0128     const vector<int>& crossingMap() const { return theCrossingMap; }
0129 
0130     /**
0131      * The crossing information as filled by the last call to
0132      * fillCrossingMap()
0133      */
0134     vector<int>& crossingMap() { return theCrossingMap; }
0135 
0136     /**
0137      * The colour crossing information as filled by the last call to
0138      * fillCrossingMap()
0139      */
0140     const map<size_t,size_t>& amplitudeToColourMap() const { return theAmplitudeToColourMap; }
0141 
0142     /**
0143      * The colour crossing information as filled by the last call to
0144      * fillCrossingMap()
0145      */
0146     map<size_t,size_t>& amplitudeToColourMap() { return theAmplitudeToColourMap; }
0147 
0148     /**
0149      * The colour crossing information as filled by the last call to
0150      * fillCrossingMap()
0151      */
0152     const map<size_t,size_t>& colourToAmplitudeMap() const { return theColourToAmplitudeMap; }
0153 
0154     /**
0155      * The colour crossing information as filled by the last call to
0156      * fillCrossingMap()
0157      */
0158     map<size_t,size_t>& colourToAmplitudeMap() { return theColourToAmplitudeMap; }
0159 
0160     /**
0161      * The crossing sign as filled by the last call to
0162      * fillCrossingMap()
0163      */
0164     double crossingSign() const { return theCrossingSign; }
0165 
0166     /**
0167      * The crossing sign as filled by the last call to
0168      * fillCrossingMap()
0169      */
0170     void crossingSign(double c) { theCrossingSign = c; }
0171 
0172     /**
0173      * The last renormalization scale
0174      */
0175     Energy2 lastRenormalizationScale() const { return theLastRenormalizationScale; }
0176 
0177     /**
0178      * The last renormalization scale
0179      */
0180     void lastRenormalizationScale(Energy2 lrs) { theLastRenormalizationScale = lrs; }
0181 
0182     /**
0183      * The amplitude parton data.
0184      */
0185     const cPDVector& amplitudePartonData() const { return theAmplitudePartonData; }
0186 
0187     /**
0188      * The amplitude parton data.
0189      */
0190     cPDVector& amplitudePartonData() { return theAmplitudePartonData; }
0191 
0192     /**
0193      * The crossed momenta
0194      */
0195     const vector<Lorentz5Momentum>& amplitudeMomenta() const { return theAmplitudeMomenta; }
0196 
0197     /**
0198      * The crossed momenta
0199      */
0200     vector<Lorentz5Momentum>& amplitudeMomenta() { return theAmplitudeMomenta; }
0201 
0202     /**
0203      * True, if the the tree level amplitudes need to be calculated
0204      */
0205     bool calculateTreeAmplitudes() const { return theCalculateTreeAmplitudes; }
0206 
0207     /**
0208      * The amplitude values which have been contributing
0209      * to the last call of prepareAmplitudes.
0210      */
0211     const map<vector<int>,CVector>& lastAmplitudes() const { return theLastAmplitudes; }
0212 
0213     /**
0214      * True, if the the tree level amplitudes need to be calculated
0215      */
0216     void haveTreeAmplitudes(bool f = true) { theCalculateTreeAmplitudes = !f; }
0217 
0218     /**
0219      * The amplitude values which have been contributing
0220      * to the last call of prepareAmplitudes.
0221      */
0222     map<vector<int>,CVector>& lastAmplitudes() { return theLastAmplitudes; }
0223 
0224     /**
0225      * The leading N amplitude values which have been
0226      * contributing to the last call of prepareAmplitudes.
0227      */
0228     const map<vector<int>,CVector>& lastLargeNAmplitudes() const { return theLastLargeNAmplitudes; }
0229 
0230     /**
0231      * The leading N amplitude values which have been
0232      * contributing to the last call of prepareAmplitudes.
0233      */
0234     map<vector<int>,CVector>& lastLargeNAmplitudes() { return theLastLargeNAmplitudes; }
0235 
0236     /**
0237      * True, if the the one-loop amplitudes need to be calculated
0238      */
0239     bool calculateOneLoopAmplitudes() const { return theCalculateOneLoopAmplitudes; }
0240 
0241     /**
0242      * The one-loop amplitude values which have been contributing
0243      * to the last call of prepareAmplitudes.
0244      */
0245     const map<vector<int>,CVector>& lastOneLoopAmplitudes() const { return theLastOneLoopAmplitudes; }
0246 
0247     /**
0248      * True, if the the one-loop amplitudes need to be calculated
0249      */
0250     void haveOneLoopAmplitudes(bool f = true) { theCalculateOneLoopAmplitudes = !f; }
0251 
0252     /**
0253      * The one-loop amplitude values which have been contributing
0254      * to the last call of prepareAmplitudes.
0255      */
0256     map<vector<int>,CVector>& lastOneLoopAmplitudes() { return theLastOneLoopAmplitudes; }
0257 
0258     /**
0259      * True, if the tree-level matrix element squared needs to be
0260      * calculated.
0261      */
0262     bool calculateTreeME2() const { return theCalculateTreeME2; }
0263 
0264     /**
0265      * The last tree-level matrix element squared
0266      */
0267     double lastTreeME2() const { return theLastTreeME2; }
0268 
0269     /**
0270      * The last tree-level matrix element squared
0271      */
0272     void lastTreeME2(double v) { 
0273       theLastTreeME2 = v; theCalculateTreeME2 = false;
0274     }
0275 
0276     /**
0277      * True, if the tree-level matrix element squared needs to be
0278      * calculated.
0279      */
0280     bool calculateLargeNME2() const { return theCalculateLargeNME2; }
0281 
0282     /**
0283      * The last tree-level matrix element squared
0284      */
0285     double lastLargeNME2() const { return theLastLargeNME2; }
0286 
0287     /**
0288      * The last tree-level matrix element squared
0289      */
0290     void lastLargeNME2(double v) { 
0291       theLastLargeNME2 = v; theCalculateLargeNME2 = false;
0292     }
0293 
0294     /**
0295      * True, if the one-loop/tree-level interference.
0296      * be calculated.
0297      */
0298     bool calculateOneLoopInterference() const { return theCalculateOneLoopInterference; }
0299 
0300     /**
0301      * The last one-loop/tree-level interference.
0302      */
0303     double lastOneLoopInterference() const { return theLastOneLoopInterference; }
0304 
0305     /**
0306      * The last one-loop/tree-level interference.
0307      */
0308     void lastOneLoopInterference(double v) { 
0309       theLastOneLoopInterference = v; theCalculateOneLoopInterference = false;
0310     }
0311 
0312     /**
0313      * True, if the one-loop/tree-level interference.
0314      * be calculated.
0315      */
0316     bool calculateOneLoopPoles() const { return theCalculateOneLoopPoles; }
0317 
0318     /**
0319      * The last one-loop/tree-level interference.
0320      */
0321     pair<double,double> lastOneLoopPoles() const { return theLastOneLoopPoles; }
0322 
0323     /**
0324      * The last one-loop/tree-level interference.
0325      */
0326     void lastOneLoopPoles(pair<double,double> v) { 
0327       theLastOneLoopPoles = v; theCalculateOneLoopPoles = false;
0328     }
0329 
0330     /**
0331      * True, if the indexed colour correlated matrix element needs to be
0332      * calculated.
0333      */
0334     bool calculateColourCorrelator(pair<int,int> ij) const {
0335       if ( ij.first > ij.second )
0336     swap(ij.first,ij.second);
0337       map<pair<int,int>,bool>::const_iterator f =
0338     theCalculateColourCorrelators.find(ij);
0339       if ( f == theCalculateColourCorrelators.end() )
0340     return true;
0341       return f->second;
0342     }
0343 
0344     /**
0345      * The colour correlated matrix element.
0346      */
0347     double lastColourCorrelator(pair<int,int> ij) const {
0348       if ( ij.first > ij.second )
0349     swap(ij.first,ij.second);
0350       map<pair<int,int>,double>::const_iterator v =
0351     theColourCorrelators.find(ij);
0352       if ( v == theColourCorrelators.end() )
0353     return 0.;
0354       return v->second;
0355     }
0356 
0357     /**
0358      * The colour correlated matrix element.
0359      */
0360     void lastColourCorrelator(pair<int,int> ij, double v) {
0361       if ( ij.first > ij.second )
0362     swap(ij.first,ij.second);
0363       theColourCorrelators[ij] = v;
0364       theCalculateColourCorrelators[ij] = false;
0365     }
0366 
0367     /**
0368      * True, if the indexed large-N colour correlated matrix element needs to be
0369      * calculated.
0370      */
0371     bool calculateLargeNColourCorrelator(pair<int,int> ij) const {
0372       if ( ij.first > ij.second )
0373     swap(ij.first,ij.second);
0374       map<pair<int,int>,bool>::const_iterator f =
0375     theCalculateLargeNColourCorrelators.find(ij);
0376       if ( f == theCalculateLargeNColourCorrelators.end() )
0377     return true;
0378       return f->second;
0379     }
0380 
0381     /**
0382      * The large-N colour correlated matrix element.
0383      */
0384     double lastLargeNColourCorrelator(pair<int,int> ij) const {
0385       if ( ij.first > ij.second )
0386     swap(ij.first,ij.second);
0387       map<pair<int,int>,double>::const_iterator v =
0388     theLargeNColourCorrelators.find(ij);
0389       if ( v == theLargeNColourCorrelators.end() )
0390     return 0.;
0391       return v->second;
0392     }
0393 
0394     /**
0395      * The large-N colour correlated matrix element.
0396      */
0397     void lastLargeNColourCorrelator(pair<int,int> ij, double v) {
0398       if ( ij.first > ij.second )
0399     swap(ij.first,ij.second);
0400       theLargeNColourCorrelators[ij] = v;
0401       theCalculateLargeNColourCorrelators[ij] = false;
0402     }
0403 
0404     /**
0405      * True, if the indexed colour/spin correlated matrix element needs to be
0406      * calculated.
0407      */
0408     bool calculateColourSpinCorrelator(const pair<int,int>& ij) const {
0409       map<pair<int,int>,bool>::const_iterator f =
0410     theCalculateColourSpinCorrelators.find(ij);
0411       if ( f == theCalculateColourSpinCorrelators.end() )
0412     return true;
0413       return f->second;
0414     }
0415 
0416     /**
0417      * The colour/spin correlated matrix element.
0418      */
0419     Complex lastColourSpinCorrelator(const pair<int,int>& ij) const {
0420       map<pair<int,int>,Complex>::const_iterator v =
0421     theColourSpinCorrelators.find(ij);
0422       if ( v == theColourSpinCorrelators.end() )
0423     return 0.;
0424       return v->second;
0425     }
0426 
0427     /**
0428      * The colour/spin correlated matrix element.
0429      */
0430     void lastColourSpinCorrelator(const pair<int,int>& ij, Complex v) {
0431       theColourSpinCorrelators[ij] = v;
0432       theCalculateColourSpinCorrelators[ij] = false;
0433     }
0434 
0435     /**
0436      * True, if the indexed spin correlated matrix element needs to be
0437      * calculated.
0438      */
0439     bool calculateSpinCorrelator(const pair<int,int>& ij) const {
0440       map<pair<int,int>,bool>::const_iterator f =
0441     theCalculateSpinCorrelators.find(ij);
0442       if ( f == theCalculateSpinCorrelators.end() )
0443     return true;
0444       return f->second;
0445     }
0446 
0447     /**
0448      * The spin correlated matrix element.
0449      */
0450     Complex lastSpinCorrelator(const pair<int,int>& ij) const {
0451       map<pair<int,int>,Complex>::const_iterator v =
0452     theSpinCorrelators.find(ij);
0453       if ( v == theSpinCorrelators.end() )
0454     return 0.;
0455       return v->second;
0456     }
0457 
0458     /**
0459      * The spin correlated matrix element.
0460      */
0461     void lastSpinCorrelator(const pair<int,int>& ij, Complex v) {
0462       theSpinCorrelators[ij] = v;
0463       theCalculateSpinCorrelators[ij] = false;
0464     }
0465 
0466     /**
0467      * Return the number of light flavours to be considered for this process.
0468      */
0469     unsigned int nLight() const { return theNLight; }
0470 
0471     /**
0472      * Set the number of light flavours to be considered for this process.
0473      */
0474     void nLight(unsigned int n) { theNLight = n; }
0475 
0476     /**
0477      * Return the vector that contains the PDG ids of 
0478      * the light flavours, which are contained in the
0479      * jet particle group.
0480      */
0481     vector<long> nLightJetVec() const { return theNLightJetVec; }
0482 
0483     /**
0484      * Set the elements of the vector that contains the PDG
0485      * ids of the light flavours, which are contained in the
0486      * jet particle group.
0487      */
0488     void nLightJetVec(long n) { theNLightJetVec.push_back(n); }
0489 
0490     /**
0491      * Return the vector that contains the PDG ids of 
0492      * the heavy flavours, which are contained in the
0493      * jet particle group.
0494      */
0495     vector<long> nHeavyJetVec() const { return theNHeavyJetVec; }
0496 
0497     /**
0498      * Set the elements of the vector that contains the PDG
0499      * ids of the heavy flavours, which are contained in the
0500      * jet particle group.
0501      */
0502     void nHeavyJetVec(long n) { theNHeavyJetVec.push_back(n); }
0503 
0504     /**
0505      * Return the vector that contains the PDG ids of 
0506      * the light flavours, which are contained in the
0507      * proton particle group.
0508      */
0509     vector<long> nLightProtonVec() const { return theNLightProtonVec; }
0510 
0511     /**
0512      * Set the elements of the vector that contains the PDG
0513      * ids of the light flavours, which are contained in the
0514      * proton particle group.
0515      */
0516     void nLightProtonVec(long n) { theNLightProtonVec.push_back(n); }
0517 
0518     /**
0519      * Get the dimensionality of the colour basis for this process.
0520      */
0521     size_t colourBasisDim() const { return theColourBasisDim; }
0522 
0523     /**
0524      * Set the dimensionality of the colour basis for this process.
0525      */
0526     void colourBasisDim(size_t d) { theColourBasisDim = d; }
0527 
0528     /**
0529      * Return the number of degrees of freedom required by the phase space generator
0530      */
0531     int nDimPhasespace() const { return theNDimPhasespace; }
0532 
0533     /**
0534      * Set the number of degrees of freedom required by the phase space generator
0535      */
0536     void nDimPhasespace(int d) { theNDimPhasespace = d; }
0537 
0538     /**
0539      * Return the number of degrees of freedom required by the amplitude
0540      */
0541     int nDimAmplitude() const { return theNDimAmplitude; }
0542 
0543     /**
0544      * Set the number of degrees of freedom required by the amplitude
0545      */
0546     void nDimAmplitude(int d) { theNDimAmplitude = d; }
0547 
0548     /**
0549      * Return the number of degrees of freedom required by the insertion operators
0550      */
0551     int nDimInsertions() const { return theNDimInsertions; }
0552 
0553     /**
0554      * Set the number of degrees of freedom required by the insertion operators
0555      */
0556     void nDimInsertions(int d) { theNDimInsertions = d; }
0557 
0558     /**
0559      * Get the additional random numbers required by the amplitude
0560      */
0561     const vector<double>& amplitudeRandomNumbers() const { return theAmplitudeRandomNumbers; }
0562 
0563     /**
0564      * Access the additional random numbers required by the amplitude
0565      */
0566     vector<double>& amplitudeRandomNumbers() { return theAmplitudeRandomNumbers; }
0567 
0568     /**
0569      * Get the additional random numbers required by the insertion operator
0570      */
0571     const vector<double>& insertionRandomNumbers() const { return theInsertionRandomNumbers; }
0572 
0573     /**
0574      * Access the additional random numbers required by the insertion operator
0575      */
0576     vector<double>& insertionRandomNumbers() { return theInsertionRandomNumbers; }
0577 
0578     /**
0579      * Return the diagram weights indexed by diagram id.
0580      */
0581     const map<int,double>& diagramWeights() const { return theDiagramWeights; }
0582 
0583     /**
0584      * Access the diagram weights indexed by diagram id.
0585      */
0586     map<int,double>& diagramWeights() { return theDiagramWeights; }
0587 
0588     /**
0589      * Return the singular limits
0590      */
0591     const set<pair<size_t,size_t> >& singularLimits() const { return theSingularLimits; }
0592 
0593     /**
0594      * Access the singular limits
0595      */
0596     set<pair<size_t,size_t> >& singularLimits() { return theSingularLimits; }
0597 
0598     /**
0599      * Return the last matched singular limit.
0600      */
0601     const set<pair<size_t,size_t> >::const_iterator& lastSingularLimit() const { return theLastSingularLimit; }
0602 
0603     /**
0604      * Access the last matched singular limit.
0605      */
0606     set<pair<size_t,size_t> >::const_iterator& lastSingularLimit() { return theLastSingularLimit; }
0607 
0608     /**
0609      * Set the Herwig StandardModel object
0610      */
0611     void hwStandardModel(Ptr<StandardModel>::tcptr sm) { theStandardModel = sm; }
0612 
0613     /**
0614      * Get the Herwig StandardModel object
0615      */
0616     Ptr<StandardModel>::tcptr hwStandardModel() const { return theStandardModel; }
0617 
0618     /**
0619      * Return the symmetry factor
0620      */
0621     double symmetryFactor() const { return theSymmetryFactor; }
0622 
0623     /**
0624      * Set the symmetry factor
0625      */
0626     void symmetryFactor(double f) { theSymmetryFactor = f; }
0627 
0628     /**
0629      * Return the OLP process ids
0630      */
0631     const vector<int>& olpId() const { return theOLPId; }
0632 
0633     /**
0634      * Set the OLP process ids
0635      */
0636     void olpId(int pType, int id) {
0637       if ( theOLPId.empty() )
0638     theOLPId.resize(4,0);
0639       theOLPId[pType] = id;
0640     }
0641 
0642     /**
0643      * Set the OLP process ids
0644      */
0645     void olpId(const vector<int>& id) { 
0646       theOLPId = id;
0647     }
0648 
0649     /**
0650      * Return the olp momentum vector
0651      */
0652     double* olpMomenta() { return theOLPMomenta; }
0653 
0654     /**
0655      * Fill the olp momentum vector
0656      */
0657     void fillOLPMomenta(const vector<Lorentz5Momentum>& mm,
0658             const cPDVector& mePartonData = cPDVector(),
0659             const map<long,Energy>& reshuffleMap = map<long,Energy>());
0660 
0661     /**
0662      * Helper struct to define the reshuffling equation
0663      */
0664     struct ReshuffleEquation {
0665 
0666       ReshuffleEquation(Energy xq,
0667             cPDVector::const_iterator xdBegin,
0668             cPDVector::const_iterator xdEnd,
0669             vector<Lorentz5Momentum>::const_iterator xmBegin,
0670             const map<long,Energy>* xreshuffleMap)
0671     : q(xq), dBegin(xdBegin), dEnd(xdEnd), mBegin(xmBegin),
0672       reshuffleMap(xreshuffleMap) {}
0673 
0674       typedef double ArgType;
0675       typedef double ValType;
0676 
0677       static double aUnit() { return 1.; }
0678       static double vUnit() { return 1.; }
0679 
0680       double operator() (double xi) const;
0681 
0682       Energy q;
0683       cPDVector::const_iterator dBegin;
0684       cPDVector::const_iterator dEnd;
0685       vector<Lorentz5Momentum>::const_iterator mBegin;
0686       const map<long,Energy>* reshuffleMap;
0687 
0688     };
0689 
0690     /**
0691      * Perform a reshuffling to the mass shells contained in the map
0692      */
0693     void reshuffle(vector<Lorentz5Momentum>& momenta,
0694            const cPDVector& mePartonData,
0695            const map<long,Energy>& reshuffleMap) const;
0696 
0697     /**
0698      * Return a generic process id to communicate with external codes
0699      */
0700     int externalId() const { return theExternalId; }
0701 
0702     /**
0703      * Set a generic process id to communicate with external codes
0704      */
0705     void externalId(int id) { theExternalId = id; }
0706 
0707     /**
0708      * True if the process has been initialized
0709      */
0710     bool initialized() const { return theInitialized; }
0711 
0712     /**
0713      * True if the process has been initialized
0714      */
0715     void isInitialized(bool is = true) { theInitialized = is; }
0716 
0717     /**
0718      * Return the external momentum vector
0719      */
0720     const vector<double*>& externalMomenta() const { return theExternalMomenta; }
0721 
0722     /**
0723      * Fill the external momentum vector
0724      */
0725     void fillExternalMomenta(const vector<Lorentz5Momentum>&);
0726     
0727     /**
0728      * Caching for the external madgraph colour structures
0729      */
0730     const map<vector<int>,vector < complex<double> > >& heljamp() const { return theHelJamp; }
0731     
0732     /**
0733      * Caching for the external madgraph colour structures (large N)
0734      */
0735     const map<vector<int>,vector < complex<double> > >& helLNjamp() const { return theLNHelJamp; }
0736     
0737     /**
0738      *  pushback the madgraph colour structures
0739      */
0740     void pushheljamp(const vector<int>& hel, const complex<double>& jamp) { theHelJamp[hel].push_back(jamp); }
0741     
0742     /**
0743      * clear the madgraph colour structures
0744      */
0745     void clearheljamp() { theHelJamp.clear(); }
0746         
0747     /**
0748      *  pushback the madgraph colour structures (large N)
0749      */
0750     void pushhelLNjamp(const vector<int>& hel, const complex<double>& jamp) { theLNHelJamp[hel].push_back(jamp); }
0751     
0752     /**
0753      * clear the madgraph colour structures (large N)
0754      */
0755     void clearhelLNjamp() { theLNHelJamp.clear(); }
0756 
0757   public:
0758 
0759     /** @name Functions used by the persistent I/O system. */
0760     //@{
0761     /**
0762      * Function used to write out object persistently.
0763      * @param os the persistent output stream written to.
0764      */
0765     void persistentOutput(PersistentOStream & os) const;
0766 
0767     /**
0768      * Function used to read in object persistently.
0769      * @param is the persistent input stream read from.
0770      * @param version the version number of the object when written.
0771      */
0772     void persistentInput(PersistentIStream & is, int version);
0773 
0774     /**
0775      * Put a CVector to the persistent ostream
0776      */
0777     static void putCVector(PersistentOStream&, const CVector&);
0778 
0779     /**
0780      * Get a CVector from the persistent istream
0781      */
0782     static void getCVector(PersistentIStream&, CVector&);
0783 
0784     /**
0785      * Put an amplitude map to the persistent ostream
0786      */
0787     static void putAmplitudeMap(PersistentOStream&, const map<vector<int>,CVector>&);
0788 
0789     /**
0790      * Get an amplitude map from the persistent istream
0791      */
0792     static void getAmplitudeMap(PersistentIStream&, map<vector<int>,CVector>&);
0793     //@}
0794 
0795     /**
0796      * The standard Init function used to initialize the interfaces.
0797      * Called exactly once for each class by the class description system
0798      * before the main function starts or
0799      * when this class is dynamically loaded.
0800      */
0801     static void Init();
0802 
0803   private:
0804 
0805     /**
0806      * The assignment operator is private and must never be called.
0807      * In fact, it should not even be implemented.
0808      */
0809     MatchboxXCombData & operator=(const MatchboxXCombData &) = delete;
0810 
0811   private:
0812 
0813     /**
0814      * The matrix element
0815      */
0816     Ptr<MatchboxMEBase>::tptr theMatchboxME;
0817 
0818     /**
0819      * The dipole
0820      */
0821     Ptr<SubtractionDipole>::tptr theSubtractionDipole;
0822 
0823     /**
0824      * The crossing information as filled by the last call to
0825      * fillCrossingMap()
0826      */
0827     vector<int> theCrossingMap;
0828 
0829     /**
0830      * The colour crossing information as filled by the last call to
0831      * fillCrossingMap()
0832      */
0833     map<size_t,size_t> theAmplitudeToColourMap;
0834 
0835     /**
0836      * The colour crossing information as filled by the last call to
0837      * fillCrossingMap()
0838      */
0839     map<size_t,size_t> theColourToAmplitudeMap;
0840 
0841     /**
0842      * The crossing sign as filled by the last call to
0843      * fillCrossingMap()
0844      */
0845     double theCrossingSign;
0846 
0847     /**
0848      * The last renormalization scale
0849      */
0850     Energy2 theLastRenormalizationScale;
0851 
0852     /**
0853      * The amplitude parton data.
0854      */
0855     cPDVector theAmplitudePartonData;
0856 
0857     /**
0858      * The ccrossed momenta
0859      */
0860     vector<Lorentz5Momentum> theAmplitudeMomenta;
0861 
0862     /**
0863      * True, if the the tree level amplitudes need to be calculated
0864      */
0865     bool theCalculateTreeAmplitudes;
0866 
0867     /**
0868      * The amplitude values which have been contributing
0869      * to the last call of prepareAmplitudes.
0870      */
0871     map<vector<int>,CVector> theLastAmplitudes;
0872 
0873     /**
0874      * The leading N amplitude values which have been
0875      * contributing to the last call of prepareAmplitudes.
0876      */
0877     map<vector<int>,CVector> theLastLargeNAmplitudes;
0878 
0879     /**
0880      * True, if the the one-loop amplitudes need to be calculated
0881      */
0882     bool theCalculateOneLoopAmplitudes;
0883 
0884     /**
0885      * The one-loop amplitude values which have been contributing
0886      * to the last call of prepareAmplitudes.
0887      */
0888     map<vector<int>,CVector> theLastOneLoopAmplitudes;
0889 
0890     /**
0891      * True, if the tree-level matrix element squared needs to be
0892      * calculated.
0893      */
0894     bool theCalculateTreeME2;
0895 
0896     /**
0897      * The last tree-level matrix element squared
0898      */
0899     double theLastTreeME2;
0900 
0901     /**
0902      * True, if the tree-level matrix element squared needs to be
0903      * calculated.
0904      */
0905     bool theCalculateLargeNME2;
0906 
0907     /**
0908      * The last tree-level matrix element squared
0909      */
0910     double theLastLargeNME2;
0911 
0912     /**
0913      * True, if the one-loop/tree-level interference.
0914      * be calculated.
0915      */
0916     bool theCalculateOneLoopInterference;
0917 
0918     /**
0919      * The last one-loop/tree-level interference.
0920      */
0921     double theLastOneLoopInterference;
0922 
0923     /**
0924      * True, if the one-loop/tree-level interference.
0925      * be calculated.
0926      */
0927     bool theCalculateOneLoopPoles;
0928 
0929     /**
0930      * The last one-loop/tree-level interference.
0931      */
0932     pair<double,double> theLastOneLoopPoles;
0933 
0934     /**
0935      * True, if the indexed colour correlated matrix element needs to be
0936      * calculated.
0937      */
0938     map<pair<int,int>,bool> theCalculateColourCorrelators;
0939 
0940     /**
0941      * The colour correlated matrix element.
0942      */
0943     map<pair<int,int>,double> theColourCorrelators;
0944 
0945     /**
0946      * True, if the indexed large-N colour correlated matrix element needs to be
0947      * calculated.
0948      */
0949     map<pair<int,int>,bool> theCalculateLargeNColourCorrelators;
0950 
0951     /**
0952      * The large-N colour correlated matrix element.
0953      */
0954     map<pair<int,int>,double> theLargeNColourCorrelators;
0955 
0956     /**
0957      * True, if the indexed colour/spin correlated matrix element needs to be
0958      * calculated.
0959      */
0960     map<pair<int,int>,bool> theCalculateColourSpinCorrelators;
0961 
0962     /**
0963      * The colour/spin correlated matrix element.
0964      */
0965     map<pair<int,int>,Complex> theColourSpinCorrelators;
0966 
0967     /**
0968      * True, if the indexed spin correlated matrix element needs to be
0969      * calculated.
0970      */
0971     map<pair<int,int>,bool> theCalculateSpinCorrelators;
0972 
0973     /**
0974      * The spin correlated matrix element.
0975      */
0976     map<pair<int,int>,Complex> theSpinCorrelators;
0977 
0978     /**
0979      * The number of light flavours to be considered for this process.
0980      */
0981     static unsigned int theNLight;
0982 
0983     /**
0984      * Vector with the PDG ids of the light quark flavours,
0985      * which are contained in the jet particle group.
0986      */
0987     static vector<long> theNLightJetVec;
0988 
0989     /**
0990      * Vector with the PDG ids of the heavy quark flavours,
0991      * which are contained in the jet particle group.
0992      */
0993     static vector<long> theNHeavyJetVec;
0994 
0995     /**
0996      * Vector with the PDG ids of the light quark flavours,
0997      * which are contained in the proton particle group.
0998      */
0999     static vector<long> theNLightProtonVec;
1000 
1001     /**
1002      * The dimensionality of the colour basis for this process.
1003      */
1004     size_t theColourBasisDim;
1005 
1006     /**
1007      * The number of degrees of freedom required by the phase space generator
1008      */
1009     int theNDimPhasespace;
1010 
1011     /**
1012      * The number of degrees of freedom required by the amplitude
1013      */
1014     int theNDimAmplitude;
1015 
1016     /**
1017      * The number of degrees of freedom required by the insertion operators
1018      */
1019     int theNDimInsertions;
1020 
1021     /**
1022      * Additional random numbers required by the amplitude
1023      */
1024     vector<double> theAmplitudeRandomNumbers;
1025 
1026     /**
1027      * Additional random numbers required by the insertion operator
1028      */
1029     vector<double> theInsertionRandomNumbers;
1030 
1031     /**
1032      * The diagram weights indexed by diagram id.
1033      */
1034     map<int,double> theDiagramWeights;
1035 
1036     /**
1037      * If not empty, the entries here serve to limit phasespace
1038      * generation to the corresponding collinear limits, or soft limits
1039      * if both pair entries are equal.
1040      */
1041     set<pair<size_t,size_t> > theSingularLimits;
1042 
1043     /**
1044      * The last matched singular limit.
1045      */
1046     set<pair<size_t,size_t> >::const_iterator theLastSingularLimit;
1047 
1048     /**
1049      * The Herwig StandardModel object
1050      */
1051     Ptr<StandardModel>::tcptr theStandardModel;
1052 
1053     /**
1054      * The symmetry factor
1055      */
1056     double theSymmetryFactor;
1057 
1058     /**
1059      * The OLP process id
1060      */
1061     vector<int> theOLPId;
1062 
1063     /**
1064      * Return the olp momentum vector
1065      */
1066     double* theOLPMomenta;
1067 
1068     /**
1069      * True, if olp momenta have been filled
1070      */
1071     bool filledOLPMomenta;
1072 
1073     /**
1074      * A generic process id to communicate with external codes
1075      */
1076     int theExternalId;
1077 
1078     /**
1079      * True if the process has been initialized
1080      */
1081     bool theInitialized;
1082 
1083     /**
1084      * The external momenta
1085      */
1086     vector<double*> theExternalMomenta;
1087 
1088     /**
1089      * True, if external momenta have been filled
1090      */
1091     bool filledExternalMomenta;
1092     
1093     /**
1094      * caching of different colour structures (MadGraph-Interface)
1095      */
1096     map<vector<int>,vector < complex<double> > > theHelJamp;    
1097     
1098     /**
1099      * caching of different colour structures (MadGraph-Interface)
1100      */
1101     map<vector<int>,vector < complex<double> > > theLNHelJamp;
1102 
1103   };
1104 
1105 }
1106 
1107 #endif /* Herwig_MatchboxXCombData_H */