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;
87 if ( fPSet != 0 )
delete fPSet;
88 if ( fInstance ==
this ) fInstance = 0;
98 <<
"Attempt to override Tauola an existing ParameterSet\n"
109 if ( fIsInitialized )
return;
110 if ( fPSet == 0 )
throw cms::Exception(
"TauolappInterfaceError") <<
"Attempt to initialize Tauola with an empty ParameterSet\n" << std::endl;
112 fIsInitialized =
true;
116 Tauolapp::Tauola::setDecayingParticle(15);
122 fPolarization = fPSet->getParameter<
bool>(
"UseTauolaPolarization");
130 if ( fMDTAU == 0 || fMDTAU == 1 )
132 Tauolapp::Tauola::setSameParticleDecayMode( cards.getParameter<
int >(
"pjak1" ) ) ;
133 Tauolapp::Tauola::setOppositeParticleDecayMode( cards.getParameter<
int >(
"pjak2" ) ) ;
136 Tauolapp::Tauola::spin_correlation.setAll(fPolarization);
145 double lifetime = PData->lifetime().value();
146 Tauolapp::Tauola::setTauLifetime( lifetime );
148 fPDGs.push_back( Tauolapp::Tauola::getDecayingParticle() );
151 Tauolapp::Tauola::initialize();
153 Tauolapp::Tauola::spin_correlation.setAll(fPolarization);
155 if (fPSet->exists(
"parameterSets")){
156 std::vector<std::string> par = fPSet->getParameter< std::vector<std::string> >(
"parameterSets");
157 for (
unsigned int ip=0; ip<par.size(); ++ip ){
158 std::string curSet = par[ip];
160 if(curSet==
"setNewCurrents") Tauolapp::Tauola::setNewCurrents(fPSet->getParameter<
int>(curSet));
161 if(curSet==
"spinCorrelationSetAll") Tauolapp::Tauola::spin_correlation.setAll(fPSet->getParameter<
bool>(curSet));
162 if(curSet==
"spinCorrelationGAMMA") Tauolapp::Tauola::spin_correlation.GAMMA=fPSet->getParameter<
bool>(curSet);
163 if(curSet==
"spinCorrelationZ0") Tauolapp::Tauola::spin_correlation.Z0=fPSet->getParameter<
bool>(curSet);
164 if(curSet==
"spinCorrelationHIGGS") Tauolapp::Tauola::spin_correlation.HIGGS=fPSet->getParameter<
bool>(curSet);
165 if(curSet==
"spinCorrelationHIGGSH") Tauolapp::Tauola::spin_correlation.HIGGS_H=fPSet->getParameter<
bool>(curSet);
166 if(curSet==
"spinCorrelationHIGGSA") Tauolapp::Tauola::spin_correlation.HIGGS_A=fPSet->getParameter<
bool>(curSet);
167 if(curSet==
"spinCorrelationHIGGSPLUS") Tauolapp::Tauola::spin_correlation.HIGGS_PLUS=fPSet->getParameter<
bool>(curSet);
168 if(curSet==
"spinCorrelationHIGGSMINUS") Tauolapp::Tauola::spin_correlation.HIGGS_MINUS=fPSet->getParameter<
bool>(curSet);
169 if(curSet==
"spinCorrelationWPLUS") Tauolapp::Tauola::spin_correlation.W_PLUS=fPSet->getParameter<
bool>(curSet);
170 if(curSet==
"spinCorrelationWMINUS") Tauolapp::Tauola::spin_correlation.W_MINUS=fPSet->getParameter<
bool>(curSet);
172 if(curSet==
"setHiggsScalarPseudoscalarPDG") Tauolapp::Tauola::setHiggsScalarPseudoscalarPDG(fPSet->getParameter<
int>(curSet));
173 if(curSet==
"setHiggsScalarPseudoscalarMixingAngle") Tauolapp::Tauola::setHiggsScalarPseudoscalarMixingAngle(fPSet->getParameter<
double>(curSet));
175 if(curSet==
"setRadiation") Tauolapp::Tauola::setRadiation(fPSet->getParameter<
bool>(curSet));
176 if(curSet==
"setRadiationCutOff") Tauolapp::Tauola::setRadiationCutOff(fPSet->getParameter<
double>(curSet));
178 if(curSet==
"setEtaK0sPi"){
179 std::vector<int> vpar = fPSet->getParameter<std::vector<int> >(curSet);
180 if(vpar.size()==3) Tauolapp::Tauola::setEtaK0sPi(vpar[0],vpar[1],vpar[2]);
181 else {
std::cout <<
"WARNING invalid size for setEtaK0sPi: " << vpar.size() <<
" Require 3 elements " << std::endl;}
184 if(curSet==
"setTaukle"){
185 std::vector<double> vpar = fPSet->getParameter<std::vector<double> >(curSet);
186 if(vpar.size()==4) Tauolapp::Tauola::setTaukle(vpar[0], vpar[1], vpar[2], vpar[3]);
187 else {
std::cout <<
"WARNING invalid size for setTaukle: " << vpar.size() <<
" Require 4 elements " << std::endl;}
190 if(curSet==
"setTauBr"){
192 std::vector<int> vJAK = cfg.
getParameter<std::vector<int> >(
"JAK");
193 std::vector<double> vBR = cfg.
getParameter<std::vector<double> >(
"BR");
194 if(vJAK.size() == vBR.size()){
195 for(
unsigned int i=0;
i<vJAK.size();
i++) Tauolapp::Tauola::setTauBr(vJAK[
i],vBR[i]);
197 else {
std::cout <<
"WARNING invalid size for setTauBr - JAK: " << vJAK.size() <<
" BR: " << vBR.size() << std::endl;}
206 if ( fMDTAU != 0 && fMDTAU != 1 )
208 decodeMDTAU( fMDTAU );
211 Tauolapp::Log::LogWarning(
false);
217 if ( !fIsInitialized ){
220 <<
"Attempt to run random number generator of un-initialized Tauola\n"
223 return fRandomEngine->flat();
228 if ( !fIsInitialized )
return evt;
230 int NPartBefore = evt->particles_size();
231 int NVtxBefore = evt->vertices_size();
241 if ( fSelectDecayByEvent )
243 selectDecayByMDTAU();
248 auto * t_event =
new Tauolapp::TauolaHepMCEvent(evt);
256 t_event->decayTaus();
268 for (
int iv=NVtxBefore+1; iv<=evt->vertices_size(); iv++ )
270 HepMC::GenVertex* GenVtx = evt->barcode_to_vertex(-iv);
271 std::vector<int> BCodes;
273 for (HepMC::GenVertex::particle_iterator pitr= GenVtx->particles_begin(HepMC::children);
274 pitr != GenVtx->particles_end(HepMC::children); ++pitr)
276 if ( (*pitr)->barcode() > 10000 )
278 BCodes.push_back( (*pitr)->barcode() );
281 if ( BCodes.size() > 0 )
283 for (
size_t ibc=0; ibc<BCodes.size(); ibc++ )
286 int nbc = p1->barcode() - 10000 + NPartBefore;
287 p1->suggest_barcode( nbc );
322 if ( mdtau == 101 || mdtau == 201 )
326 Tauolapp::jaki_.jak1 = 1;
327 Tauolapp::jaki_.jak2 = 1;
328 Tauolapp::Tauola::setSameParticleDecayMode( 1 ) ;
329 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 ) ;
333 if ( mdtau == 102 || mdtau == 202 )
337 Tauolapp::jaki_.jak1 = 2;
338 Tauolapp::jaki_.jak2 = 2;
339 Tauolapp::Tauola::setSameParticleDecayMode( 2 ) ;
340 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 ) ;
344 if ( mdtau == 111 || mdtau == 211 )
349 Tauolapp::jaki_.jak1 = 1;
350 Tauolapp::jaki_.jak2 = 0;
351 Tauolapp::Tauola::setSameParticleDecayMode( 1 ) ;
352 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
356 if ( mdtau == 112 || mdtau == 212 )
361 Tauolapp::jaki_.jak1 = 2;
362 Tauolapp::jaki_.jak2 = 0;
363 Tauolapp::Tauola::setSameParticleDecayMode( 2 ) ;
364 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
368 if ( mdtau == 121 || mdtau == 221 )
373 Tauolapp::jaki_.jak1 = 0;
374 Tauolapp::jaki_.jak2 = 1;
375 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
376 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 ) ;
380 if ( mdtau == 122 || mdtau == 222 )
385 Tauolapp::jaki_.jak1 = 0;
386 Tauolapp::jaki_.jak2 = 2;
387 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
388 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 ) ;
392 if ( mdtau == 140 || mdtau == 240 )
396 Tauolapp::jaki_.jak1 = 3;
397 Tauolapp::jaki_.jak2 = 3;
398 Tauolapp::Tauola::setSameParticleDecayMode( 3 ) ;
399 Tauolapp::Tauola::setOppositeParticleDecayMode( 3 ) ;
403 if ( mdtau == 141 || mdtau == 241 )
408 Tauolapp::jaki_.jak1 = 3;
409 Tauolapp::jaki_.jak2 = 0;
410 Tauolapp::Tauola::setSameParticleDecayMode( 3 ) ;
411 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
415 if ( mdtau == 142 || mdtau == 242 )
420 Tauolapp::jaki_.jak1 = 0;
421 Tauolapp::jaki_.jak2 = 3;
422 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
423 Tauolapp::Tauola::setOppositeParticleDecayMode( 3 ) ;
440 for (
int i=0;
i<22;
i++ )
444 if ( sumBra == 0. )
return ;
445 for (
int i=0;
i<22;
i++ )
448 Tauolapp::Tauola::setTauBr(
i+1, newBra );
453 double sumHadronBra = sumBra - sumLeptonBra;
455 for (
int i=0;
i<2;
i++ )
457 fLeptonModes.push_back(
i+1 );
460 for (
int i=2;
i<22;
i++ )
462 fHadronModes.push_back(
i+1 );
466 fSelectDecayByEvent =
true;
475 if ( fMDTAU == 100 || fMDTAU == 200 )
477 int mode = selectLeptonic();
478 Tauolapp::jaki_.jak1 =
mode;
479 Tauolapp::Tauola::setSameParticleDecayMode( mode );
480 mode = selectLeptonic();
481 Tauolapp::jaki_.jak2 =
mode;
482 Tauolapp::Tauola::setOppositeParticleDecayMode( mode );
486 int modeL = selectLeptonic();
487 int modeH = selectHadronic();
489 if ( fMDTAU == 110 || fMDTAU == 210 )
491 Tauolapp::jaki_.jak1 = modeL;
492 Tauolapp::jaki_.jak2 = 0;
493 Tauolapp::Tauola::setSameParticleDecayMode( modeL );
494 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
498 if ( fMDTAU == 120 || fMDTAU == 22 )
500 Tauolapp::jaki_.jak1 = 0;
501 Tauolapp::jaki_.jak2 = modeL;
502 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
503 Tauolapp::Tauola::setOppositeParticleDecayMode( modeL );
507 if ( fMDTAU == 114 || fMDTAU == 214 )
509 Tauolapp::jaki_.jak1 = modeL;
510 Tauolapp::jaki_.jak2 = modeH;
511 Tauolapp::Tauola::setSameParticleDecayMode( modeL );
512 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
516 if ( fMDTAU == 124 || fMDTAU == 224 )
518 Tauolapp::jaki_.jak1 = modeH;
519 Tauolapp::jaki_.jak2 = modeL;
520 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
521 Tauolapp::Tauola::setOppositeParticleDecayMode( modeL );
525 if ( fMDTAU == 115 || fMDTAU == 215 )
527 Tauolapp::jaki_.jak1 = 1;
528 Tauolapp::jaki_.jak2 = modeH;
529 Tauolapp::Tauola::setSameParticleDecayMode( 1 );
530 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
534 if ( fMDTAU == 125 || fMDTAU == 225 )
536 Tauolapp::jaki_.jak1 = modeH;
537 Tauolapp::jaki_.jak2 = 1;
538 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
539 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 );
543 if ( fMDTAU == 116 || fMDTAU == 216 )
545 Tauolapp::jaki_.jak1 = 2;
546 Tauolapp::jaki_.jak2 = modeH;
547 Tauolapp::Tauola::setSameParticleDecayMode( 2 );
548 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
552 if ( fMDTAU == 126 || fMDTAU == 226 )
554 Tauolapp::jaki_.jak1 = modeH;
555 Tauolapp::jaki_.jak2 = 2;
556 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
557 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 );
561 if ( fMDTAU == 130 || fMDTAU == 230 )
563 Tauolapp::jaki_.jak1 = modeH;
564 Tauolapp::jaki_.jak2 = selectHadronic();
565 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
566 Tauolapp::Tauola::setOppositeParticleDecayMode( Tauolapp::jaki_.
jak2 );
570 if ( fMDTAU == 131 || fMDTAU == 231 )
572 Tauolapp::jaki_.jak1 = modeH;
573 Tauolapp::jaki_.jak2 = 0;
574 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
575 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
579 if ( fMDTAU == 132 || fMDTAU == 232 )
581 Tauolapp::jaki_.jak1 = 0;
582 Tauolapp::jaki_.jak2 = modeH;
583 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
584 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
593 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
594 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
606 if ( prob > 0. && prob <= fScaledLeptonBrRatios[0] )
610 else if ( prob > fScaledLeptonBrRatios[1] && prob <=1. )
625 double sumBra = fScaledHadronBrRatios[0];
626 if ( prob > 0. && prob <= sumBra )
628 return fHadronModes[0];
632 int NN = fScaledHadronBrRatios.size();
633 for (
int i=1;
i<NN;
i++ )
635 if ( prob > sumBra && prob <= (sumBra+fScaledHadronBrRatios[
i]) )
637 return fHadronModes[
i];
639 sumBra += fScaledHadronBrRatios[
i];
649 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 &)