1 | #include "Pythia8/Pythia.h"
|
---|
2 | #include <stdlib.h>
|
---|
3 | #include <math.h>
|
---|
4 | #include <vector>
|
---|
5 | #include <sstream>
|
---|
6 | #include "param_card.h"
|
---|
7 | #include "run_card.h"
|
---|
8 | #include "proc_card.h"
|
---|
9 |
|
---|
10 | bool initialization_done = false;
|
---|
11 |
|
---|
12 | Pythia8::Pythia pythia;
|
---|
13 | // Stringstream of the events in which MG5aMC will write and PY8 read.
|
---|
14 | std::stringstream EvtSS;
|
---|
15 |
|
---|
16 | void generate_header_SS(std::stringstream & headerSS,
|
---|
17 | const int & Pythia8BeamA,
|
---|
18 | const int & Pythia8BeamB,
|
---|
19 | const double & PythiaBeamEnergyA,
|
---|
20 | const double & PythiaBeamEnergyB) {
|
---|
21 | headerSS<<"<LesHouchesEvents version=\"3.0\">\n";
|
---|
22 | headerSS<<"<header>\n";
|
---|
23 | // Writing proc_card.dat in the banner
|
---|
24 | headerSS<<"<MG5ProcCard>\n";
|
---|
25 | headerSS<<ProcCard<<"\n";
|
---|
26 | headerSS<<"</MG5ProcCard>\n";
|
---|
27 | // Writing run_card.dat in the banner
|
---|
28 | headerSS<<"<MGRunCard>\n";
|
---|
29 | headerSS<<RunCard<<"\n";
|
---|
30 | headerSS<<"</MGRunCard>\n";
|
---|
31 | // Writing param_card.dat in the banner
|
---|
32 | headerSS<<"<slha>\n";
|
---|
33 | headerSS<<ParamCard<<"\n";
|
---|
34 | headerSS<<"</slha>\n";
|
---|
35 | headerSS<<"</header>\n";
|
---|
36 | // Writing the init block (only beam related information is relevant here)
|
---|
37 | headerSS<<"<init>\n";
|
---|
38 | headerSS<<Pythia8BeamA<<" "<<Pythia8BeamB<<" ";
|
---|
39 | headerSS<<std::scientific<<PythiaBeamEnergyA<<" "<<std::scientific<<PythiaBeamEnergyB<<" ";
|
---|
40 | // We fill in the rest of the init information with blanks
|
---|
41 | headerSS<<"0 0 -1 -1 -3 1\n";
|
---|
42 | headerSS<<"-1.0 0.0 1.0 1\n";
|
---|
43 | headerSS<<"<generator name='MadGraph5_aMC@NLO'>please cite 1405.0301</generator>\n";
|
---|
44 | headerSS<<"</init>\n";
|
---|
45 | // headerSS<<"</LesHouchesEvents>\n";
|
---|
46 | return;
|
---|
47 | }
|
---|
48 |
|
---|
49 | extern "C" {
|
---|
50 | //Fortran interface
|
---|
51 | void py8_bias_weight_(const double & eCM,
|
---|
52 | const int & Pythia8BeamA,
|
---|
53 | const double & PythiaBeamEnergyA,
|
---|
54 | const int & Pythia8BeamB,
|
---|
55 | const double & PythiaBeamEnergyB,
|
---|
56 | const char * Pythia8EvtRecord,
|
---|
57 | const double * p,
|
---|
58 | const int & nParticles,
|
---|
59 | const double & MurScale,
|
---|
60 | const double & AlphaQCD,
|
---|
61 | const double & AlphaQED,
|
---|
62 | const int * Pythia8ID,
|
---|
63 | const int * Pythia8MotherOne,
|
---|
64 | const int * Pythia8MotherTwo,
|
---|
65 | const int * Pythia8ColorOne,
|
---|
66 | const int * Pythia8ColorTwo,
|
---|
67 | const int * Pythia8Status,
|
---|
68 | const int * Pythia8Helicities,
|
---|
69 | double & OutputBiasWeight )
|
---|
70 | {
|
---|
71 | if (!initialization_done) {
|
---|
72 | // /!\ WARNING this example is tailored for p p > z > e+ e- j for now.
|
---|
73 |
|
---|
74 | pythia.readString("Merging:doKtMerging=on");
|
---|
75 | pythia.readString("Merging:Process=pp>e+e-");
|
---|
76 | pythia.readString("Merging:TMS=30.0");
|
---|
77 | pythia.readString("Merging:nJetMax=2");
|
---|
78 | pythia.readString("Merging:applyVeto=off");
|
---|
79 | pythia.readString("Beams:readLHEFheaders=on");
|
---|
80 | pythia.readString("Merging:includeWeightInXsection=off");
|
---|
81 |
|
---|
82 | pythia.readString("hadronlevel:all=off");
|
---|
83 | pythia.readString("partonlevel:all=off");
|
---|
84 | pythia.readString("SpaceShower:QEDshowerByL=off");
|
---|
85 | pythia.readString("SpaceShower:QEDshowerByQ=off");
|
---|
86 | pythia.readString("ProcessLevel:resonanceDecays=off");
|
---|
87 | pythia.readString("BeamRemnants:primordialKT=off");
|
---|
88 | pythia.readString("TimeShower:QEDshowerByQ=off");
|
---|
89 | pythia.readString("TimeShower:QEDshowerByL=off");
|
---|
90 | pythia.readString("partonlevel:mpi=off");
|
---|
91 | pythia.readString("PartonLevel:FSRinResonances=off");
|
---|
92 | pythia.readString("PartonLevel:Remnants=off");
|
---|
93 | pythia.readString("Check:event=off");
|
---|
94 |
|
---|
95 | pythia.settings.mode("Beams:frameType",4);
|
---|
96 | std::stringstream headerSS;
|
---|
97 | generate_header_SS(headerSS, Pythia8BeamA,Pythia8BeamB,PythiaBeamEnergyA,PythiaBeamEnergyB);
|
---|
98 | EvtSS.str(headerSS.str());
|
---|
99 | pythia.init(&EvtSS, &headerSS);
|
---|
100 | initialization_done = true;
|
---|
101 | }
|
---|
102 |
|
---|
103 | std::string EvtStr(Pythia8EvtRecord);
|
---|
104 | EvtStr = EvtStr.substr(0,EvtStr.find("</event>")+8);
|
---|
105 | // Restart the buffer, clearing EOF state
|
---|
106 | EvtSS.clear();
|
---|
107 | // Set the stringstream buffer to contain the event only
|
---|
108 | EvtSS.str(EvtStr);
|
---|
109 |
|
---|
110 | // std::cout<<"---> Event transmitted to Pythiaa8 <---\n"<<EvtSS.str()<<std::endl;
|
---|
111 |
|
---|
112 | // Compute the merging weight. All other shower processsing has been disabled in the initialisation above.
|
---|
113 | pythia.next();
|
---|
114 | // pythia.event.list();
|
---|
115 | // This is the CKKW Sudakov merging weight from the trial shower.
|
---|
116 | std::cout<<pythia.info.mergingWeight()<<std::endl;
|
---|
117 | // exit(0);
|
---|
118 |
|
---|
119 | OutputBiasWeight = pythia.info.mergingWeight();
|
---|
120 | }
|
---|
121 | }
|
---|