@@ -63,6 +63,9 @@ class Pythia8Hadronizer : public BaseHadronizer, public Py8InterfaceBase {
63
63
64
64
bool generatePartonsAndHadronize () override ;
65
65
bool hadronize ();
66
+
67
+ virtual bool residualDecay ();
68
+
66
69
void finalizeEvent () override ;
67
70
68
71
void statistics () override ;
@@ -308,6 +311,12 @@ bool Pythia8Hadronizer::initializeForInternalPartons()
308
311
fMasterGen ->particleData .listAll ();
309
312
}
310
313
314
+ // init decayer
315
+ fDecayer ->readString (" ProcessLevel:all = off" ); // trick
316
+ fDecayer ->readString (" Standalone:allowResDec=on" );
317
+ // pythia->readString("ProcessLevel::resonanceDecays=on");
318
+ fDecayer ->init ();
319
+
311
320
return true ;
312
321
}
313
322
@@ -376,6 +385,12 @@ bool Pythia8Hadronizer::initializeForExternalPartons()
376
385
fMasterGen ->particleData .listAll ();
377
386
}
378
387
388
+ // init decayer
389
+ fDecayer ->readString (" ProcessLevel:all = off" ); // trick
390
+ fDecayer ->readString (" Standalone:allowResDec=on" );
391
+ // pythia->readString("ProcessLevel::resonanceDecays=on");
392
+ fDecayer ->init ();
393
+
379
394
return true ;
380
395
}
381
396
@@ -444,6 +459,82 @@ bool Pythia8Hadronizer::hadronize()
444
459
}
445
460
446
461
462
+ bool Pythia8Hadronizer::residualDecay ()
463
+ {
464
+
465
+ Event* pythiaEvent = &(fMasterGen ->event );
466
+
467
+ int NPartsBeforeDecays = pythiaEvent->size ();
468
+ int NPartsAfterDecays = event ().get ()->particles_size ();
469
+ int NewBarcode = NPartsAfterDecays;
470
+
471
+ for ( int ipart=NPartsAfterDecays; ipart>NPartsBeforeDecays; ipart-- )
472
+ {
473
+
474
+ HepMC::GenParticle* part = event ().get ()->barcode_to_particle ( ipart );
475
+
476
+ if ( part->status () == 1 )
477
+ {
478
+ fDecayer ->event .reset ();
479
+ Particle py8part ( part->pdg_id (), 93 , 0 , 0 , 0 , 0 , 0 , 0 ,
480
+ part->momentum ().x (),
481
+ part->momentum ().y (),
482
+ part->momentum ().z (),
483
+ part->momentum ().t (),
484
+ part->generated_mass () );
485
+ HepMC::GenVertex* ProdVtx = part->production_vertex ();
486
+ py8part.vProd ( ProdVtx->position ().x (), ProdVtx->position ().y (),
487
+ ProdVtx->position ().z (), ProdVtx->position ().t () );
488
+ py8part.tau ( (fDecayer ->particleData ).tau0 ( part->pdg_id () ) );
489
+ fDecayer ->event .append ( py8part );
490
+ int nentries = fDecayer ->event .size ();
491
+ if ( !fDecayer ->event [nentries-1 ].mayDecay () ) continue ;
492
+ fDecayer ->next ();
493
+ int nentries1 = fDecayer ->event .size ();
494
+ // fDecayer->event.list(std::cout);
495
+ if ( nentries1 <= nentries ) continue ; // same number of particles, no decays...
496
+
497
+ part->set_status (2 );
498
+
499
+ Particle& py8daughter = fDecayer ->event [nentries]; // the 1st daughter
500
+ HepMC::GenVertex* DecVtx = new HepMC::GenVertex ( HepMC::FourVector (py8daughter.xProd (),
501
+ py8daughter.yProd (),
502
+ py8daughter.zProd (),
503
+ py8daughter.tProd ()) );
504
+
505
+ DecVtx->add_particle_in ( part ); // this will cleanup end_vertex if exists, replace with the new one
506
+ // I presume (vtx) barcode will be given automatically
507
+
508
+ HepMC::FourVector pmom ( py8daughter.px (), py8daughter.py (), py8daughter.pz (), py8daughter.e () );
509
+
510
+ HepMC::GenParticle* daughter =
511
+ new HepMC::GenParticle ( pmom, py8daughter.id (), 1 );
512
+
513
+ NewBarcode++;
514
+ daughter->suggest_barcode ( NewBarcode );
515
+ DecVtx->add_particle_out ( daughter );
516
+
517
+ for ( int ipart1=nentries+1 ; ipart1<nentries1; ipart1++ )
518
+ {
519
+ py8daughter = fDecayer ->event [ipart1];
520
+ HepMC::FourVector pmomN ( py8daughter.px (), py8daughter.py (), py8daughter.pz (), py8daughter.e () );
521
+ HepMC::GenParticle* daughterN =
522
+ new HepMC::GenParticle ( pmomN, py8daughter.id (), 1 );
523
+ NewBarcode++;
524
+ daughterN->suggest_barcode ( NewBarcode );
525
+ DecVtx->add_particle_out ( daughterN );
526
+ }
527
+
528
+ event ().get ()->add_vertex ( DecVtx );
529
+ // fCurrentEventState->add_vertex( DecVtx );
530
+
531
+ }
532
+ }
533
+ return true ;
534
+
535
+ }
536
+
537
+
447
538
void Pythia8Hadronizer::finalizeEvent ()
448
539
{
449
540
bool lhe = lheEvent () != 0 ;
0 commit comments