7 #include "Tauola/Tauola.h"
8 #include "Tauola/TauolaHepMCEvent.h"
9 #include "Tauola/Log.h"
15 #include "CLHEP/Random/RandomEngine.h"
17 #include "HepMC/GenEvent.h"
18 #include "HepMC/IO_HEPEVT.h"
19 #include "HepMC/HEPEVT_Wrapper.h"
28 for(
int i = 0;
i < *lenv;
i++)
29 *rvec++ = instance->
flat();
60 fIsInitialized=
false; fMDTAU=-1;
61 fSelectDecayByEvent=
false;
66 <<
"The RandomNumberProducer module requires the RandomNumberGeneratorService\n"
67 "which appears to be absent. Please add that service to your configuration\n"
68 "or remove the modules that require it." << std::endl;
118 if ( fPSet != 0 )
delete fPSet;
119 if ( fInstance ==
this ) fInstance = 0;
129 <<
"Attempt to override Tauola an existing ParameterSet\n"
142 if ( fIsInitialized )
return;
148 <<
"Attempt to initialize Tauola with an empty ParameterSet\n"
152 fIsInitialized =
true;
156 Tauolapp::Tauola::setDecayingParticle(15);
162 fPolarization = fPSet->getParameter<
bool>(
"UseTauolaPolarization");
170 if ( fMDTAU == 0 || fMDTAU == 1 )
172 Tauolapp::Tauola::setSameParticleDecayMode( cards.getParameter<
int >(
"pjak1" ) ) ;
173 Tauolapp::Tauola::setOppositeParticleDecayMode( cards.getParameter<
int >(
"pjak2" ) ) ;
176 Tauolapp::Tauola::setTauLifetime(0.0);
177 Tauolapp::Tauola::spin_correlation.setAll(fPolarization);
191 fPDGs.push_back( Tauolapp::Tauola::getDecayingParticle() );
194 Tauolapp::Tauola::initialize();
196 Tauolapp::Tauola::spin_correlation.setAll(fPolarization);
202 if ( fMDTAU != 0 && fMDTAU != 1 )
204 decodeMDTAU( fMDTAU );
207 Tauolapp::Log::LogWarning(
false);
219 <<
"Attempt to run random number generator of un-initialized Tauola\n"
223 if ( !fIsInitialized )
227 <<
"Attempt to run random number generator of un-initialized Tauola\n"
231 return fRandomEngine->flat();
238 if ( !fIsInitialized )
return evt;
240 int NPartBefore = evt->particles_size();
241 int NVtxBefore = evt->vertices_size();
251 if ( fSelectDecayByEvent )
253 selectDecayByMDTAU();
258 auto * t_event =
new Tauolapp::TauolaHepMCEvent(evt);
266 t_event->decayTaus();
278 for (
int iv=NVtxBefore+1; iv<=evt->vertices_size(); iv++ )
280 HepMC::GenVertex* GenVtx = evt->barcode_to_vertex(-iv);
282 HepMC::GenVertex* ProdVtx = GenPart->production_vertex();
283 HepMC::FourVector PMom = GenPart->momentum();
284 double mass = GenPart->generated_mass();
287 double lifetime = PData->lifetime().value();
291 double ct = -lifetime *
std::log(prob);
292 double VxDec = GenVtx->position().x();
293 VxDec += ct * (PMom.px()/
mass);
294 VxDec += ProdVtx->position().x();
295 double VyDec = GenVtx->position().y();
296 VyDec += ct * (PMom.py()/
mass);
297 VyDec += ProdVtx->position().y();
298 double VzDec = GenVtx->position().z();
299 VzDec += ct * (PMom.pz()/
mass);
300 VzDec += ProdVtx->position().z();
301 double VtDec = GenVtx->position().t();
302 VtDec += ct * (PMom.e()/
mass);
303 VtDec += ProdVtx->position().t();
304 GenVtx->set_position( HepMC::FourVector(VxDec,VyDec,VzDec,VtDec) );
310 std::vector<int> BCodes;
312 for (HepMC::GenVertex::particle_iterator pitr= GenVtx->particles_begin(HepMC::children);
313 pitr != GenVtx->particles_end(HepMC::children); ++pitr)
315 if ( (*pitr)->barcode() > 10000 )
317 BCodes.push_back( (*pitr)->barcode() );
320 if ( BCodes.size() > 0 )
322 for (
size_t ibc=0; ibc<BCodes.size(); ibc++ )
325 int nbc = p1->barcode() - 10000 + NPartBefore;
326 p1->suggest_barcode( nbc );
361 if ( mdtau == 101 || mdtau == 201 )
365 Tauolapp::jaki_.jak1 = 1;
366 Tauolapp::jaki_.jak2 = 1;
367 Tauolapp::Tauola::setSameParticleDecayMode( 1 ) ;
368 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 ) ;
372 if ( mdtau == 102 || mdtau == 202 )
376 Tauolapp::jaki_.jak1 = 2;
377 Tauolapp::jaki_.jak2 = 2;
378 Tauolapp::Tauola::setSameParticleDecayMode( 2 ) ;
379 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 ) ;
383 if ( mdtau == 111 || mdtau == 211 )
388 Tauolapp::jaki_.jak1 = 1;
389 Tauolapp::jaki_.jak2 = 0;
390 Tauolapp::Tauola::setSameParticleDecayMode( 1 ) ;
391 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
395 if ( mdtau == 112 || mdtau == 212 )
400 Tauolapp::jaki_.jak1 = 2;
401 Tauolapp::jaki_.jak2 = 0;
402 Tauolapp::Tauola::setSameParticleDecayMode( 2 ) ;
403 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
407 if ( mdtau == 121 || mdtau == 221 )
412 Tauolapp::jaki_.jak1 = 0;
413 Tauolapp::jaki_.jak2 = 1;
414 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
415 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 ) ;
419 if ( mdtau == 122 || mdtau == 222 )
424 Tauolapp::jaki_.jak1 = 0;
425 Tauolapp::jaki_.jak2 = 2;
426 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
427 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 ) ;
431 if ( mdtau == 140 || mdtau == 240 )
435 Tauolapp::jaki_.jak1 = 3;
436 Tauolapp::jaki_.jak2 = 3;
437 Tauolapp::Tauola::setSameParticleDecayMode( 3 ) ;
438 Tauolapp::Tauola::setOppositeParticleDecayMode( 3 ) ;
442 if ( mdtau == 141 || mdtau == 241 )
447 Tauolapp::jaki_.jak1 = 3;
448 Tauolapp::jaki_.jak2 = 0;
449 Tauolapp::Tauola::setSameParticleDecayMode( 3 ) ;
450 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
454 if ( mdtau == 142 || mdtau == 242 )
459 Tauolapp::jaki_.jak1 = 0;
460 Tauolapp::jaki_.jak2 = 3;
461 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
462 Tauolapp::Tauola::setOppositeParticleDecayMode( 3 ) ;
479 for (
int i=0;
i<22;
i++ )
483 if ( sumBra == 0. )
return ;
484 for (
int i=0;
i<22;
i++ )
487 Tauolapp::Tauola::setTauBr(
i+1, newBra );
492 double sumHadronBra = sumBra - sumLeptonBra;
494 for (
int i=0;
i<2;
i++ )
496 fLeptonModes.push_back(
i+1 );
499 for (
int i=2;
i<22;
i++ )
501 fHadronModes.push_back(
i+1 );
505 fSelectDecayByEvent =
true;
514 if ( fMDTAU == 100 || fMDTAU == 200 )
516 int mode = selectLeptonic();
517 Tauolapp::jaki_.jak1 =
mode;
518 Tauolapp::Tauola::setSameParticleDecayMode( mode );
519 mode = selectLeptonic();
520 Tauolapp::jaki_.jak2 =
mode;
521 Tauolapp::Tauola::setOppositeParticleDecayMode( mode );
525 int modeL = selectLeptonic();
526 int modeH = selectHadronic();
528 if ( fMDTAU == 110 || fMDTAU == 210 )
530 Tauolapp::jaki_.jak1 = modeL;
531 Tauolapp::jaki_.jak2 = 0;
532 Tauolapp::Tauola::setSameParticleDecayMode( modeL );
533 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
537 if ( fMDTAU == 120 || fMDTAU == 22 )
539 Tauolapp::jaki_.jak1 = 0;
540 Tauolapp::jaki_.jak2 = modeL;
541 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
542 Tauolapp::Tauola::setOppositeParticleDecayMode( modeL );
546 if ( fMDTAU == 114 || fMDTAU == 214 )
548 Tauolapp::jaki_.jak1 = modeL;
549 Tauolapp::jaki_.jak2 = modeH;
550 Tauolapp::Tauola::setSameParticleDecayMode( modeL );
551 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
555 if ( fMDTAU == 124 || fMDTAU == 224 )
557 Tauolapp::jaki_.jak1 = modeH;
558 Tauolapp::jaki_.jak2 = modeL;
559 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
560 Tauolapp::Tauola::setOppositeParticleDecayMode( modeL );
564 if ( fMDTAU == 115 || fMDTAU == 215 )
566 Tauolapp::jaki_.jak1 = 1;
567 Tauolapp::jaki_.jak2 = modeH;
568 Tauolapp::Tauola::setSameParticleDecayMode( 1 );
569 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
573 if ( fMDTAU == 125 || fMDTAU == 225 )
575 Tauolapp::jaki_.jak1 = modeH;
576 Tauolapp::jaki_.jak2 = 1;
577 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
578 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 );
582 if ( fMDTAU == 116 || fMDTAU == 216 )
584 Tauolapp::jaki_.jak1 = 2;
585 Tauolapp::jaki_.jak2 = modeH;
586 Tauolapp::Tauola::setSameParticleDecayMode( 2 );
587 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
591 if ( fMDTAU == 126 || fMDTAU == 226 )
593 Tauolapp::jaki_.jak1 = modeH;
594 Tauolapp::jaki_.jak2 = 2;
595 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
596 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 );
600 if ( fMDTAU == 130 || fMDTAU == 230 )
602 Tauolapp::jaki_.jak1 = modeH;
603 Tauolapp::jaki_.jak2 = selectHadronic();
604 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
605 Tauolapp::Tauola::setOppositeParticleDecayMode( Tauolapp::jaki_.
jak2 );
609 if ( fMDTAU == 131 || fMDTAU == 231 )
611 Tauolapp::jaki_.jak1 = modeH;
612 Tauolapp::jaki_.jak2 = 0;
613 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
614 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
618 if ( fMDTAU == 132 || fMDTAU == 232 )
620 Tauolapp::jaki_.jak1 = 0;
621 Tauolapp::jaki_.jak2 = modeH;
622 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
623 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
632 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
633 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
645 if ( prob > 0. && prob <= fScaledLeptonBrRatios[0] )
649 else if ( prob > fScaledLeptonBrRatios[1] && prob <=1. )
664 double sumBra = fScaledHadronBrRatios[0];
665 if ( prob > 0. && prob <= sumBra )
667 return fHadronModes[0];
671 int NN = fScaledHadronBrRatios.size();
672 for (
int i=1;
i<NN;
i++ )
674 if ( prob > sumBra && prob <= (sumBra+fScaledHadronBrRatios[
i]) )
676 return fHadronModes[
i];
678 sumBra += fScaledHadronBrRatios[
i];
688 return (
double)instance->
flat();
T getParameter(std::string const &) const
static PFTauRenderPlugin instance
void rmarin_(int *, int *, int *)
void getData(T &iHolder) const
static TauolappInterface * getInstance()
double TauolappInterface_RandGetter()
static TauolappInterface * fInstance
virtual CLHEP::HepRandomEngine & getEngine() const =0
Use this to get the random number engine, this is the only function most users should call...
void ranmar_(float *rvec, int *lenv)
HepPDT::ParticleData ParticleData
void init(const edm::EventSetup &)
HepMC::GenEvent * decay(HepMC::GenEvent *)
void selectDecayByMDTAU()
void setPSet(const edm::ParameterSet &)