1 // definition of c++ Class THerwig6 to be used in ROOT
2 // this is a c++ interface to the F77 Herwig6 program
3 // author: j. g. contreras jgcn@moni.mda.cinvestav.mx
4 // date: december 22, 2000
5 // Class THerwig6 is an interface to the Herwig program
7 // C-----------------------------------------------------------------------
10 // C a Monte Carlo event generator for simulating
11 // C +---------------------------------------------------+
12 // C | Hadron Emission Reactions With Interfering Gluons |
13 // C +---------------------------------------------------+
14 // C I.G. Knowles(*), G. Marchesini(+), M.H. Seymour($) and B.R. Webber(#)
15 // C-----------------------------------------------------------------------
16 // C with Minimal Supersymmetric Standard Model Matrix Elements by
17 // C S. Moretti($) and K. Odagiri($)
18 // C-----------------------------------------------------------------------
19 // C R parity violating Supersymmetric Decays and Matrix Elements by
21 // C-----------------------------------------------------------------------
22 // C matrix element corrections to top decay and Drell-Yan type processes
23 // C by G. Corcella(+)
24 // C-----------------------------------------------------------------------
25 // C Deep Inelastic Scattering and Heavy Flavour Electroproduction by
26 // C G. Abbiendi(@) and L. Stanco(%)
27 // C-----------------------------------------------------------------------
28 // C and Jet Photoproduction in Lepton-Hadron Collisions by J. Chyla(~)
29 // C-----------------------------------------------------------------------
30 // C(*) Department of Physics & Astronomy, University of Edinburgh
31 // C(+) Dipartimento di Fisica, Universita di Milano
32 // C($) Rutherford Appleton Laboratory
33 // C(#) Cavendish Laboratory, Cambridge
34 // C(&) Department of Physics, University of Oxford
35 // C(@) Dipartimento di Fisica, Universita di Bologna
36 // C(%) Dipartimento di Fisica, Universita di Padova
37 // C(~) Institute of Physics, Prague
38 // C-----------------------------------------------------------------------
39 // C Version 6.100 - 16th December 1999
40 // C-----------------------------------------------------------------------
42 // C G.Marchesini, B.R.Webber, G.Abbiendi, I.G.Knowles, M.H.Seymour,
43 // C and L.Stanco, Computer Physics Communications 67 (1992) 465.
44 // C-----------------------------------------------------------------------
45 // C Please send e-mail about this program to one of the authors at the
46 // C following Internet addresses:
47 // C I.Knowles@ed.ac.uk Giuseppe.Marchesini@mi.infn.it
48 // C M.Seymour@rl.ac.uk webber@hep.phy.cam.ac.uk
49 // C-----------------------------------------------------------------------
53 #include "TClonesArray.h"
54 #include "TParticle.h"
55 #include "TObjArray.h"
61 void* herwig6_common_block_address_(char*, int len);
62 void herwig6_open_fortran_file_ (int* lun, char* name, int);
63 void herwig6_close_fortran_file_(int* lun);
67 THerwig6::THerwig6() : TGenerator("Herwig6","Herwig6"),
68 fHepevt((Hepevt_t*) herwig6_common_block_address_((char*)"HEPEVT",6)),
69 fHwbeam((Hwbeam_t*) herwig6_common_block_address_((char*)"HWBEAM",6)),
70 fHwbmch((Hwbmch_t*) herwig6_common_block_address_((char*)"HWBMCH",6)),
71 fHwproc((Hwproc_t*) herwig6_common_block_address_((char*)"HWPROC",6)),
72 fHwpram((Hwpram_t*) herwig6_common_block_address_((char*)"HWPRAM",6)),
73 fHwprch((Hwprch_t*) herwig6_common_block_address_((char*)"HWPRCH",6)),
74 fHwpart((Hwpart_t*) herwig6_common_block_address_((char*)"HWPART",6)),
75 fHwparp((Hwparp_t*) herwig6_common_block_address_((char*)"HWPARP",6)),
76 fHwbosc((Hwbosc_t*) herwig6_common_block_address_((char*)"HWBOSC",6)),
77 fHwparc((Hwparc_t*) herwig6_common_block_address_((char*)"HWPARC",6)),
78 fHwbrch((Hwbrch_t*) herwig6_common_block_address_((char*)"HWBRCH",6)),
79 fHwevnt((Hwevnt_t*) herwig6_common_block_address_((char*)"HWEVNT",6)),
80 fHwhard((Hwhard_t*) herwig6_common_block_address_((char*)"HWHARD",6)),
81 fHwprop((Hwprop_t*) herwig6_common_block_address_((char*)"HWPROP",6)),
82 fHwunam((Hwunam_t*) herwig6_common_block_address_((char*)"HWUNAM",6)),
83 fHwupdt((Hwupdt_t*) herwig6_common_block_address_((char*)"HWUPDT",6)),
84 fHwuwts((Hwuwts_t*) herwig6_common_block_address_((char*)"HWUWTS",6)),
85 fHwuclu((Hwuclu_t*) herwig6_common_block_address_((char*)"HWUCLU",6)),
86 fHwdist((Hwdist_t*) herwig6_common_block_address_((char*)"HWDIST",6)),
87 fHwqdks((Hwqdks_t*) herwig6_common_block_address_((char*)"HWQDKS",6)),
88 fHwusud((Hwusud_t*) herwig6_common_block_address_((char*)"HWUSUD",6)),
89 fHwsusy((Hwsusy_t*) herwig6_common_block_address_((char*)"HWSUSY",6)),
90 fHwrpar((Hwrpar_t*) herwig6_common_block_address_((char*)"HWRPAR",6)),
91 fHwminb((Hwminb_t*) herwig6_common_block_address_((char*)"HWMINB",6)),
92 fHwclus((Hwclus_t*) herwig6_common_block_address_((char*)"HWCLUS",6)),
93 fHwgrav((Hwgrav_t*) herwig6_common_block_address_((char*)"HWGRAV",6)),
94 fHw6202((Hw6202_t*) herwig6_common_block_address_((char*)"HW6202",6)),
95 fHw6203((Hw6203_t*) herwig6_common_block_address_((char*)"HW6203",6)),
96 fHw6300((Hw6300_t*) herwig6_common_block_address_((char*)"HW6300",6)),
97 fHwpmrs((Hwpmrs_t*) herwig6_common_block_address_((char*)"HWPMRS",6)),
98 fHwcirc((Hwcirc_t*) herwig6_common_block_address_((char*)"HWCIRC",6)),
99 fHwdspb((Hwdspb_t*) herwig6_common_block_address_((char*)"HWDSPB",6)),
100 fHwdsp2((Hwdsp2_t*) herwig6_common_block_address_((char*)"HWDSP2",6)),
101 fHwdsp3((Hwdsp3_t*) herwig6_common_block_address_((char*)"HWDSP3",6)),
102 fHwdsp4((Hwdsp4_t*) herwig6_common_block_address_((char*)"HWDSP4",6)),
103 fHwdspn((Hwdspn_t*) herwig6_common_block_address_((char*)"HWDSPN",6)),
104 fHwspin((Hwspin_t*) herwig6_common_block_address_((char*)"HWSPIN",6)),
105 fHwstau((Hwstau_t*) herwig6_common_block_address_((char*)"HWSTAU",6)),
106 fHwgupr((Hwgupr_t*) herwig6_common_block_address_((char*)"HWGUPR",6)),
107 fHw6500((Hw6500_t*) herwig6_common_block_address_((char*)"HW6500",6)),
108 fHw6504((Hw6504_t*) herwig6_common_block_address_((char*)"HW6504",6)),
109 fHw6506((Hw6506_t*) herwig6_common_block_address_((char*)"HW6506",6))
112 // THerwig6 constructor: creates a TClonesArray in which it will store all
113 // particles. Note that there may be only one functional THerwig6 object
114 // at a time, so it's not use to create more than one instance of it.
116 delete fParticles; // was allocated as TObjArray in TGenerator
117 fParticles = new TClonesArray("TParticle",50);
119 // initialize common-blocks
122 THerwig6::THerwig6(const THerwig6 & source): TGenerator(source),
123 fHepevt((Hepevt_t*) herwig6_common_block_address_((char*)"HEPEVT",6)),
124 fHwbeam((Hwbeam_t*) herwig6_common_block_address_((char*)"HWBEAM",6)),
125 fHwbmch((Hwbmch_t*) herwig6_common_block_address_((char*)"HWBMCH",6)),
126 fHwproc((Hwproc_t*) herwig6_common_block_address_((char*)"HWPROC",6)),
127 fHwpram((Hwpram_t*) herwig6_common_block_address_((char*)"HWPRAM",6)),
128 fHwprch((Hwprch_t*) herwig6_common_block_address_((char*)"HWPRCH",6)),
129 fHwpart((Hwpart_t*) herwig6_common_block_address_((char*)"HWPART",6)),
130 fHwparp((Hwparp_t*) herwig6_common_block_address_((char*)"HWPARP",6)),
131 fHwbosc((Hwbosc_t*) herwig6_common_block_address_((char*)"HWBOSC",6)),
132 fHwparc((Hwparc_t*) herwig6_common_block_address_((char*)"HWPARC",6)),
133 fHwbrch((Hwbrch_t*) herwig6_common_block_address_((char*)"HWBRCH",6)),
134 fHwevnt((Hwevnt_t*) herwig6_common_block_address_((char*)"HWEVNT",6)),
135 fHwhard((Hwhard_t*) herwig6_common_block_address_((char*)"HWHARD",6)),
136 fHwprop((Hwprop_t*) herwig6_common_block_address_((char*)"HWPROP",6)),
137 fHwunam((Hwunam_t*) herwig6_common_block_address_((char*)"HWUNAM",6)),
138 fHwupdt((Hwupdt_t*) herwig6_common_block_address_((char*)"HWUPDT",6)),
139 fHwuwts((Hwuwts_t*) herwig6_common_block_address_((char*)"HWUWTS",6)),
140 fHwuclu((Hwuclu_t*) herwig6_common_block_address_((char*)"HWUCLU",6)),
141 fHwdist((Hwdist_t*) herwig6_common_block_address_((char*)"HWDIST",6)),
142 fHwqdks((Hwqdks_t*) herwig6_common_block_address_((char*)"HWQDKS",6)),
143 fHwusud((Hwusud_t*) herwig6_common_block_address_((char*)"HWUSUD",6)),
144 fHwsusy((Hwsusy_t*) herwig6_common_block_address_((char*)"HWSUSY",6)),
145 fHwrpar((Hwrpar_t*) herwig6_common_block_address_((char*)"HWRPAR",6)),
146 fHwminb((Hwminb_t*) herwig6_common_block_address_((char*)"HWMINB",6)),
147 fHwclus((Hwclus_t*) herwig6_common_block_address_((char*)"HWCLUS",6)),
148 fHwgrav((Hwgrav_t*) herwig6_common_block_address_((char*)"HWGRAV",6)),
149 fHw6202((Hw6202_t*) herwig6_common_block_address_((char*)"HW6202",6)),
150 fHw6203((Hw6203_t*) herwig6_common_block_address_((char*)"HW6203",6)),
151 fHw6300((Hw6300_t*) herwig6_common_block_address_((char*)"HW6300",6)),
152 fHwpmrs((Hwpmrs_t*) herwig6_common_block_address_((char*)"HWPMRS",6)),
153 fHwcirc((Hwcirc_t*) herwig6_common_block_address_((char*)"HWCIRC",6)),
154 fHwdspb((Hwdspb_t*) herwig6_common_block_address_((char*)"HWDSPB",6)),
155 fHwdsp2((Hwdsp2_t*) herwig6_common_block_address_((char*)"HWDSP2",6)),
156 fHwdsp3((Hwdsp3_t*) herwig6_common_block_address_((char*)"HWDSP3",6)),
157 fHwdsp4((Hwdsp4_t*) herwig6_common_block_address_((char*)"HWDSP4",6)),
158 fHwdspn((Hwdspn_t*) herwig6_common_block_address_((char*)"HWDSPN",6)),
159 fHwspin((Hwspin_t*) herwig6_common_block_address_((char*)"HWSPIN",6)),
160 fHwstau((Hwstau_t*) herwig6_common_block_address_((char*)"HWSTAU",6)),
161 fHwgupr((Hwgupr_t*) herwig6_common_block_address_((char*)"HWGUPR",6)),
162 fHw6500((Hw6500_t*) herwig6_common_block_address_((char*)"HW6500",6)),
163 fHw6504((Hw6504_t*) herwig6_common_block_address_((char*)"HW6504",6)),
164 fHw6506((Hw6506_t*) herwig6_common_block_address_((char*)"HW6506",6))
166 Fatal("THerwig6","Copy constructor not implemented yet");
168 //------------------------------------------------------------------------------
169 THerwig6::~THerwig6()
171 // Destructor. The data members of TGenerator are delete by itself
174 //______________________________________________________________________________
175 void THerwig6::GenerateEvent()
180 // generate hard subprocess
182 // generate parton cascades
184 // do heavy objects decay
186 // do cluster formation
190 // do unstable particle decays
192 // do heavy flavor hadrons decay
194 // add soft underlying event
200 //______________________________________________________________________________
201 void THerwig6::OpenFortranFile(int lun, char* name) {
202 herwig6_open_fortran_file_(&lun, name, strlen(name));
205 //______________________________________________________________________________
206 void THerwig6::CloseFortranFile(int lun) {
207 herwig6_close_fortran_file_(&lun);
210 void THerwig6::Initialize(const char *beam, const char *target, double pbeam1, double pbeam2, int iproc)
213 // perform the initialization for Herwig6
214 // sets correct title.
215 // after calling this method all parameters are set to their default
216 // values. If you want to modify any parameter you have to set the new
217 // value after calling Initialize and before PrepareRun.
220 strncpy(cbeam,beam,8);
222 strncpy(ctarget,target,8);
223 printf("\n Initializing Herwig !! \n");
224 if ( (!strncmp(beam, "E+" ,2)) &&
225 (!strncmp(beam, "E-" ,2)) &&
226 (!strncmp(beam, "MU+" ,3)) &&
227 (!strncmp(beam, "MU-" ,3)) &&
228 (!strncmp(beam, "NUE" ,3)) &&
229 (!strncmp(beam, "NUEB" ,4)) &&
230 (!strncmp(beam, "NUMU" ,4)) &&
231 (!strncmp(beam, "NMUB" ,4)) &&
232 (!strncmp(beam, "NTAU" ,4)) &&
233 (!strncmp(beam, "NTAB" ,4)) &&
234 (!strncmp(beam, "GAMA" ,4)) &&
235 (!strncmp(beam, "P ",8)) &&
236 (!strncmp(beam, "PBAR ",8)) &&
237 (!strncmp(beam, "N" ,1)) &&
238 (!strncmp(beam, "NBAR" ,4)) &&
239 (!strncmp(beam, "PI+" ,3)) &&
240 (!strncmp(beam, "PI-" ,3)) ) {
241 printf("WARNING! In THerwig6:Initialize():\n");
242 printf(" specified beam=%s is unrecognized .\n",beam);
243 printf(" resetting to \"P\" .");
247 if ( (!strncmp(target, "E+" ,2)) &&
248 (!strncmp(target, "E-" ,2)) &&
249 (!strncmp(target, "MU+" ,3)) &&
250 (!strncmp(target, "MU-" ,3)) &&
251 (!strncmp(target, "NUE" ,3)) &&
252 (!strncmp(target, "NUEB" ,4)) &&
253 (!strncmp(target, "NUMU" ,4)) &&
254 (!strncmp(target, "NMUB" ,4)) &&
255 (!strncmp(target, "NTAU" ,4)) &&
256 (!strncmp(target, "NTAB" ,4)) &&
257 (!strncmp(target, "GAMA" ,4)) &&
258 (!strncmp(target, "P ",8)) &&
259 (!strncmp(target, "PBAR ",8)) &&
260 (!strncmp(target, "N" ,1)) &&
261 (!strncmp(target, "NBAR" ,4)) &&
262 (!strncmp(target, "PI+" ,3)) &&
263 (!strncmp(target, "PI-" ,3)) ) {
264 printf("WARNING! In THerwig6:Initialize():\n");
265 printf(" specified target=%s is unrecognized .\n",target);
266 printf(" resetting to \"P\" .");
267 sprintf(ctarget,"P");
272 strncpy(fHwbmch->PART1,beam,8);
273 strncpy(fHwbmch->PART2,target,8);
275 fHwproc->PBEAM1=pbeam1;
276 fHwproc->PBEAM2=pbeam2;
277 // process to generate
278 fHwproc->IPROC=iproc;
279 // not used in the class definition
282 // reset all parameters
287 double win=pbeam1+pbeam2;
288 printf("\n %s - %s at %g GeV",beam,target,win);
289 sprintf(atitle,"%s-%s at %g GeV",cbeam,ctarget,win);
293 void THerwig6::PrepareRun()
295 // compute parameter dependent constants
297 // initialize elementary processes
301 //______________________________________________________________________________
302 TObjArray* THerwig6::ImportParticles(Option_t *option)
305 // Default primary creation method. It reads the /HEPEVT/ common block which
306 // has been filled by the GenerateEvent method. If the event generator does
307 // not use the HEPEVT common block, This routine has to be overloaded by
309 // The default action is to store only the stable particles (ISTHEP = 1)
310 // This can be demanded explicitly by setting the option = "Final"
311 // If the option = "All", all the particles are stored.
314 Int_t numpart = fHepevt->NHEP;
315 TClonesArray &a = *((TClonesArray*)fParticles);
316 if (!strcmp(option,"") || !strcmp(option,"Final")) {
317 for (Int_t i = 0; i<=numpart; i++) {
318 if (fHepevt->ISTHEP[i] == 1) {
320 // Use the common block values for the TParticle constructor
325 fHepevt->JMOHEP[i][0]-1,
326 fHepevt->JMOHEP[i][1]-1,
327 fHepevt->JDAHEP[i][0]-1,
328 fHepevt->JDAHEP[i][1]-1,
337 fHepevt->VHEP[i][3]);
341 else if (!strcmp(option,"All")) {
342 for (Int_t i = 0; i<=numpart; i++) {
346 fHepevt->JMOHEP[i][0]-1,
347 fHepevt->JMOHEP[i][1]-1,
348 fHepevt->JDAHEP[i][0]-1,
349 fHepevt->JDAHEP[i][1]-1,
358 fHepevt->VHEP[i][3]);
364 //______________________________________________________________________________
365 Int_t THerwig6::ImportParticles(TClonesArray *particles, Option_t *option)
368 // Default primary creation method. It reads the /HEPEVT/ common block which
369 // has been filled by the GenerateEvent method. If the event generator does
370 // not use the HEPEVT common block, This routine has to be overloaded by
372 // The function loops on the generated particles and store them in
373 // the TClonesArray pointed by the argument particles.
374 // The default action is to store only the stable particles (ISTHEP = 1)
375 // This can be demanded explicitly by setting the option = "Final"
376 // If the option = "All", all the particles are stored.
378 if (particles == 0) return 0;
379 TClonesArray &refParticles = *particles;
380 refParticles.Clear();
381 Int_t numpart = fHepevt->NHEP;
382 if (!strcmp(option,"") || !strcmp(option,"Final")) {
383 for (Int_t i = 0; i< numpart; i++) {
384 if (fHepevt->ISTHEP[i] == 1) {
386 // Use the common block values for the TParticle constructor
388 new(refParticles[i]) TParticle(
391 fHepevt->JMOHEP[i][0]-1,
392 fHepevt->JMOHEP[i][1]-1,
393 fHepevt->JDAHEP[i][0]-1,
394 fHepevt->JDAHEP[i][1]-1,
403 fHepevt->VHEP[i][3]);
407 else if (!strcmp(option,"All")) {
408 for (Int_t i = 0; i< numpart; i++) {
409 new(refParticles[i]) TParticle(
412 fHepevt->JMOHEP[i][0]-1,
413 fHepevt->JMOHEP[i][1]-1,
414 fHepevt->JDAHEP[i][0]-1,
415 fHepevt->JDAHEP[i][1]-1,
424 fHepevt->VHEP[i][3]);
430 void THerwig6::Hwigin()
435 void THerwig6::Hwuinc()
440 void THerwig6::Hwusta(char* name)
446 void THerwig6::Hweini()
452 void THerwig6::Hwuine()
458 void THerwig6::Hwepro()
464 void THerwig6::Hwbgen()
470 void THerwig6::Hwdhob()
476 void THerwig6::Hwcfor()
482 void THerwig6::Hwcdec()
488 void THerwig6::Hwdhad()
494 void THerwig6::Hwdhvy()
500 void THerwig6::Hwmevt()
506 void THerwig6::Hwufne()
512 void THerwig6::Hwefin()
518 void THerwig6::Hwiodk(int iopt)
524 void THerwig6::SetupTest()
526 // exampe of running herwig and generating one event
527 // after changing some options
528 Initialize("P","PBAR",900.,900.,1500);
529 // here you can set some parameters
530 SetPTMIN(15.); // Min pt in hadronic jet production
531 SetYJMIN(-4.); // Min jet rapidity
532 SetYJMAX(4.); // Max jet rapidity
533 // after you set your wished parameters
534 // herwig can do its work
537 for (int i=0;i<nEvToGenerate;i++)
540 // do your stuff. For ex:
541 int nOfPar=GetNumberOfParticles(); // from TGenerator
542 for (int j=0; j<nOfPar; j++)
544 TParticle* p=GetParticle(j);
545 // here you do whatever you want with the particle