File indexing completed on 2026-08-06 09:24:10
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef Herwig_MatchboxHybridAmplitude_H
0010 #define Herwig_MatchboxHybridAmplitude_H
0011
0012
0013
0014
0015 #include "Herwig/MatrixElement/Matchbox/Base/MatchboxAmplitude.h"
0016
0017 namespace Herwig {
0018
0019 using namespace ThePEG;
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 class MatchboxHybridAmplitude: public Herwig::MatchboxAmplitude {
0032
0033 public:
0034
0035
0036
0037
0038 MatchboxHybridAmplitude();
0039
0040 public:
0041
0042
0043
0044
0045 Ptr<MatchboxAmplitude>::tptr treeLevelAmplitude() const { return theTreeLevelAmplitude; }
0046
0047
0048
0049
0050 void treeLevelAmplitude(Ptr<MatchboxAmplitude>::tptr amp) { theTreeLevelAmplitude = amp; }
0051
0052
0053
0054
0055 virtual Ptr<MatchboxAmplitude>::tptr oneLoopAmplitude() const { return theOneLoopAmplitude; }
0056
0057
0058
0059
0060 void oneLoopAmplitude(Ptr<MatchboxAmplitude>::tptr amp) { theOneLoopAmplitude = amp; }
0061
0062
0063
0064
0065
0066 bool isConsistent() const;
0067
0068 public:
0069
0070
0071
0072
0073
0074
0075
0076 virtual bool canHandle(const PDVector& p,
0077 Ptr<MatchboxFactory>::tptr f,
0078 bool virt) const;
0079
0080
0081
0082
0083
0084 virtual int nDimAdditional() const {
0085 if ( !oneLoopAmplitude() )
0086 return treeLevelAmplitude()->nDimAdditional();
0087 return
0088 treeLevelAmplitude()->nDimAdditional() ?
0089 treeLevelAmplitude()->nDimAdditional() :
0090 oneLoopAmplitude()->nDimAdditional();
0091 }
0092
0093
0094
0095
0096
0097 virtual Ptr<MatchboxMEBase>::ptr makeME(const PDVector& p) const {
0098 return treeLevelAmplitude()->makeME(p);
0099 }
0100
0101
0102
0103
0104
0105 virtual void orderInGs(unsigned int n) {
0106 treeLevelAmplitude()->orderInGs(n);
0107 if ( oneLoopAmplitude() )
0108 oneLoopAmplitude()->orderInGs(n);
0109 }
0110
0111
0112
0113
0114
0115 virtual unsigned int orderInGs() const {
0116 return treeLevelAmplitude()->orderInGs();
0117 }
0118
0119
0120
0121
0122
0123 virtual void orderInGem(unsigned int n) {
0124 treeLevelAmplitude()->orderInGem(n);
0125 if ( oneLoopAmplitude() )
0126 oneLoopAmplitude()->orderInGem(n);
0127 }
0128
0129
0130
0131
0132
0133 virtual unsigned int orderInGem() const {
0134 return treeLevelAmplitude()->orderInGem();
0135 }
0136
0137
0138
0139
0140
0141 virtual bool hasInitialAverage() const {
0142 return treeLevelAmplitude()->hasInitialAverage();
0143 }
0144
0145
0146
0147
0148
0149 virtual bool hasFinalStateSymmetry() const {
0150 return treeLevelAmplitude()->hasFinalStateSymmetry();
0151 }
0152
0153
0154
0155
0156 virtual bool isOLPTree() const { return false; }
0157
0158
0159
0160
0161 virtual bool isOLPLoop() const {
0162 if ( !oneLoopAmplitude() )
0163 return false;
0164 return oneLoopAmplitude()->isOLPLoop();
0165 }
0166
0167
0168
0169
0170
0171 virtual bool needsOLPCorrelators() const {
0172 return theUseOLPCorrelators;
0173 }
0174
0175
0176
0177
0178
0179 virtual bool startOLP(const map<pair<Process,int>,int>& procs) {
0180 assert(oneLoopAmplitude());
0181 return oneLoopAmplitude()->startOLP(procs);
0182 }
0183
0184
0185
0186
0187
0188 virtual bool isExternal() const {
0189 return treeLevelAmplitude()->isExternal();
0190 }
0191
0192
0193
0194
0195 virtual bool initializeExternal() {
0196 return treeLevelAmplitude()->initializeExternal();
0197 }
0198
0199
0200
0201
0202 virtual int externalId(const cPDVector& proc) {
0203 return treeLevelAmplitude()->externalId(proc);
0204 }
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 virtual Ptr<ColourBasis>::tptr colourBasis() const {
0215 return treeLevelAmplitude()->colourBasis();
0216 }
0217
0218
0219
0220
0221
0222 virtual bool haveColourFlows() const {
0223 return treeLevelAmplitude()->haveColourFlows();
0224 }
0225
0226
0227
0228
0229
0230 virtual Selector<const ColourLines *> colourGeometries(tcDiagPtr diag) const {
0231 return treeLevelAmplitude()->colourGeometries(diag);
0232 }
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242 virtual void setXComb(tStdXCombPtr xc) {
0243 treeLevelAmplitude()->setXComb(xc);
0244 if ( oneLoopAmplitude() )
0245 oneLoopAmplitude()->setXComb(xc);
0246 lastMatchboxXComb(xc);
0247 }
0248
0249
0250
0251
0252
0253
0254
0255 virtual void fillCrossingMap(size_t shift = 0) {
0256 treeLevelAmplitude()->fillCrossingMap(shift);
0257 }
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268 virtual void prepareAmplitudes(Ptr<MatchboxMEBase>::tcptr);
0269
0270
0271
0272
0273 virtual double me2() const {
0274 return treeLevelAmplitude()->me2();
0275 }
0276
0277
0278
0279
0280 virtual double largeNME2(Ptr<ColourBasis>::tptr largeNBasis) const {
0281 return treeLevelAmplitude()->largeNME2(largeNBasis);
0282 }
0283
0284
0285
0286
0287 virtual double colourCorrelatedME2(pair<int,int> ij) const {
0288 return
0289 theUseOLPCorrelators ?
0290 oneLoopAmplitude()->colourCorrelatedME2(ij) :
0291 treeLevelAmplitude()->colourCorrelatedME2(ij);
0292 }
0293
0294
0295
0296
0297 virtual double largeNColourCorrelatedME2(pair<int,int> ij,
0298 Ptr<ColourBasis>::tptr largeNBasis) const {
0299 return treeLevelAmplitude()->largeNColourCorrelatedME2(ij,largeNBasis);
0300 }
0301
0302
0303
0304
0305
0306
0307 virtual LorentzVector<Complex> plusPolarization(const Lorentz5Momentum& p,
0308 const Lorentz5Momentum& n,
0309 int id = -1) const {
0310 return
0311 theUseOLPCorrelators ?
0312 oneLoopAmplitude()->plusPolarization(p,n,id) :
0313 treeLevelAmplitude()->plusPolarization(p,n,id);
0314 }
0315
0316
0317
0318
0319 virtual double spinColourCorrelatedME2(pair<int,int> emitterSpectator,
0320 const SpinCorrelationTensor& c) const {
0321 return
0322 theUseOLPCorrelators ?
0323 oneLoopAmplitude()->spinColourCorrelatedME2(emitterSpectator,c) :
0324 treeLevelAmplitude()->spinColourCorrelatedME2(emitterSpectator,c);
0325 }
0326
0327
0328
0329
0330 virtual double spinCorrelatedME2(pair<int,int> emitterSpectator,
0331 const SpinCorrelationTensor& c) const {
0332 return
0333 theUseOLPCorrelators ?
0334 oneLoopAmplitude()->spinCorrelatedME2(emitterSpectator,c) :
0335 treeLevelAmplitude()->spinCorrelatedME2(emitterSpectator,c);
0336 }
0337
0338
0339
0340
0341
0342 virtual bool canFillRhoMatrix() const {
0343 return treeLevelAmplitude()->canFillRhoMatrix();
0344 }
0345
0346
0347
0348
0349
0350 virtual vector<unsigned int> physicalHelicities(const vector<int>& hel) const {
0351 return treeLevelAmplitude()->physicalHelicities(hel);
0352 }
0353
0354
0355
0356
0357 virtual bool treeAmplitudes() const {
0358 return treeLevelAmplitude()->treeAmplitudes();
0359 }
0360
0361
0362
0363
0364
0365 virtual Complex evaluate(size_t a, const vector<int>& hel, Complex& largeN) {
0366 return treeLevelAmplitude()->evaluate(a,hel,largeN);
0367 }
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377 virtual void disableOneLoop() { oneLoopAmplitude(Ptr<MatchboxAmplitude>::ptr()); }
0378
0379
0380
0381
0382
0383 virtual bool haveOneLoop() const { return oneLoopAmplitude(); }
0384
0385
0386
0387
0388
0389 virtual bool onlyOneLoop() const { return false; }
0390
0391
0392
0393
0394 virtual bool oneLoopAmplitudes() const {
0395 assert(oneLoopAmplitude());
0396 return oneLoopAmplitude()->oneLoopAmplitudes();
0397 }
0398
0399
0400
0401
0402
0403 virtual bool isDRbar() const {
0404 assert(oneLoopAmplitude());
0405 return oneLoopAmplitude()->isDRbar();
0406 }
0407
0408
0409
0410
0411
0412
0413
0414 virtual bool isDR() const {
0415 assert(oneLoopAmplitude());
0416 return oneLoopAmplitude()->isDR();
0417 }
0418
0419
0420
0421
0422
0423 virtual bool isCS() const {
0424 assert(oneLoopAmplitude());
0425 return oneLoopAmplitude()->isCS();
0426 }
0427
0428
0429
0430
0431
0432 virtual bool isBDK() const {
0433 assert(oneLoopAmplitude());
0434 return oneLoopAmplitude()->isBDK();
0435 }
0436
0437
0438
0439
0440
0441 virtual bool isExpanded() const {
0442 assert(oneLoopAmplitude());
0443 return oneLoopAmplitude()->isExpanded();
0444 }
0445
0446
0447
0448
0449
0450
0451 virtual Energy2 mu2() const {
0452 assert(oneLoopAmplitude());
0453 return oneLoopAmplitude()->mu2();
0454 }
0455
0456
0457
0458
0459
0460 double symmetryRatio() const;
0461
0462
0463
0464
0465 virtual bool hasRunningAlphaS() const {
0466 return treeLevelAmplitude()->hasRunningAlphaS();
0467 }
0468
0469
0470
0471
0472 virtual bool hasRunningAlphaEW() const {
0473 return treeLevelAmplitude()->hasRunningAlphaEW();
0474 }
0475
0476
0477
0478
0479 virtual double oneLoopDoublePole() const {
0480 assert(oneLoopAmplitude());
0481 return symmetryRatio()*oneLoopAmplitude()->oneLoopDoublePole();
0482 }
0483
0484
0485
0486
0487 virtual double oneLoopSinglePole() const {
0488 assert(oneLoopAmplitude());
0489 return symmetryRatio()*oneLoopAmplitude()->oneLoopSinglePole();
0490 }
0491
0492
0493
0494
0495
0496 virtual void prepareOneLoopAmplitudes(Ptr<MatchboxMEBase>::tcptr);
0497
0498
0499
0500
0501 virtual double oneLoopInterference() const {
0502 assert(oneLoopAmplitude());
0503 return symmetryRatio()*oneLoopAmplitude()->oneLoopInterference();
0504 }
0505
0506
0507
0508
0509
0510 virtual Complex evaluateOneLoop(size_t a, const vector<int>& hel) {
0511 assert(oneLoopAmplitude());
0512 return oneLoopAmplitude()->evaluateOneLoop(a,hel);
0513 }
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523 virtual void flushCaches() {
0524 treeLevelAmplitude()->flushCaches();
0525 if ( oneLoopAmplitude() )
0526 oneLoopAmplitude()->flushCaches();
0527 }
0528
0529
0530
0531
0532 virtual void cloneDependencies(const std::string& prefix= "" , bool slim=false);
0533
0534
0535 protected:
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545 virtual void doinit();
0546
0547
0548
0549
0550
0551 virtual void doinitrun();
0552
0553
0554 public:
0555
0556
0557
0558
0559
0560
0561
0562 void persistentOutput(PersistentOStream & os) const;
0563
0564
0565
0566
0567
0568
0569 void persistentInput(PersistentIStream & is, int version);
0570
0571
0572
0573
0574
0575
0576
0577
0578 static void Init();
0579
0580 protected:
0581
0582
0583
0584
0585
0586
0587
0588 virtual IBPtr clone() const;
0589
0590
0591
0592
0593
0594 virtual IBPtr fullclone() const;
0595
0596
0597
0598
0599
0600
0601
0602 private:
0603
0604
0605
0606
0607 Ptr<MatchboxAmplitude>::ptr theTreeLevelAmplitude;
0608
0609
0610
0611
0612 Ptr<MatchboxAmplitude>::ptr theOneLoopAmplitude;
0613
0614
0615
0616
0617 bool theUseOLPCorrelators;
0618
0619
0620
0621
0622
0623 MatchboxHybridAmplitude & operator=(const MatchboxHybridAmplitude &) = delete;
0624
0625 };
0626
0627 }
0628
0629 #endif