StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
MergingHooks.h
1 // MergingHooks.h is a part of the PYTHIA event generator.
2 // Copyright (C) 2014 Torbjorn Sjostrand.
3 // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
4 // Please respect the MCnet Guidelines, see GUIDELINES for details.
5 
6 // This file is written by Stefan Prestel.
7 // Header file to allow user access to program at different stages.
8 // HardProcess: Container class for the hard process to be merged. Holds the
9 // bookkeeping of particles not be be reclustered
10 // MergingHooks: Steering class for matrix element merging. Some functions can
11 // be redefined in a derived class to have access to the merging
12 
13 #ifndef Pythia8_MergingHooks_H
14 #define Pythia8_MergingHooks_H
15 
16 #include "Pythia8/Basics.h"
17 #include "Pythia8/BeamParticle.h"
18 #include "Pythia8/Event.h"
19 #include "Pythia8/Info.h"
20 #include "Pythia8/ParticleData.h"
21 #include "Pythia8/PartonSystems.h"
22 #include "Pythia8/PythiaStdlib.h"
23 #include "Pythia8/Settings.h"
24 
25 namespace Pythia8 {
26 
27 //==========================================================================
28 
29 // Declaration of hard process class
30 // This class holds information on the desired hard 2->2 process
31 // for the merging.
32 // This class is a container class for History class use.
33 
34 class HardProcess {
35 
36 public:
37 
38  // Flavour of the first incoming particle
39  int hardIncoming1;
40  // Flavour of the second incoming particle
41  int hardIncoming2;
42  // Flavours of the outgoing particles
43  vector<int> hardOutgoing1;
44  vector<int> hardOutgoing2;
45  // Flavour of intermediate bosons in the hard 2->2
46  vector<int> hardIntermediate;
47 
48  // Current reference event
49  Event state;
50  // Potential positions of outgoing particles in reference event
51  vector<int> PosOutgoing1;
52  vector<int> PosOutgoing2;
53  // Potential positions of intermediate bosons in reference event
54  vector<int> PosIntermediate;
55 
56  // Information on merging scale read from LHE file
57  double tms;
58 
59  // Default constructor
60  HardProcess(){}
61  // Default destructor
62  ~HardProcess(){}
63 
64  // Copy constructor
65  HardProcess( const HardProcess& hardProcessIn )
66  : state(hardProcessIn.state),
67  tms(hardProcessIn.tms) {
68  hardIncoming1 = hardProcessIn.hardIncoming1;
69  hardIncoming2 = hardProcessIn.hardIncoming2;
70  for(int i =0; i < int(hardProcessIn.hardOutgoing1.size());++i)
71  hardOutgoing1.push_back( hardProcessIn.hardOutgoing1[i]);
72  for(int i =0; i < int(hardProcessIn.hardOutgoing2.size());++i)
73  hardOutgoing2.push_back( hardProcessIn.hardOutgoing2[i]);
74  for(int i =0; i < int(hardProcessIn.hardIntermediate.size());++i)
75  hardIntermediate.push_back( hardProcessIn.hardIntermediate[i]);
76  for(int i =0; i < int(hardProcessIn.PosOutgoing1.size());++i)
77  PosOutgoing1.push_back( hardProcessIn.PosOutgoing1[i]);
78  for(int i =0; i < int(hardProcessIn.PosOutgoing2.size());++i)
79  PosOutgoing2.push_back( hardProcessIn.PosOutgoing2[i]);
80  for(int i =0; i < int(hardProcessIn.PosIntermediate.size());++i)
81  PosIntermediate.push_back( hardProcessIn.PosIntermediate[i]);
82  }
83 
84  // Constructor with path to LHE file
85  HardProcess( string LHEfile, ParticleData* particleData) {
86  state = Event();
87  state.init("(hard process)", particleData);
88  translateLHEFString(LHEfile);
89  }
90 
91  // Constructor with core process input
92  void initOnProcess( string process, ParticleData* particleData);
93 
94  // Constructor with path to LHE file input
95  void initOnLHEF( string LHEfile, ParticleData* particleData);
96 
97  // Function to access the LHE file and read relevant information
98  void translateLHEFString( string LHEpath);
99 
100  // Function to translate the process string (in MG/ME notation)
101  void translateProcessString( string process);
102 
103  // Function to clear hard process information
104  void clear();
105 
106  // Function to check whether the sets of candidates Pos1, Pos2, together
107  // with the proposed candidate iPos give an allowed hard process state
108  bool allowCandidates(int iPos, vector<int> Pos1, vector<int> Pos2,
109  const Event& event);
110  // Function to identify the hard subprocess in the current event
111  void storeCandidates( const Event& event, string process);
112  // Function to check if the particle event[iPos] matches any of
113  // the stored outgoing particles of the hard subprocess
114  bool matchesAnyOutgoing(int iPos, const Event& event);
115  // Function to check if instead of the particle event[iCandidate], another
116  // particle could serve as part of the hard process. Assumes that iCandidate
117  // is already stored as part of the hard process.
118  bool findOtherCandidates(int iPos, const Event& event, bool doReplace);
119  // Function to exchange a stored hard process candidate with another choice.
120  bool exchangeCandidates( vector<int> candidates1, vector<int> candidates2,
121  map<int,int> further1, map<int,int> further2);
122 
123  // Function to get the number of coloured final state partons in the
124  // hard process
125  int nQuarksOut();
126  // Function to get the number of uncoloured final state particles in the
127  // hard process
128  int nLeptonOut();
129  // Function to get the number of electroweak final state bosons in the
130  // hard process
131  int nBosonsOut();
132 
133  // Function to get the number of coloured initial state partons in the
134  // hard process
135  int nQuarksIn();
136  // Function to get the number of uncoloured initial state particles in the
137  // hard process
138  int nLeptonIn();
139  // Function to report if a resonace decay was found in the 2->2 sub-process
140  // of the current state
141  int hasResInCurrent();
142  // Function to report the number of resonace decays in the 2->2 sub-process
143  // of the current state
144  int nResInCurrent();
145  // Function to report if a resonace decay was found in the 2->2 hard process
146  bool hasResInProc();
147  // Function to print the hard process (for debug)
148  void list() const;
149  // Function to print the hard process candidates in the
150  // Matrix element state (for debug)
151  void listCandidates() const;
152 
153 };
154 
155 //==========================================================================
156 
157 // MergingHooks is base class for user input to the merging procedure.
158 
159 class MergingHooks {
160 
161 public:
162 
163  // Constructor.
164  MergingHooks() :
165  doUserMergingSave(false),
166  doMGMergingSave(false),
167  doKTMergingSave(false),
168  doPTLundMergingSave(false),
169  doCutBasedMergingSave(false),
170  doNL3TreeSave(false),
171  doNL3LoopSave(false),
172  doNL3SubtSave(false),
173  doUNLOPSTreeSave(false),
174  doUNLOPSLoopSave(false),
175  doUNLOPSSubtSave(false),
176  doUNLOPSSubtNLOSave(false),
177  doUMEPSTreeSave(false),
178  doUMEPSSubtSave(false),
179  doEstimateXSection(false),
180  doRemoveDecayProducts(false),
181  doOrderHistoriesSave(true),
182  doCutOnRecStateSave(false),
183  doWClusteringSave(false),
184  doSQCDClusteringSave(false),
185  doIgnoreEmissionsSave(true),
186  doIgnoreStepSave(true) {
187  inputEvent = Event(); resonances.resize(0); infoPtr = 0;
188  particleDataPtr = 0; partonSystemsPtr = 0;}
189 
190  // Make History class friend to allow access to advanced switches
191  friend class History;
192  // Make Pythia class friend
193  friend class Pythia;
194  // Make PartonLevel class friend
195  friend class PartonLevel;
196  // Make SpaceShower class friend
197  friend class SpaceShower;
198  // Make TimeShower class friend
199  friend class TimeShower;
200  // Make Merging class friend
201  friend class Merging;
202 
203  //----------------------------------------------------------------------//
204  // Functions that allow user interference
205  //----------------------------------------------------------------------//
206 
207  // Destructor.
208  virtual ~MergingHooks(){}
209  // Function encoding the functional definition of the merging scale
210  virtual double tmsDefinition( const Event& event){ return event[0].e();}
211  // Function to dampen weights calculated from histories with lowest
212  // multiplicity reclustered events that do not pass the ME cuts
213  virtual double dampenIfFailCuts( const Event& inEvent ) {
214  // Dummy statement to avoid compiler warnings
215  if(false) cout << inEvent[0].e();
216  return 1.;
217  }
218  // Hooks to disallow states in the construction of all histories, e.g.
219  // because jets are below the merging scale or fail the matrix element cuts
220  // Function to allow interference in the construction of histories
221  virtual bool canCutOnRecState() { return doCutOnRecStateSave; }
222  // Function to check reclustered state while generating all possible
223  // histories
224  // Function implementing check of reclustered events while constructing
225  // all possible histories
226  virtual bool doCutOnRecState( const Event& event ) {
227  // Dummy statement to avoid compiler warnings.
228  if(false) cout << event[0].e();
229  // Count number of final state partons.
230  int nPartons = 0;
231  for( int i=0; i < int(event.size()); ++i)
232  if( event[i].isFinal()
233  && (event[i].isGluon() || event[i].isQuark()) )
234  nPartons++;
235  // For gg -> h, allow only histories with gluons in initial state
236  if( hasEffectiveG2EW() && nPartons < 2){
237  if(event[3].id() != 21 && event[4].id() != 21)
238  return true;
239  }
240  return false;
241  }
242  // Function to allow not counting a trial emission.
243  virtual bool canVetoTrialEmission() { return false;}
244  // Function to check if trial emission should be rejected.
245  virtual bool doVetoTrialEmission( const Event&, const Event& ) {
246  return false; }
247 
248  // Function to calculate the hard process matrix element.
249  virtual double hardProcessME( const Event& inEvent ) {
250  // Dummy statement to avoid compiler warnings.
251  if ( false ) cout << inEvent[0].e(); return 1.; }
252 
253  //----------------------------------------------------------------------//
254  // Simple output functions
255  //----------------------------------------------------------------------//
256 
257  // Function returning the value of the merging scale.
258  double tms() {
259  if(doCutBasedMergingSave) return 0.;
260  else return tmsValueSave;
261  }
262  // Function returning the value of the Delta R_{ij} cut for
263  // cut based merging scale definition.
264  double dRijMS() {
265  return ((tmsListSave.size() == 3) ? tmsListSave[0] : 0.);
266  }
267  // Function returning the value of the pT_{i} cut for
268  // cut based merging scale definition.
269  double pTiMS() {
270  return ((tmsListSave.size() == 3) ? tmsListSave[1] : 0.);
271  }
272  // Function returning the value of the pT_{i} cut for
273  // cut based merging scale definition.
274  double QijMS() {
275  return ((tmsListSave.size() == 3) ? tmsListSave[2] : 0.);
276  }
277  // Function returning the value of the maximal number of merged jets.
278  int nMaxJets() { return nJetMaxSave;}
279  // Function returning the value of the maximal number of merged jets,
280  // for which NLO corrections are available.
281  int nMaxJetsNLO() { return nJetMaxNLOSave;}
282  // Function to return hard process string.
283  string getProcessString() { return processSave;}
284  // Function to return the number of outgoing partons in the core process
285  int nHardOutPartons(){ return hardProcess.nQuarksOut();}
286  // Function to return the number of outgoing leptons in the core process
287  int nHardOutLeptons(){ return hardProcess.nLeptonOut();}
288  // Function to return the number of outgoing electroweak bosons in the core
289  // process.
290  int nHardOutBosons(){ return hardProcess.nBosonsOut();}
291  // Function to return the number of incoming partons (hadrons) in the core
292  // process.
293  int nHardInPartons(){ return hardProcess.nQuarksIn();}
294  // Function to return the number of incoming leptons in the core process.
295  int nHardInLeptons(){ return hardProcess.nLeptonIn();}
296  // Function to report the number of resonace decays in the 2->2 sub-process
297  // of the current state.
298  int nResInCurrent(){ return hardProcess.nResInCurrent();}
299  // Function to determine if user defined merging should be applied.
300  bool doUserMerging(){ return doUserMergingSave;}
301  // Function to determine if automated MG/ME merging should be applied.
302  bool doMGMerging() { return doMGMergingSave;}
303  // Function to determine if KT merging should be applied.
304  bool doKTMerging() { return doKTMergingSave;}
305  // Function to determine if PTLund merging should be applied.
306  bool doPTLundMerging() { return doPTLundMergingSave;}
307  // Function to determine if cut based merging should be applied.
308  bool doCutBasedMerging() { return doCutBasedMergingSave;}
309  bool doCKKWLMerging() { return (doUserMergingSave || doMGMergingSave
310  || doKTMergingSave || doPTLundMergingSave || doCutBasedMergingSave); }
311  // Functions to determine if and which part of UMEPS merging
312  // should be applied
313  bool doUMEPSTree() { return doUMEPSTreeSave;}
314  bool doUMEPSSubt() { return doUMEPSSubtSave;}
315  bool doUMEPSMerging() { return (doUMEPSTreeSave || doUMEPSSubtSave);}
316  // Functions to determine if and which part of NL3 merging
317  // should be applied
318  bool doNL3Tree() { return doNL3TreeSave;}
319  bool doNL3Loop() { return doNL3LoopSave;}
320  bool doNL3Subt() { return doNL3SubtSave;}
321  bool doNL3Merging() { return (doNL3TreeSave || doNL3LoopSave
322  || doNL3SubtSave); }
323  // Functions to determine if and which part of UNLOPS merging
324  // should be applied
325  bool doUNLOPSTree() { return doUNLOPSTreeSave;}
326  bool doUNLOPSLoop() { return doUNLOPSLoopSave;}
327  bool doUNLOPSSubt() { return doUNLOPSSubtSave;}
328  bool doUNLOPSSubtNLO() { return doUNLOPSSubtNLOSave;}
329  bool doUNLOPSMerging() { return (doUNLOPSTreeSave || doUNLOPSLoopSave
330  || doUNLOPSSubtSave || doUNLOPSSubtNLOSave); }
331  // Return the number clustering steps that have actually been done.
332  int nRecluster() { return nReclusterSave;}
333 
334  //----------------------------------------------------------------------//
335  // Output functions to analyse/prepare event for merging
336  //----------------------------------------------------------------------//
337 
338  // Function to check if event contains an emission not present in the hard
339  // process.
340  bool isFirstEmission(const Event& event);
341 
342  // Function to allow effective gg -> EW boson couplings.
343  bool hasEffectiveG2EW() {
344  if ( getProcessString().compare("pp>h") == 0 ) return true;
345  return false; }
346 
347  // Return event stripped from decay products.
348  Event bareEvent( const Event& inputEventIn, bool storeInputEvent );
349  // Write event with decay products attached to argument.
350  bool reattachResonanceDecays( Event& process );
351 
352  // Check if particle at position iPos is part of the hard sub-system
353  bool isInHard( int iPos, const Event& event);
354 
355  // Function to return the number of clustering steps for the current event
356  int getNumberOfClusteringSteps(const Event& event);
357 
358  //----------------------------------------------------------------------//
359  // Functions to steer contruction of histories
360  //----------------------------------------------------------------------//
361 
362  // Function to force preferred picking of ordered histories. By default,
363  // unordered histories will only be considered if no ordered histories
364  // were found.
365  void orderHistories( bool doOrderHistoriesIn) {
366  doOrderHistoriesSave = doOrderHistoriesIn; }
367  // Function to force cut on reconstructed states internally, as needed
368  // for gg -> Higgs to ensure that e.g. uu~ -> Higgs is not constructed.
369  void allowCutOnRecState( bool doCutOnRecStateIn) {
370  doCutOnRecStateSave = doCutOnRecStateIn; }
371 
372  // Function to allow final state clusterings of W-bosons
373  void doWClustering( bool doWClusteringIn ) {
374  doWClusteringSave = doWClusteringIn; }
375 
376  //----------------------------------------------------------------------//
377  // Functions used as default merging scales
378  //----------------------------------------------------------------------//
379 
380  // Function to check if the input particle is a light jet, i.e. should be
381  // checked against the merging scale defintion.
382  bool checkAgainstCut( const Particle& particle);
383  // Function to return the value of the merging scale function in the
384  // current event.
385  double tmsNow( const Event& event );
386  // Find the minimal Lund pT between coloured partons in the event
387  double rhoms( const Event& event, bool withColour);
388  // Function to calculate the minimal kT in the event
389  double kTms(const Event & event);
390  // Find the if the event passes the Delta R_{ij}, pT_{i} and Q_{ij} cuts on
391  // the matrix element, as needed for cut-based merging scale definition
392  double cutbasedms( const Event& event );
393 
394 protected:
395 
396  //----------------------------------------------------------------------//
397  // The members, switches etc.
398  //----------------------------------------------------------------------//
399 
400  // Helper class doing all the core process book-keeping
401  HardProcess hardProcess;
402 
403  // Pointer to various information on the generation.
404  Info* infoPtr;
405 
406  // Pointer to the particle data table.
407  ParticleData* particleDataPtr;
408 
409  // Pointer to the particle systems.
410  PartonSystems* partonSystemsPtr;
411 
412  // AlphaS objects for alphaS reweighting use
413  AlphaStrong AlphaS_FSRSave;
414  AlphaStrong AlphaS_ISRSave;
415  AlphaEM AlphaEM_FSRSave;
416 
417  // Saved path to LHE file for more automated merging
418  string lheInputFile;
419 
420  // Flags for merging procedure definition.
421  bool doUserMergingSave, doMGMergingSave, doKTMergingSave,
422  doPTLundMergingSave, doCutBasedMergingSave,
423  includeMassiveSave, enforceStrongOrderingSave, orderInRapiditySave,
424  pickByFullPSave, pickByPoPT2Save, includeRedundantSave,
425  pickBySumPTSave, allowColourShufflingSave, resetHardQRenSave,
426  resetHardQFacSave;
427  int unorderedScalePrescipSave, unorderedASscalePrescipSave,
428  unorderedPDFscalePrescipSave, incompleteScalePrescipSave,
429  ktTypeSave, nReclusterSave, nQuarksMergeSave;
430  double scaleSeparationFactorSave, nonJoinedNormSave,
431  fsrInRecNormSave, herwigAcollFSRSave, herwigAcollISRSave,
432  pT0ISRSave, pTcutSave;
433  bool doNL3TreeSave, doNL3LoopSave, doNL3SubtSave;
434  bool doUNLOPSTreeSave, doUNLOPSLoopSave, doUNLOPSSubtSave,
435  doUNLOPSSubtNLOSave;
436  bool doUMEPSTreeSave, doUMEPSSubtSave;
437 
438  // Flag to only do phase space cut, rejecting events below the tms cut.
439  bool doEstimateXSection;
440 
441  // Save input event in case decay products need to be detached.
442  Event inputEvent;
443  vector< pair<int,int> > resonances;
444  bool doRemoveDecayProducts;
445 
446  // Starting scale for attaching MPI.
447  double muMISave;
448 
449  // Precalculated K-factors.
450  double kFactor0jSave;
451  double kFactor1jSave;
452  double kFactor2jSave;
453 
454  // Saved members.
455  double tmsValueSave, DparameterSave;
456  int nJetMaxSave;
457  int nJetMaxNLOSave;
458  string processSave;
459 
460  // List of cut values to used to define a merging scale. Ordering:
461  // 0: DeltaR_{jet_i,jet_j,min}
462  // 1: p_{T,jet_i,min}
463  // 2: Q_{jet_i,jet_j,min}
464  vector<double> tmsListSave;
465 
466  // INTERNAL Hooks to allow construction of all histories,
467  // including un-ordered ones
468  bool doOrderHistoriesSave;
469 
470  // INTERNAL Hooks to disallow states in the construction of all histories,
471  // e.g. because jets are below the merging scale, of to avoid the
472  // construction of uu~ -> Higgs histories.
473  bool doCutOnRecStateSave;
474 
475  // INTERNAL Hooks to allow clustering W bosons.
476  bool doWClusteringSave, doSQCDClusteringSave;
477 
478  // Store / get first scale in PDF's that Pythia should have used
479  double muFSave;
480  double muRSave;
481 
482  // Store / get factorisation scale used in matrix element calculation.
483  double muFinMESave;
484  double muRinMESave;
485 
486  // Flag to indicate trial shower usage.
487  bool doIgnoreEmissionsSave;
488  // Flag to indicate if events should be vetoed.
489  bool doIgnoreStepSave;
490  // Stored weights in case veot needs to be revoked
491  double pTsave;
492  double weightCKKWL1Save, weightCKKWL2Save;
493  int nMinMPISave;
494  // Save CKKW-L weight / O(\alpha_s) weight.
495  double weightCKKWLSave, weightFIRSTSave;
496 
497  //----------------------------------------------------------------------//
498  // Generic setup functions
499  //----------------------------------------------------------------------//
500 
501  // Functions for internal use inside Pythia source code
502  // Initialize.
503  void init( Settings settings, Info* infoPtrIn,
504  ParticleData* particleDataPtrIn, PartonSystems* partonSystemsPtrIn,
505  ostream& os = cout);
506 
507  // Function storing candidates for the hard process in the current event
508  // Needed in order not to cluster members of the core process
509  void storeHardProcessCandidates(const Event& event){
510  hardProcess.storeCandidates(event,getProcessString());
511  }
512  // Function to set the path to the LHE file, so that more automated merging
513  // can be used.
514  // Remove "_1.lhe" suffix from LHE file name.
515  // This is done so that the HarsProcess class can access both the +0 and +1
516  // LHE files to find both the merging scale and the core process string
517  // Store.
518  void setLHEInputFile( string lheFile) {
519  lheInputFile = lheFile.substr(0,lheFile.size()-6); }
520 
521  //----------------------------------------------------------------------//
522  // Functions for output of class members.
523  //----------------------------------------------------------------------//
524 
525  // Return AlphaStrong objects
526  AlphaStrong* AlphaS_FSR() { return &AlphaS_FSRSave;}
527  AlphaStrong* AlphaS_ISR() { return &AlphaS_ISRSave;}
528  AlphaEM* AlphaEM_FSR() { return &AlphaEM_FSRSave;}
529 
530  // Functions to return advanced merging switches
531  // Include masses in definition of evolution pT and splitting kernels
532  bool includeMassive() { return includeMassiveSave;}
533  // Prefer strongly ordered histories
534  bool enforceStrongOrdering() { return enforceStrongOrderingSave;}
535  // Prefer histories ordered in rapidity and evolution pT
536  bool orderInRapidity() { return orderInRapiditySave;}
537  // Pick history probabilistically by full (correct) splitting probabilities
538  bool pickByFull() { return pickByFullPSave;}
539  // Pick history probabilistically, with easier form of probabilities
540  bool pickByPoPT2() { return pickByPoPT2Save;}
541  // Include redundant terms (e.g. PDF ratios) in the splitting probabilities
542  bool includeRedundant(){ return includeRedundantSave;}
543  // Pick by winner-takes-it-all, with minimum sum of scalar evolution pT
544  bool pickBySumPT(){ return pickBySumPTSave;}
545 
546  // Prescription for combined scale of unordered emissions
547  // 0 : use larger scale
548  // 1 : use smaller scale
549  int unorderedScalePrescip() { return unorderedScalePrescipSave;}
550  // Prescription for combined scale used in alpha_s for unordered emissions
551  // 0 : use combined emission scale in alpha_s weight for both (!) splittings
552  // 1 : use original reclustered scales of each emission in alpha_s weight
553  int unorderedASscalePrescip() { return unorderedASscalePrescipSave;}
554  // Prescription for combined scale used in PDF ratios for unordered
555  // emissions
556  // 0 : use combined emission scale in PDFs for both (!) splittings
557  // 1 : use original reclustered scales of each emission in PDF ratiost
558  int unorderedPDFscalePrescip() { return unorderedPDFscalePrescipSave;}
559  // Prescription for starting scale of incomplete histories
560  // 0: use factorization scale
561  // 1: use sHat
562  // 2: use s
563  int incompleteScalePrescip() { return incompleteScalePrescipSave;}
564 
565  // Allow swapping one colour index while reclustering
566  bool allowColourShuffling() { return allowColourShufflingSave;}
567 
568  // Allow use of dynamical renormalisation scale of the core 2-> 2 process.
569  bool resetHardQRen() { return resetHardQRenSave; }
570  // Allow use of dynamical factorisation scale of the core 2-> 2 process.
571  bool resetHardQFac() { return resetHardQFacSave; }
572 
573  // Factor by which two scales should differ to be classified strongly
574  // ordered.
575  double scaleSeparationFactor() { return scaleSeparationFactorSave;}
576  // Absolute normalization of splitting probability for non-joined
577  // evolution.
578  double nonJoinedNorm() { return nonJoinedNormSave;}
579  // Absolute normalization of splitting probability for final state
580  // splittings with initial state recoiler
581  double fsrInRecNorm() { return fsrInRecNormSave;}
582  // Factor multiplying scalar evolution pT for FSR splitting, when picking
583  // history by minimum scalar pT (see Jonathan Tully's thesis)
584  double herwigAcollFSR() { return herwigAcollFSRSave;}
585  // Factor multiplying scalar evolution pT for ISR splitting, when picking
586  // history by minimum scalar pT (see Jonathan Tully's thesis)
587  double herwigAcollISR() { return herwigAcollISRSave;}
588  // ISR regularisation scale
589  double pT0ISR() { return pT0ISRSave;}
590  // Shower cut-off scale
591  double pTcut() { return pTcutSave;}
592 
593  // MI starting scale.
594  void muMI( double mu) { muMISave = mu; }
595  double muMI() { return muMISave;}
596 
597  // Full k-Factor for current event
598  double kFactor(int njet = 0) {
599  return (njet == 0) ? kFactor0jSave
600  :(njet == 1) ? kFactor1jSave
601  : kFactor2jSave;
602  }
603  // O(\alhpa_s)-term of the k-Factor for current event
604  double k1Factor( int njet = 0) {
605  return (kFactor(njet) - 1)/infoPtr->alphaS();
606  }
607 
608  // Function to return if construction of histories is biased towards ordered
609  // histories.
610  bool orderHistories() { return doOrderHistoriesSave;}
611 
612  // INTERNAL Hooks to disallow states in the construction of all histories,
613  // e.g. because jets are below the merging scale, of to avoid the
614  // construction of uu~ -> Higgs histories.
615  bool allowCutOnRecState() { return doCutOnRecStateSave;}
616 
617  // INTERNAL Hooks to allow clustering W bosons.
618  bool doWClustering() { return doWClusteringSave;}
619  // INTERNAL Hooks to allow clustering clustering of gluons to squarks.
620  bool doSQCDClustering() { return doSQCDClusteringSave;}
621 
622  // Store / get first scale in PDF's that Pythia should have used
623  double muF() { return (muFSave > 0.) ? muFSave : infoPtr->QFac();}
624  double muR() { return (muRSave > 0.) ? muRSave : infoPtr->QRen();}
625  // Store / get factorisation scale used in matrix element calculation.
626  double muFinME() { return (muFinMESave > 0.) ? muFinMESave
627  : infoPtr->QFac();}
628  double muRinME() { return (muRinMESave > 0.) ? muRinMESave
629  : infoPtr->QRen();}
630 
631  //----------------------------------------------------------------------//
632  // Functions to steer shower evolution
633  //----------------------------------------------------------------------//
634 
635  // Flag to indicate trial shower usage.
636  void doIgnoreEmissions( bool doIgnoreIn ) {
637  doIgnoreEmissionsSave = doIgnoreIn;
638  }
639  // Function to allow not counting a trial emission.
640  bool canVetoEmission() { return !doIgnoreEmissionsSave; }
641  // Function to check if emission should be rejected.
642  bool doVetoEmission( const Event& );
643 
644  // Flag to indicate if events should be vetoed.
645  void doIgnoreStep( bool doIgnoreIn ) { doIgnoreStepSave = doIgnoreIn; }
646  // Function to allow event veto.
647  bool canVetoStep() { return !doIgnoreStepSave; }
648  // Function to check event veto.
649  bool doVetoStep( const Event& process, const Event& event,
650  bool doResonance = false );
651 
652  // Stored weights in case veot needs to be revoked
653  void storeWeights( double weight ){ weightCKKWL1Save = weightCKKWL2Save
654  = weight; }
655 
656  // Set starting scales
657  bool setShowerStartingScales( bool isTrial, bool doMergeFirstEmm,
658  double& pTscaleIn, const Event& event,
659  double& pTmaxFSRIn, bool& limitPTmaxFSRin,
660  double& pTmaxISRIn, bool& limitPTmaxISRin,
661  double& pTmaxMPIIn, bool& limitPTmaxMPIin );
662  void nMinMPI( int nMinMPIIn ) { nMinMPISave = nMinMPIIn; }
663  int nMinMPI() { return nMinMPISave;}
664 
665  //----------------------------------------------------------------------//
666  // Functions for internal merging scale definions
667  //----------------------------------------------------------------------//
668 
669  // Function to calculate the kT separation between two particles
670  double kTdurham(const Particle& RadAfterBranch,
671  const Particle& EmtAfterBranch, int Type, double D );
672  // Function to compute "pythia pT separation" from Particle input
673  double rhoPythia(const Particle& RadAfterBranch,
674  const Particle& EmtAfterBranch, const Particle& RecAfterBranch,
675  int ShowerType);
676  // Function to find a colour (anticolour) index in the input event,
677  // used to find colour-connected recoilers
678  int findColour(int col, int iExclude1, int iExclude2,
679  const Event& event, int type, bool isHardIn);
680  // Function to compute Delta R separation from 4-vector input
681  double deltaRij(Vec4 jet1, Vec4 jet2);
682 
683  //----------------------------------------------------------------------//
684  // Functions for weight management
685  //----------------------------------------------------------------------//
686 
687  // Function to get the CKKW-L weight for the current event
688  double getWeightNLO() { return (weightCKKWLSave - weightFIRSTSave);}
689  // Return CKKW-L weight.
690  double getWeightCKKWL() { return weightCKKWLSave; }
691  // Return O(\alpha_s) weight.
692  double getWeightFIRST() { return weightFIRSTSave; }
693  // Set CKKW-L weight.
694  void setWeightCKKWL( double weightIn){
695  weightCKKWLSave = weightIn;
696  infoPtr->setWeightCKKWL(weightIn); }
697  // Set O(\alpha_s) weight.
698  void setWeightFIRST( double weightIn){
699  weightFIRSTSave = weightIn;
700  infoPtr->setWeightFIRST(weightIn); }
701 
702 };
703 
704 //==========================================================================
705 
706 } // end namespace Pythia8
707 
708 #endif // Pythia8_MergingHooks_H
Definition: AgUStep.h:26