File indexing completed on 2026-08-06 09:24:10
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef HERWIG_SubtractedME_H
0010 #define HERWIG_SubtractedME_H
0011
0012
0013
0014
0015 #include "ThePEG/MatrixElement/MEGroup.h"
0016 #include "Herwig/MatrixElement/Matchbox/Base/MatchboxMEBase.h"
0017 #include "Herwig/MatrixElement/Matchbox/Dipoles/SubtractionDipole.h"
0018 #include "Herwig/MatrixElement/Matchbox/Utility/LastMatchboxXCombInfo.h"
0019 #include "Herwig/MatrixElement/Matchbox/MatchboxFactory.fh"
0020
0021 namespace Herwig {
0022
0023 using namespace ThePEG;
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 class SubtractedME:
0035 public MEGroup,
0036 public LastMatchboxXCombInfo {
0037
0038 public:
0039
0040
0041
0042
0043 SubtractedME();
0044
0045 public:
0046
0047
0048
0049
0050 Ptr<MatchboxFactory>::tcptr factory() const;
0051
0052
0053
0054
0055
0056
0057
0058
0059 virtual StdXCombPtr makeXComb(Energy newMaxEnergy, const cPDPair & inc,
0060 tEHPtr newEventHandler,tSubHdlPtr newSubProcessHandler,
0061 tPExtrPtr newExtractor, tCascHdlPtr newCKKW,
0062 const PBPair & newPartonBins, tCutsPtr newCuts,
0063 const DiagramVector & newDiagrams, bool mir,
0064 const PartonPairVec& allPBins,
0065 tStdXCombPtr newHead = tStdXCombPtr(),
0066 tMEPtr newME = tMEPtr());
0067
0068
0069
0070
0071
0072 virtual void setXComb(tStdXCombPtr);
0073
0074
0075
0076
0077
0078
0079 virtual bool uniformAdditional() const { return true; }
0080
0081
0082
0083
0084
0085
0086 virtual bool keepRandomNumbers() const { return true; }
0087
0088
0089
0090
0091
0092
0093 virtual MEBase::DiagramVector dependentDiagrams(const cPDVector& proc,
0094 tMEPtr depME) const;
0095
0096
0097
0098
0099
0100
0101
0102 virtual bool subProcessGroups() const;
0103
0104
0105
0106
0107
0108
0109 virtual bool selectDependentSubProcess() const { return false; }
0110
0111
0112
0113
0114
0115 virtual void fillProjectors();
0116
0117
0118
0119
0120 virtual bool willProject() const {
0121 return virtualShowerSubtraction() || loopSimSubtraction();
0122 }
0123
0124
0125
0126
0127
0128 virtual bool groupReweighted() const {
0129 return showerApproximation();
0130 }
0131
0132
0133
0134
0135 virtual double reweightHead(const vector<tStdXCombPtr>&);
0136
0137
0138
0139
0140 virtual double reweightDependent(tStdXCombPtr, const vector<tStdXCombPtr>&);
0141
0142
0143
0144
0145 void doRealEmissionScales();
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 virtual void flushCaches() {
0158 MEGroup::flushCaches();
0159 if ( showerApproximation() )
0160 showerApproximation()->resetBelowCutoff();
0161 }
0162
0163
0164
0165
0166 Ptr<ShowerApproximation>::tptr showerApproximation() const;
0167
0168
0169
0170
0171 void doRealShowerSubtraction();
0172
0173
0174
0175
0176 bool realShowerSubtraction() const { return theRealShowerSubtraction; }
0177
0178
0179
0180
0181 void doVirtualShowerSubtraction();
0182
0183
0184
0185
0186 bool virtualShowerSubtraction() const { return theVirtualShowerSubtraction; }
0187
0188
0189
0190
0191 void doLoopSimSubtraction();
0192
0193
0194
0195
0196 bool loopSimSubtraction() const { return theLoopSimSubtraction; }
0197
0198
0199
0200
0201
0202
0203
0204 virtual bool discard(const CrossSection&, const CrossSection&) const { return false; }
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 vector<Ptr<SubtractionDipole>::ptr> dipoles();
0215
0216
0217
0218
0219 const vector<Ptr<MatchboxMEBase>::ptr>& borns() const;
0220
0221
0222
0223
0224
0225 void setBorns(const vector<Ptr<MatchboxMEBase>::ptr>& newBorns) { theBorns = newBorns; }
0226
0227
0228
0229
0230 void getDipoles();
0231
0232
0233
0234
0235 void cloneDipoles(const string& prefix = "");
0236
0237
0238
0239
0240 void cloneRealME(const string& prefix = "");
0241
0242
0243
0244
0245 void cloneDependencies(const string& prefix = "") {
0246 cloneDipoles(prefix);
0247 cloneRealME(prefix);
0248 }
0249
0250
0251
0252
0253 vector<Ptr<SubtractionDipole>::ptr> splitDipoles(const cPDVector&);
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264 virtual void setVetoScales(tSubProPtr) const;
0265
0266
0267
0268
0269
0270
0271
0272
0273 void print(ostream&) const;
0274
0275
0276
0277
0278
0279
0280
0281 virtual void lastEventStatistics();
0282
0283
0284
0285
0286 void printLastEvent(ostream&) const;
0287
0288
0289
0290
0291 void lastEventSubtraction();
0292
0293
0294
0295
0296 bool verbose() const;
0297
0298
0299
0300
0301 bool initVerbose() const;
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314 virtual bool preInitialize() const { return true; }
0315
0316
0317
0318
0319 struct SubtractionHistogram {
0320
0321
0322
0323
0324 double lower;
0325
0326
0327
0328
0329 map<double,pair<double,double> > bins;
0330
0331
0332
0333
0334 SubtractionHistogram(double low = 0.001,
0335 double up = 10.,
0336 unsigned int nbins = 100);
0337
0338
0339
0340
0341 void book(double inv, double diff) {
0342 map<double,pair<double,double> >::iterator b =
0343 bins.upper_bound(inv);
0344 if ( b == bins.end() ) return;
0345 b->second.first = min(b->second.first,diff);
0346 b->second.second = max(b->second.second,diff);
0347 }
0348
0349
0350
0351
0352 void dump(const std::string& prefix,
0353 const int& plottype,
0354 const bool& scatterplot,
0355 const cPDVector& proc,
0356 int i, int j) const;
0357
0358
0359
0360
0361 void persistentOutput(PersistentOStream&) const;
0362
0363
0364
0365
0366 void persistentInput(PersistentIStream&);
0367
0368 };
0369
0370
0371
0372 public:
0373
0374
0375
0376
0377
0378
0379
0380 void persistentOutput(PersistentOStream & os) const;
0381
0382
0383
0384
0385
0386
0387 void persistentInput(PersistentIStream & is, int version);
0388
0389
0390
0391
0392
0393
0394
0395
0396 static void Init();
0397
0398 protected:
0399
0400
0401
0402
0403
0404
0405
0406 virtual IBPtr clone() const;
0407
0408
0409
0410
0411
0412 virtual IBPtr fullclone() const;
0413
0414
0415
0416
0417
0418
0419
0420 protected:
0421
0422
0423
0424
0425
0426
0427
0428
0429 virtual void doinit();
0430
0431
0432
0433
0434
0435 virtual void doinitrun();
0436
0437
0438
0439
0440
0441 virtual void dofinish();
0442
0443
0444
0445 private:
0446
0447
0448
0449
0450
0451 vector<Ptr<MatchboxMEBase>::ptr> theBorns;
0452
0453
0454
0455
0456
0457 Ptr<MatchboxMEBase>::ptr theReal;
0458
0459
0460
0461
0462 typedef pair<cPDVector,pair<size_t, size_t> > CollinearSubtractionIndex;
0463
0464
0465
0466
0467 map<CollinearSubtractionIndex,SubtractionHistogram> collinearHistograms;
0468
0469
0470
0471
0472 map<CollinearSubtractionIndex,string> fnamesCollinearSubtraction;
0473
0474
0475
0476
0477 typedef pair<cPDVector,size_t> SoftSubtractionIndex;
0478
0479
0480
0481
0482 map<SoftSubtractionIndex,SubtractionHistogram> softHistograms;
0483
0484
0485
0486
0487 map<SoftSubtractionIndex,string> fnamesSoftSubtraction;
0488
0489
0490
0491
0492 bool theRealShowerSubtraction;
0493
0494
0495
0496
0497 bool theVirtualShowerSubtraction;
0498
0499
0500
0501
0502 bool theLoopSimSubtraction;
0503
0504 private:
0505
0506
0507
0508
0509
0510 SubtractedME & operator=(const SubtractedME &) = delete;
0511
0512 };
0513
0514 inline PersistentOStream& operator<<(PersistentOStream& os,
0515 const SubtractedME::SubtractionHistogram& h) {
0516 h.persistentOutput(os);
0517 return os;
0518 }
0519
0520 inline PersistentIStream& operator>>(PersistentIStream& is,
0521 SubtractedME::SubtractionHistogram& h) {
0522 h.persistentInput(is);
0523 return is;
0524 }
0525
0526 }
0527
0528 #endif