StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
main31.cc
1 // main31.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2014 Richard Corke, 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 #include "Pythia8/Pythia.h"
7 using namespace Pythia8;
8 
9 //==========================================================================
10 
11 // Use userhooks to veto PYTHIA emissions above the POWHEG scale.
12 
13 class PowhegHooks : public UserHooks {
14 
15 public:
16 
17  // Constructor and destructor.
18  PowhegHooks(int nFinalIn, int vetoModeIn, int vetoCountIn,
19  int pThardModeIn, int pTemtModeIn, int emittedModeIn,
20  int pTdefModeIn, int MPIvetoModeIn) : nFinal(nFinalIn),
21  vetoMode(vetoModeIn), vetoCount(vetoCountIn),
22  pThardMode(pThardModeIn), pTemtMode(pTemtModeIn),
23  emittedMode(emittedModeIn), pTdefMode(pTdefModeIn),
24  MPIvetoMode(MPIvetoModeIn) {};
25  ~PowhegHooks() {}
26 
27 //--------------------------------------------------------------------------
28 
29  // Routines to calculate the pT (according to pTdefMode) in a splitting:
30  // ISR: i (radiator after) -> j (emitted after) k (radiator before)
31  // FSR: i (radiator before) -> j (emitted after) k (radiator after)
32  // For the Pythia pT definition, a recoiler (after) must be specified.
33 
34  // Compute the Pythia pT separation. Based on pTLund function in History.cc
35  double pTpythia(const Event &e, int RadAfterBranch, int EmtAfterBranch,
36  int RecAfterBranch, bool FSR) {
37 
38  // Convenient shorthands for later
39  Vec4 radVec = e[RadAfterBranch].p();
40  Vec4 emtVec = e[EmtAfterBranch].p();
41  Vec4 recVec = e[RecAfterBranch].p();
42  int radID = e[RadAfterBranch].id();
43 
44  // Calculate virtuality of splitting
45  double sign = (FSR) ? 1. : -1.;
46  Vec4 Q(radVec + sign * emtVec);
47  double Qsq = sign * Q.m2Calc();
48 
49  // Mass term of radiator
50  double m2Rad = (abs(radID) >= 4 && abs(radID) < 7) ?
51  pow2(particleDataPtr->m0(radID)) : 0.;
52 
53  // z values for FSR and ISR
54  double z, pTnow;
55  if (FSR) {
56  // Construct 2 -> 3 variables
57  Vec4 sum = radVec + recVec + emtVec;
58  double m2Dip = sum.m2Calc();
59  double x1 = 2. * (sum * radVec) / m2Dip;
60  double x3 = 2. * (sum * emtVec) / m2Dip;
61  z = x1 / (x1 + x3);
62  pTnow = z * (1. - z);
63 
64  } else {
65  // Construct dipoles before/after splitting
66  Vec4 qBR(radVec - emtVec + recVec);
67  Vec4 qAR(radVec + recVec);
68  z = qBR.m2Calc() / qAR.m2Calc();
69  pTnow = (1. - z);
70  }
71 
72  // Virtuality with correct sign
73  pTnow *= (Qsq - sign * m2Rad);
74 
75  // Can get negative pT for massive splittings
76  if (pTnow < 0.) {
77  cout << "Warning: pTpythia was negative" << endl;
78  return -1.;
79  }
80 
81 #ifdef DBGOUTPUT
82  cout << "pTpythia: rad = " << RadAfterBranch << ", emt = "
83  << EmtAfterBranch << ", rec = " << RecAfterBranch
84  << ", pTnow = " << sqrt(pTnow) << endl;
85 #endif
86 
87  // Return pT
88  return sqrt(pTnow);
89  }
90 
91  // Compute the POWHEG pT separation between i and j
92  double pTpowheg(const Event &e, int i, int j, bool FSR) {
93 
94  // pT value for FSR and ISR
95  double pTnow = 0.;
96  if (FSR) {
97  // POWHEG d_ij (in CM frame). Note that the incoming beams have not
98  // been updated in the parton systems pointer yet (i.e. prior to any
99  // potential recoil).
100  int iInA = partonSystemsPtr->getInA(0);
101  int iInB = partonSystemsPtr->getInB(0);
102  double betaZ = - ( e[iInA].pz() + e[iInB].pz() ) /
103  ( e[iInA].e() + e[iInB].e() );
104  Vec4 iVecBst(e[i].p()), jVecBst(e[j].p());
105  iVecBst.bst(0., 0., betaZ);
106  jVecBst.bst(0., 0., betaZ);
107  pTnow = sqrt( (iVecBst + jVecBst).m2Calc() *
108  iVecBst.e() * jVecBst.e() /
109  pow2(iVecBst.e() + jVecBst.e()) );
110 
111  } else {
112  // POWHEG pT_ISR is just kinematic pT
113  pTnow = e[j].pT();
114  }
115 
116  // Check result
117  if (pTnow < 0.) {
118  cout << "Warning: pTpowheg was negative" << endl;
119  return -1.;
120  }
121 
122 #ifdef DBGOUTPUT
123  cout << "pTpowheg: i = " << i << ", j = " << j
124  << ", pTnow = " << pTnow << endl;
125 #endif
126 
127  return pTnow;
128  }
129 
130  // Calculate pT for a splitting based on pTdefMode.
131  // If j is -1, all final-state partons are tried.
132  // If i, k, r and xSR are -1, then all incoming and outgoing
133  // partons are tried.
134  // xSR set to 0 means ISR, while xSR set to 1 means FSR
135  double pTcalc(const Event &e, int i, int j, int k, int r, int xSRin) {
136 
137  // Loop over ISR and FSR if necessary
138  double pTemt = -1., pTnow;
139  int xSR1 = (xSRin == -1) ? 0 : xSRin;
140  int xSR2 = (xSRin == -1) ? 2 : xSRin + 1;
141  for (int xSR = xSR1; xSR < xSR2; xSR++) {
142  // FSR flag
143  bool FSR = (xSR == 0) ? false : true;
144 
145  // If all necessary arguments have been given, then directly calculate.
146  // POWHEG ISR and FSR, need i and j.
147  if ((pTdefMode == 0 || pTdefMode == 1) && i > 0 && j > 0) {
148  pTemt = pTpowheg(e, i, j, (pTdefMode == 0) ? false : FSR);
149 
150  // Pythia ISR, need i, j and r.
151  } else if (!FSR && pTdefMode == 2 && i > 0 && j > 0 && r > 0) {
152  pTemt = pTpythia(e, i, j, r, FSR);
153 
154  // Pythia FSR, need k, j and r.
155  } else if (FSR && pTdefMode == 2 && j > 0 && k > 0 && r > 0) {
156  pTemt = pTpythia(e, k, j, r, FSR);
157 
158  // Otherwise need to try all possible combintations.
159  } else {
160  // Start by finding incoming legs to the hard system after
161  // branching (radiator after branching, i for ISR).
162  // Use partonSystemsPtr to find incoming just prior to the
163  // branching and track mothers.
164  int iInA = partonSystemsPtr->getInA(0);
165  int iInB = partonSystemsPtr->getInB(0);
166  while (e[iInA].mother1() != 1) { iInA = e[iInA].mother1(); }
167  while (e[iInB].mother1() != 2) { iInB = e[iInB].mother1(); }
168 
169  // If we do not have j, then try all final-state partons
170  int jNow = (j > 0) ? j : 0;
171  int jMax = (j > 0) ? j + 1 : e.size();
172  for (; jNow < jMax; jNow++) {
173 
174  // Final-state and coloured jNow only
175  if (!e[jNow].isFinal() || e[jNow].colType() == 0) continue;
176 
177  // POWHEG
178  if (pTdefMode == 0 || pTdefMode == 1) {
179 
180  // ISR - only done once as just kinematical pT
181  if (!FSR) {
182  pTnow = pTpowheg(e, iInA, jNow, (pTdefMode == 0) ? false : FSR);
183  if (pTnow > 0.) pTemt = (pTemt < 0) ? pTnow : min(pTemt, pTnow);
184 
185  // FSR - try all outgoing partons from system before branching
186  // as i. Note that for the hard system, there is no
187  // "before branching" information.
188  } else {
189 
190  int outSize = partonSystemsPtr->sizeOut(0);
191  for (int iMem = 0; iMem < outSize; iMem++) {
192  int iNow = partonSystemsPtr->getOut(0, iMem);
193 
194  // Coloured only, i != jNow and no carbon copies
195  if (iNow == jNow || e[iNow].colType() == 0) continue;
196  if (jNow == e[iNow].daughter1()
197  && jNow == e[iNow].daughter2()) continue;
198 
199  pTnow = pTpowheg(e, iNow, jNow, (pTdefMode == 0)
200  ? false : FSR);
201  if (pTnow > 0.) pTemt = (pTemt < 0)
202  ? pTnow : min(pTemt, pTnow);
203  } // for (iMem)
204 
205  } // if (!FSR)
206 
207  // Pythia
208  } else if (pTdefMode == 2) {
209 
210  // ISR - other incoming as recoiler
211  if (!FSR) {
212  pTnow = pTpythia(e, iInA, jNow, iInB, FSR);
213  if (pTnow > 0.) pTemt = (pTemt < 0) ? pTnow : min(pTemt, pTnow);
214  pTnow = pTpythia(e, iInB, jNow, iInA, FSR);
215  if (pTnow > 0.) pTemt = (pTemt < 0) ? pTnow : min(pTemt, pTnow);
216 
217  // FSR - try all final-state coloured partons as radiator
218  // after emission (k).
219  } else {
220  for (int kNow = 0; kNow < e.size(); kNow++) {
221  if (kNow == jNow || !e[kNow].isFinal() ||
222  e[kNow].colType() == 0) continue;
223 
224  // For this kNow, need to have a recoiler.
225  // Try two incoming.
226  pTnow = pTpythia(e, kNow, jNow, iInA, FSR);
227  if (pTnow > 0.) pTemt = (pTemt < 0)
228  ? pTnow : min(pTemt, pTnow);
229  pTnow = pTpythia(e, kNow, jNow, iInB, FSR);
230  if (pTnow > 0.) pTemt = (pTemt < 0)
231  ? pTnow : min(pTemt, pTnow);
232 
233  // Try all other outgoing.
234  for (int rNow = 0; rNow < e.size(); rNow++) {
235  if (rNow == kNow || rNow == jNow ||
236  !e[rNow].isFinal() || e[rNow].colType() == 0) continue;
237  pTnow = pTpythia(e, kNow, jNow, rNow, FSR);
238  if (pTnow > 0.) pTemt = (pTemt < 0)
239  ? pTnow : min(pTemt, pTnow);
240  } // for (rNow)
241 
242  } // for (kNow)
243  } // if (!FSR)
244  } // if (pTdefMode)
245  } // for (j)
246  }
247  } // for (xSR)
248 
249 #ifdef DBGOUTPUT
250  cout << "pTcalc: i = " << i << ", j = " << j << ", k = " << k
251  << ", r = " << r << ", xSR = " << xSRin
252  << ", pTemt = " << pTemt << endl;
253 #endif
254 
255  return pTemt;
256  }
257 
258 //--------------------------------------------------------------------------
259 
260  // Extraction of pThard based on the incoming event.
261  // Assume that all the final-state particles are in a continuous block
262  // at the end of the event and the final entry is the POWHEG emission.
263  // If there is no POWHEG emission, then pThard is set to SCALUP.
264 
265  bool canVetoMPIStep() { return true; }
266  int numberVetoMPIStep() { return 1; }
267  bool doVetoMPIStep(int nMPI, const Event &e) {
268  // Extra check on nMPI
269  if (nMPI > 1) return false;
270 
271  // Find if there is a POWHEG emission. Go backwards through the
272  // event record until there is a non-final particle. Also sum pT and
273  // find pT_1 for possible MPI vetoing
274  int count = 0;
275  double pT1 = 0., pTsum = 0.;
276  for (int i = e.size() - 1; i > 0; i--) {
277  if (e[i].isFinal()) {
278  count++;
279  pT1 = e[i].pT();
280  pTsum += e[i].pT();
281  } else break;
282  }
283  // Extra check that we have the correct final state
284  if (count != nFinal && count != nFinal + 1) {
285  cout << "Error: wrong number of final state particles in event" << endl;
286  exit(1);
287  }
288  // Flag if POWHEG radiation present and index
289  bool isEmt = (count == nFinal) ? false : true;
290  int iEmt = (isEmt) ? e.size() - 1 : -1;
291 
292  // If there is no radiation or if pThardMode is 0 then set pThard = SCALUP.
293  if (!isEmt || pThardMode == 0) {
294  pThard = infoPtr->scalup();
295 
296  // If pThardMode is 1 then the pT of the POWHEG emission is checked against
297  // all other incoming and outgoing partons, with the minimal value taken
298  } else if (pThardMode == 1) {
299  pThard = pTcalc(e, -1, iEmt, -1, -1, -1);
300 
301  // If pThardMode is 2, then the pT of all final-state partons is checked
302  // against all other incoming and outgoing partons, with the minimal value
303  // taken
304  } else if (pThardMode == 2) {
305  pThard = pTcalc(e, -1, -1, -1, -1, -1);
306  }
307 
308  // Find MPI veto pT if necessary
309  if (MPIvetoMode == 1) {
310  pTMPI = (isEmt) ? pTsum / 2. : pT1;
311  }
312 
313 #ifdef DBGOUTPUT
314  cout << "doVetoMPIStep: Qfac = " << infoPtr->scalup()
315  << ", pThard = " << pThard << endl << endl;
316 #endif
317 
318  // Initialise other variables
319  accepted = false;
320  nAcceptSeq = nISRveto = nFSRveto = 0;
321 
322  // Do not veto the event
323  return false;
324  }
325 
326 //--------------------------------------------------------------------------
327 
328  // ISR veto
329 
330  bool canVetoISREmission() { return (vetoMode == 0) ? false : true; }
331  bool doVetoISREmission(int, const Event &e, int iSys) {
332  // Must be radiation from the hard system
333  if (iSys != 0) return false;
334 
335  // If we already have accepted 'vetoCount' emissions in a row, do nothing
336  if (vetoMode == 1 && nAcceptSeq >= vetoCount) return false;
337 
338  // Pythia radiator after, emitted and recoiler after.
339  int iRadAft = -1, iEmt = -1, iRecAft = -1;
340  for (int i = e.size() - 1; i > 0; i--) {
341  if (iRadAft == -1 && e[i].status() == -41) iRadAft = i;
342  else if (iEmt == -1 && e[i].status() == 43) iEmt = i;
343  else if (iRecAft == -1 && e[i].status() == -42) iRecAft = i;
344  if (iRadAft != -1 && iEmt != -1 && iRecAft != -1) break;
345  }
346  if (iRadAft == -1 || iEmt == -1 || iRecAft == -1) {
347  e.list();
348  cout << "Error: couldn't find Pythia ISR emission" << endl;
349  exit(1);
350  }
351 
352  // pTemtMode == 0: pT of emitted w.r.t. radiator
353  // pTemtMode == 1: min(pT of emitted w.r.t. all incoming/outgoing)
354  // pTemtMode == 2: min(pT of all outgoing w.r.t. all incoming/outgoing)
355  int xSR = (pTemtMode == 0) ? 0 : -1;
356  int i = (pTemtMode == 0) ? iRadAft : -1;
357  int j = (pTemtMode != 2) ? iEmt : -1;
358  int k = -1;
359  int r = (pTemtMode == 0) ? iRecAft : -1;
360  double pTemt = pTcalc(e, i, j, k, r, xSR);
361 
362 #ifdef DBGOUTPUT
363  cout << "doVetoISREmission: pTemt = " << pTemt << endl << endl;
364 #endif
365 
366  // Veto if pTemt > pThard
367  if (pTemt > pThard) {
368  nAcceptSeq = 0;
369  nISRveto++;
370  return true;
371  }
372 
373  // Else mark that an emission has been accepted and continue
374  nAcceptSeq++;
375  accepted = true;
376  return false;
377  }
378 
379 //--------------------------------------------------------------------------
380 
381  // FSR veto
382 
383  bool canVetoFSREmission() { return (vetoMode == 0) ? false : true; }
384  bool doVetoFSREmission(int, const Event &e, int iSys, bool) {
385  // Must be radiation from the hard system
386  if (iSys != 0) return false;
387 
388  // If we already have accepted 'vetoCount' emissions in a row, do nothing
389  if (vetoMode == 1 && nAcceptSeq >= vetoCount) return false;
390 
391  // Pythia radiator (before and after), emitted and recoiler (after)
392  int iRecAft = e.size() - 1;
393  int iEmt = e.size() - 2;
394  int iRadAft = e.size() - 3;
395  int iRadBef = e[iEmt].mother1();
396  if ( (e[iRecAft].status() != 52 && e[iRecAft].status() != -53) ||
397  e[iEmt].status() != 51 || e[iRadAft].status() != 51) {
398  e.list();
399  cout << "Error: couldn't find Pythia FSR emission" << endl;
400  exit(1);
401  }
402 
403  // Behaviour based on pTemtMode:
404  // 0 - pT of emitted w.r.t. radiator before
405  // 1 - min(pT of emitted w.r.t. all incoming/outgoing)
406  // 2 - min(pT of all outgoing w.r.t. all incoming/outgoing)
407  int xSR = (pTemtMode == 0) ? 1 : -1;
408  int i = (pTemtMode == 0) ? iRadBef : -1;
409  int k = (pTemtMode == 0) ? iRadAft : -1;
410  int r = (pTemtMode == 0) ? iRecAft : -1;
411 
412  // When pTemtMode is 0 or 1, iEmt has been selected
413  double pTemt = 0.;
414  if (pTemtMode == 0 || pTemtMode == 1) {
415  // Which parton is emitted, based on emittedMode:
416  // 0 - Pythia definition of emitted
417  // 1 - Pythia definition of radiated after emission
418  // 2 - Random selection of emitted or radiated after emission
419  // 3 - Try both emitted and radiated after emission
420  int j = iRadAft;
421  if (emittedMode == 0 || (emittedMode == 2 && rndmPtr->flat() < 0.5)) j++;
422 
423  for (int jLoop = 0; jLoop < 2; jLoop++) {
424  if (jLoop == 0) pTemt = pTcalc(e, i, j, k, r, xSR);
425  else if (jLoop == 1) pTemt = min(pTemt, pTcalc(e, i, j, k, r, xSR));
426 
427  // For emittedMode == 3, have tried iRadAft, now try iEmt
428  if (emittedMode != 3) break;
429  if (k != -1) swap(j, k); else j = iEmt;
430  }
431 
432  // If pTemtMode is 2, then try all final-state partons as emitted
433  } else if (pTemtMode == 2) {
434  pTemt = pTcalc(e, i, -1, k, r, xSR);
435 
436  }
437 
438 #ifdef DBGOUTPUT
439  cout << "doVetoFSREmission: pTemt = " << pTemt << endl << endl;
440 #endif
441 
442  // Veto if pTemt > pThard
443  if (pTemt > pThard) {
444  nAcceptSeq = 0;
445  nFSRveto++;
446  return true;
447  }
448 
449  // Else mark that an emission has been accepted and continue
450  nAcceptSeq++;
451  accepted = true;
452  return false;
453  }
454 
455 //--------------------------------------------------------------------------
456 
457  // MPI veto
458 
459  bool canVetoMPIEmission() { return (MPIvetoMode == 0) ? false : true; }
460  bool doVetoMPIEmission(int, const Event &e) {
461  if (MPIvetoMode == 1) {
462  if (e[e.size() - 1].pT() > pTMPI) {
463 #ifdef DBGOUTPUT
464  cout << "doVetoMPIEmission: pTnow = " << e[e.size() - 1].pT()
465  << ", pTMPI = " << pTMPI << endl << endl;
466 #endif
467  return true;
468  }
469  }
470  return false;
471  }
472 
473 //--------------------------------------------------------------------------
474 
475  // Functions to return information
476 
477  int getNISRveto() { return nISRveto; }
478  int getNFSRveto() { return nFSRveto; }
479 
480 private:
481  int nFinal, vetoMode, vetoCount, pThardMode, pTemtMode,
482  emittedMode, pTdefMode, MPIvetoMode;
483  double pThard, pTMPI;
484  bool accepted;
485  // The number of accepted emissions (in a row)
486  int nAcceptSeq;
487  // Statistics on vetos
488  unsigned long int nISRveto, nFSRveto;
489 
490 };
491 
492 //==========================================================================
493 
494 int main(int, char **) {
495 
496  // Generator
497  Pythia pythia;
498 
499  // Add further settings that can be set in the configuration file
500  pythia.settings.addMode("POWHEG:nFinal", 2, true, false, 1, 0);
501  pythia.settings.addMode("POWHEG:veto", 0, true, true, 0, 2);
502  pythia.settings.addMode("POWHEG:vetoCount", 3, true, false, 0, 0);
503  pythia.settings.addMode("POWHEG:pThard", 0, true, true, 0, 2);
504  pythia.settings.addMode("POWHEG:pTemt", 0, true, true, 0, 2);
505  pythia.settings.addMode("POWHEG:emitted", 0, true, true, 0, 3);
506  pythia.settings.addMode("POWHEG:pTdef", 0, true, true, 0, 2);
507  pythia.settings.addMode("POWHEG:MPIveto", 0, true, true, 0, 1);
508 
509  // Load configuration file
510  pythia.readFile("main31.cmnd");
511 
512  // Read in main settings
513  int nEvent = pythia.settings.mode("Main:numberOfEvents");
514  int nError = pythia.settings.mode("Main:timesAllowErrors");
515  // Read in POWHEG settings
516  int nFinal = pythia.settings.mode("POWHEG:nFinal");
517  int vetoMode = pythia.settings.mode("POWHEG:veto");
518  int vetoCount = pythia.settings.mode("POWHEG:vetoCount");
519  int pThardMode = pythia.settings.mode("POWHEG:pThard");
520  int pTemtMode = pythia.settings.mode("POWHEG:pTemt");
521  int emittedMode = pythia.settings.mode("POWHEG:emitted");
522  int pTdefMode = pythia.settings.mode("POWHEG:pTdef");
523  int MPIvetoMode = pythia.settings.mode("POWHEG:MPIveto");
524  bool loadHooks = (vetoMode > 0 || MPIvetoMode > 0);
525 
526  // Add in user hooks for shower vetoing
527  PowhegHooks *powhegHooks = NULL;
528  if (loadHooks) {
529 
530  // Set ISR and FSR to start at the kinematical limit
531  if (vetoMode > 0) {
532  pythia.readString("SpaceShower:pTmaxMatch = 2");
533  pythia.readString("TimeShower:pTmaxMatch = 2");
534  }
535 
536  // Set MPI to start at the kinematical limit
537  if (MPIvetoMode > 0) {
538  pythia.readString("MultipartonInteractions:pTmaxMatch = 2");
539  }
540 
541  powhegHooks = new PowhegHooks(nFinal, vetoMode, vetoCount,
542  pThardMode, pTemtMode, emittedMode, pTdefMode, MPIvetoMode);
543  pythia.setUserHooksPtr((UserHooks *) powhegHooks);
544  }
545 
546  // Initialise and list settings
547  pythia.init();
548 
549  // Counters for number of ISR/FSR emissions vetoed
550  unsigned long int nISRveto = 0, nFSRveto = 0;
551 
552  // Begin event loop; generate until nEvent events are processed
553  // or end of LHEF file
554  int iEvent = 0, iError = 0;
555  while (true) {
556 
557  // Generate the next event
558  if (!pythia.next()) {
559 
560  // If failure because reached end of file then exit event loop
561  if (pythia.info.atEndOfFile()) break;
562 
563  // Otherwise count event failure and continue/exit as necessary
564  cout << "Warning: event " << iEvent << " failed" << endl;
565  if (++iError == nError) {
566  cout << "Error: too many event failures.. exiting" << endl;
567  break;
568  }
569 
570  continue;
571  }
572 
573  /*
574  * Process dependent checks and analysis may be inserted here
575  */
576 
577  // Update ISR/FSR veto counters
578  if (loadHooks) {
579  nISRveto += powhegHooks->getNISRveto();
580  nFSRveto += powhegHooks->getNFSRveto();
581  }
582 
583  // If nEvent is set, check and exit loop if necessary
584  ++iEvent;
585  if (nEvent != 0 && iEvent == nEvent) break;
586 
587  } // End of event loop.
588 
589  // Statistics, histograms and veto information
590  pythia.stat();
591  cout << "Number of ISR emissions vetoed: " << nISRveto << endl;
592  cout << "Number of FSR emissions vetoed: " << nFSRveto << endl;
593  cout << endl;
594 
595  // Done.
596  if (powhegHooks) delete powhegHooks;
597  return 0;
598 }
599