File indexing completed on 2026-08-06 09:24:15
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef Herwig_MatchboxXCombData_H
0010 #define Herwig_MatchboxXCombData_H
0011
0012
0013
0014
0015
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
0041
0042
0043
0044
0045 typedef boost::numeric::ublas::vector<Complex> CVector;
0046
0047
0048
0049
0050
0051
0052
0053 typedef map<vector<int>,CVector> AmplitudeMap;
0054
0055
0056
0057
0058
0059
0060
0061 typedef map<vector<int>,CVector>::iterator AmplitudeIterator;
0062
0063
0064
0065
0066
0067
0068
0069 typedef map<vector<int>,CVector>::const_iterator AmplitudeConstIterator;
0070
0071
0072
0073
0074
0075
0076
0077 class MatchboxXCombData {
0078
0079 public:
0080
0081
0082
0083
0084
0085
0086 explicit MatchboxXCombData(tMEPtr newME);
0087
0088
0089
0090
0091 MatchboxXCombData();
0092
0093
0094
0095
0096 virtual ~MatchboxXCombData();
0097
0098
0099
0100 public:
0101
0102
0103
0104
0105 void flushCaches();
0106
0107 public:
0108
0109
0110
0111
0112 Ptr<MatchboxFactory>::tcptr factory() const;
0113
0114
0115
0116
0117 Ptr<MatchboxMEBase>::tptr matchboxME() const;
0118
0119
0120
0121
0122 Ptr<SubtractionDipole>::tptr subtractionDipole() const;
0123
0124
0125
0126
0127
0128 const vector<int>& crossingMap() const { return theCrossingMap; }
0129
0130
0131
0132
0133
0134 vector<int>& crossingMap() { return theCrossingMap; }
0135
0136
0137
0138
0139
0140 const map<size_t,size_t>& amplitudeToColourMap() const { return theAmplitudeToColourMap; }
0141
0142
0143
0144
0145
0146 map<size_t,size_t>& amplitudeToColourMap() { return theAmplitudeToColourMap; }
0147
0148
0149
0150
0151
0152 const map<size_t,size_t>& colourToAmplitudeMap() const { return theColourToAmplitudeMap; }
0153
0154
0155
0156
0157
0158 map<size_t,size_t>& colourToAmplitudeMap() { return theColourToAmplitudeMap; }
0159
0160
0161
0162
0163
0164 double crossingSign() const { return theCrossingSign; }
0165
0166
0167
0168
0169
0170 void crossingSign(double c) { theCrossingSign = c; }
0171
0172
0173
0174
0175 Energy2 lastRenormalizationScale() const { return theLastRenormalizationScale; }
0176
0177
0178
0179
0180 void lastRenormalizationScale(Energy2 lrs) { theLastRenormalizationScale = lrs; }
0181
0182
0183
0184
0185 const cPDVector& amplitudePartonData() const { return theAmplitudePartonData; }
0186
0187
0188
0189
0190 cPDVector& amplitudePartonData() { return theAmplitudePartonData; }
0191
0192
0193
0194
0195 const vector<Lorentz5Momentum>& amplitudeMomenta() const { return theAmplitudeMomenta; }
0196
0197
0198
0199
0200 vector<Lorentz5Momentum>& amplitudeMomenta() { return theAmplitudeMomenta; }
0201
0202
0203
0204
0205 bool calculateTreeAmplitudes() const { return theCalculateTreeAmplitudes; }
0206
0207
0208
0209
0210
0211 const map<vector<int>,CVector>& lastAmplitudes() const { return theLastAmplitudes; }
0212
0213
0214
0215
0216 void haveTreeAmplitudes(bool f = true) { theCalculateTreeAmplitudes = !f; }
0217
0218
0219
0220
0221
0222 map<vector<int>,CVector>& lastAmplitudes() { return theLastAmplitudes; }
0223
0224
0225
0226
0227
0228 const map<vector<int>,CVector>& lastLargeNAmplitudes() const { return theLastLargeNAmplitudes; }
0229
0230
0231
0232
0233
0234 map<vector<int>,CVector>& lastLargeNAmplitudes() { return theLastLargeNAmplitudes; }
0235
0236
0237
0238
0239 bool calculateOneLoopAmplitudes() const { return theCalculateOneLoopAmplitudes; }
0240
0241
0242
0243
0244
0245 const map<vector<int>,CVector>& lastOneLoopAmplitudes() const { return theLastOneLoopAmplitudes; }
0246
0247
0248
0249
0250 void haveOneLoopAmplitudes(bool f = true) { theCalculateOneLoopAmplitudes = !f; }
0251
0252
0253
0254
0255
0256 map<vector<int>,CVector>& lastOneLoopAmplitudes() { return theLastOneLoopAmplitudes; }
0257
0258
0259
0260
0261
0262 bool calculateTreeME2() const { return theCalculateTreeME2; }
0263
0264
0265
0266
0267 double lastTreeME2() const { return theLastTreeME2; }
0268
0269
0270
0271
0272 void lastTreeME2(double v) {
0273 theLastTreeME2 = v; theCalculateTreeME2 = false;
0274 }
0275
0276
0277
0278
0279
0280 bool calculateLargeNME2() const { return theCalculateLargeNME2; }
0281
0282
0283
0284
0285 double lastLargeNME2() const { return theLastLargeNME2; }
0286
0287
0288
0289
0290 void lastLargeNME2(double v) {
0291 theLastLargeNME2 = v; theCalculateLargeNME2 = false;
0292 }
0293
0294
0295
0296
0297
0298 bool calculateOneLoopInterference() const { return theCalculateOneLoopInterference; }
0299
0300
0301
0302
0303 double lastOneLoopInterference() const { return theLastOneLoopInterference; }
0304
0305
0306
0307
0308 void lastOneLoopInterference(double v) {
0309 theLastOneLoopInterference = v; theCalculateOneLoopInterference = false;
0310 }
0311
0312
0313
0314
0315
0316 bool calculateOneLoopPoles() const { return theCalculateOneLoopPoles; }
0317
0318
0319
0320
0321 pair<double,double> lastOneLoopPoles() const { return theLastOneLoopPoles; }
0322
0323
0324
0325
0326 void lastOneLoopPoles(pair<double,double> v) {
0327 theLastOneLoopPoles = v; theCalculateOneLoopPoles = false;
0328 }
0329
0330
0331
0332
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
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
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
0369
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
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
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
0406
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
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
0429
0430 void lastColourSpinCorrelator(const pair<int,int>& ij, Complex v) {
0431 theColourSpinCorrelators[ij] = v;
0432 theCalculateColourSpinCorrelators[ij] = false;
0433 }
0434
0435
0436
0437
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
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
0460
0461 void lastSpinCorrelator(const pair<int,int>& ij, Complex v) {
0462 theSpinCorrelators[ij] = v;
0463 theCalculateSpinCorrelators[ij] = false;
0464 }
0465
0466
0467
0468
0469 unsigned int nLight() const { return theNLight; }
0470
0471
0472
0473
0474 void nLight(unsigned int n) { theNLight = n; }
0475
0476
0477
0478
0479
0480
0481 vector<long> nLightJetVec() const { return theNLightJetVec; }
0482
0483
0484
0485
0486
0487
0488 void nLightJetVec(long n) { theNLightJetVec.push_back(n); }
0489
0490
0491
0492
0493
0494
0495 vector<long> nHeavyJetVec() const { return theNHeavyJetVec; }
0496
0497
0498
0499
0500
0501
0502 void nHeavyJetVec(long n) { theNHeavyJetVec.push_back(n); }
0503
0504
0505
0506
0507
0508
0509 vector<long> nLightProtonVec() const { return theNLightProtonVec; }
0510
0511
0512
0513
0514
0515
0516 void nLightProtonVec(long n) { theNLightProtonVec.push_back(n); }
0517
0518
0519
0520
0521 size_t colourBasisDim() const { return theColourBasisDim; }
0522
0523
0524
0525
0526 void colourBasisDim(size_t d) { theColourBasisDim = d; }
0527
0528
0529
0530
0531 int nDimPhasespace() const { return theNDimPhasespace; }
0532
0533
0534
0535
0536 void nDimPhasespace(int d) { theNDimPhasespace = d; }
0537
0538
0539
0540
0541 int nDimAmplitude() const { return theNDimAmplitude; }
0542
0543
0544
0545
0546 void nDimAmplitude(int d) { theNDimAmplitude = d; }
0547
0548
0549
0550
0551 int nDimInsertions() const { return theNDimInsertions; }
0552
0553
0554
0555
0556 void nDimInsertions(int d) { theNDimInsertions = d; }
0557
0558
0559
0560
0561 const vector<double>& amplitudeRandomNumbers() const { return theAmplitudeRandomNumbers; }
0562
0563
0564
0565
0566 vector<double>& amplitudeRandomNumbers() { return theAmplitudeRandomNumbers; }
0567
0568
0569
0570
0571 const vector<double>& insertionRandomNumbers() const { return theInsertionRandomNumbers; }
0572
0573
0574
0575
0576 vector<double>& insertionRandomNumbers() { return theInsertionRandomNumbers; }
0577
0578
0579
0580
0581 const map<int,double>& diagramWeights() const { return theDiagramWeights; }
0582
0583
0584
0585
0586 map<int,double>& diagramWeights() { return theDiagramWeights; }
0587
0588
0589
0590
0591 const set<pair<size_t,size_t> >& singularLimits() const { return theSingularLimits; }
0592
0593
0594
0595
0596 set<pair<size_t,size_t> >& singularLimits() { return theSingularLimits; }
0597
0598
0599
0600
0601 const set<pair<size_t,size_t> >::const_iterator& lastSingularLimit() const { return theLastSingularLimit; }
0602
0603
0604
0605
0606 set<pair<size_t,size_t> >::const_iterator& lastSingularLimit() { return theLastSingularLimit; }
0607
0608
0609
0610
0611 void hwStandardModel(Ptr<StandardModel>::tcptr sm) { theStandardModel = sm; }
0612
0613
0614
0615
0616 Ptr<StandardModel>::tcptr hwStandardModel() const { return theStandardModel; }
0617
0618
0619
0620
0621 double symmetryFactor() const { return theSymmetryFactor; }
0622
0623
0624
0625
0626 void symmetryFactor(double f) { theSymmetryFactor = f; }
0627
0628
0629
0630
0631 const vector<int>& olpId() const { return theOLPId; }
0632
0633
0634
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
0644
0645 void olpId(const vector<int>& id) {
0646 theOLPId = id;
0647 }
0648
0649
0650
0651
0652 double* olpMomenta() { return theOLPMomenta; }
0653
0654
0655
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
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
0692
0693 void reshuffle(vector<Lorentz5Momentum>& momenta,
0694 const cPDVector& mePartonData,
0695 const map<long,Energy>& reshuffleMap) const;
0696
0697
0698
0699
0700 int externalId() const { return theExternalId; }
0701
0702
0703
0704
0705 void externalId(int id) { theExternalId = id; }
0706
0707
0708
0709
0710 bool initialized() const { return theInitialized; }
0711
0712
0713
0714
0715 void isInitialized(bool is = true) { theInitialized = is; }
0716
0717
0718
0719
0720 const vector<double*>& externalMomenta() const { return theExternalMomenta; }
0721
0722
0723
0724
0725 void fillExternalMomenta(const vector<Lorentz5Momentum>&);
0726
0727
0728
0729
0730 const map<vector<int>,vector < complex<double> > >& heljamp() const { return theHelJamp; }
0731
0732
0733
0734
0735 const map<vector<int>,vector < complex<double> > >& helLNjamp() const { return theLNHelJamp; }
0736
0737
0738
0739
0740 void pushheljamp(const vector<int>& hel, const complex<double>& jamp) { theHelJamp[hel].push_back(jamp); }
0741
0742
0743
0744
0745 void clearheljamp() { theHelJamp.clear(); }
0746
0747
0748
0749
0750 void pushhelLNjamp(const vector<int>& hel, const complex<double>& jamp) { theLNHelJamp[hel].push_back(jamp); }
0751
0752
0753
0754
0755 void clearhelLNjamp() { theLNHelJamp.clear(); }
0756
0757 public:
0758
0759
0760
0761
0762
0763
0764
0765 void persistentOutput(PersistentOStream & os) const;
0766
0767
0768
0769
0770
0771
0772 void persistentInput(PersistentIStream & is, int version);
0773
0774
0775
0776
0777 static void putCVector(PersistentOStream&, const CVector&);
0778
0779
0780
0781
0782 static void getCVector(PersistentIStream&, CVector&);
0783
0784
0785
0786
0787 static void putAmplitudeMap(PersistentOStream&, const map<vector<int>,CVector>&);
0788
0789
0790
0791
0792 static void getAmplitudeMap(PersistentIStream&, map<vector<int>,CVector>&);
0793
0794
0795
0796
0797
0798
0799
0800
0801 static void Init();
0802
0803 private:
0804
0805
0806
0807
0808
0809 MatchboxXCombData & operator=(const MatchboxXCombData &) = delete;
0810
0811 private:
0812
0813
0814
0815
0816 Ptr<MatchboxMEBase>::tptr theMatchboxME;
0817
0818
0819
0820
0821 Ptr<SubtractionDipole>::tptr theSubtractionDipole;
0822
0823
0824
0825
0826
0827 vector<int> theCrossingMap;
0828
0829
0830
0831
0832
0833 map<size_t,size_t> theAmplitudeToColourMap;
0834
0835
0836
0837
0838
0839 map<size_t,size_t> theColourToAmplitudeMap;
0840
0841
0842
0843
0844
0845 double theCrossingSign;
0846
0847
0848
0849
0850 Energy2 theLastRenormalizationScale;
0851
0852
0853
0854
0855 cPDVector theAmplitudePartonData;
0856
0857
0858
0859
0860 vector<Lorentz5Momentum> theAmplitudeMomenta;
0861
0862
0863
0864
0865 bool theCalculateTreeAmplitudes;
0866
0867
0868
0869
0870
0871 map<vector<int>,CVector> theLastAmplitudes;
0872
0873
0874
0875
0876
0877 map<vector<int>,CVector> theLastLargeNAmplitudes;
0878
0879
0880
0881
0882 bool theCalculateOneLoopAmplitudes;
0883
0884
0885
0886
0887
0888 map<vector<int>,CVector> theLastOneLoopAmplitudes;
0889
0890
0891
0892
0893
0894 bool theCalculateTreeME2;
0895
0896
0897
0898
0899 double theLastTreeME2;
0900
0901
0902
0903
0904
0905 bool theCalculateLargeNME2;
0906
0907
0908
0909
0910 double theLastLargeNME2;
0911
0912
0913
0914
0915
0916 bool theCalculateOneLoopInterference;
0917
0918
0919
0920
0921 double theLastOneLoopInterference;
0922
0923
0924
0925
0926
0927 bool theCalculateOneLoopPoles;
0928
0929
0930
0931
0932 pair<double,double> theLastOneLoopPoles;
0933
0934
0935
0936
0937
0938 map<pair<int,int>,bool> theCalculateColourCorrelators;
0939
0940
0941
0942
0943 map<pair<int,int>,double> theColourCorrelators;
0944
0945
0946
0947
0948
0949 map<pair<int,int>,bool> theCalculateLargeNColourCorrelators;
0950
0951
0952
0953
0954 map<pair<int,int>,double> theLargeNColourCorrelators;
0955
0956
0957
0958
0959
0960 map<pair<int,int>,bool> theCalculateColourSpinCorrelators;
0961
0962
0963
0964
0965 map<pair<int,int>,Complex> theColourSpinCorrelators;
0966
0967
0968
0969
0970
0971 map<pair<int,int>,bool> theCalculateSpinCorrelators;
0972
0973
0974
0975
0976 map<pair<int,int>,Complex> theSpinCorrelators;
0977
0978
0979
0980
0981 static unsigned int theNLight;
0982
0983
0984
0985
0986
0987 static vector<long> theNLightJetVec;
0988
0989
0990
0991
0992
0993 static vector<long> theNHeavyJetVec;
0994
0995
0996
0997
0998
0999 static vector<long> theNLightProtonVec;
1000
1001
1002
1003
1004 size_t theColourBasisDim;
1005
1006
1007
1008
1009 int theNDimPhasespace;
1010
1011
1012
1013
1014 int theNDimAmplitude;
1015
1016
1017
1018
1019 int theNDimInsertions;
1020
1021
1022
1023
1024 vector<double> theAmplitudeRandomNumbers;
1025
1026
1027
1028
1029 vector<double> theInsertionRandomNumbers;
1030
1031
1032
1033
1034 map<int,double> theDiagramWeights;
1035
1036
1037
1038
1039
1040
1041 set<pair<size_t,size_t> > theSingularLimits;
1042
1043
1044
1045
1046 set<pair<size_t,size_t> >::const_iterator theLastSingularLimit;
1047
1048
1049
1050
1051 Ptr<StandardModel>::tcptr theStandardModel;
1052
1053
1054
1055
1056 double theSymmetryFactor;
1057
1058
1059
1060
1061 vector<int> theOLPId;
1062
1063
1064
1065
1066 double* theOLPMomenta;
1067
1068
1069
1070
1071 bool filledOLPMomenta;
1072
1073
1074
1075
1076 int theExternalId;
1077
1078
1079
1080
1081 bool theInitialized;
1082
1083
1084
1085
1086 vector<double*> theExternalMomenta;
1087
1088
1089
1090
1091 bool filledExternalMomenta;
1092
1093
1094
1095
1096 map<vector<int>,vector < complex<double> > > theHelJamp;
1097
1098
1099
1100
1101 map<vector<int>,vector < complex<double> > > theLNHelJamp;
1102
1103 };
1104
1105 }
1106
1107 #endif