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"
34 for(
int i = 0;
i < *lenv;
i++)
49 fIsInitialized(
false),
51 fSelectDecayByEvent(
false)
53 if (
fPSet != 0 )
throw cms::Exception(
"TauolappInterfaceError") <<
"Attempt to override Tauola an existing ParameterSet\n" << std::endl;
61 if (
fPSet == 0 )
throw cms::Exception(
"TauolappInterfaceError") <<
"Attempt to initialize Tauola with an empty ParameterSet\n" << std::endl;
67 Tauolapp::Tauola::setDecayingParticle(15);
79 fMDTAU = cards.getParameter<
int >(
"mdtau" );
81 if ( fMDTAU == 0 || fMDTAU == 1 )
83 Tauolapp::Tauola::setSameParticleDecayMode( cards.getParameter<
int >(
"pjak1" ) ) ;
84 Tauolapp::Tauola::setOppositeParticleDecayMode( cards.getParameter<
int >(
"pjak2" ) ) ;
94 double lifetime = PData->lifetime().value();
95 Tauolapp::Tauola::setTauLifetime( lifetime );
98 fPDGs.push_back( Tauolapp::Tauola::getDecayingParticle() );
106 std::vector<std::string> par =
fPSet->
getParameter< std::vector<std::string> >(
"parameterSets");
107 for (
unsigned int ip=0; ip<par.size(); ++ip ){
110 if(curSet==
"setNewCurrents") Tauolapp::Tauola::setNewCurrents(
fPSet->
getParameter<
int>(curSet));
111 if(curSet==
"spinCorrelationSetAll") Tauolapp::Tauola::spin_correlation.setAll(
fPSet->
getParameter<
bool>(curSet));
112 if(curSet==
"spinCorrelationGAMMA") Tauolapp::Tauola::spin_correlation.GAMMA=
fPSet->
getParameter<
bool>(curSet);
113 if(curSet==
"spinCorrelationZ0") Tauolapp::Tauola::spin_correlation.Z0=
fPSet->
getParameter<
bool>(curSet);
114 if(curSet==
"spinCorrelationHIGGS") Tauolapp::Tauola::spin_correlation.HIGGS=
fPSet->
getParameter<
bool>(curSet);
115 if(curSet==
"spinCorrelationHIGGSH") Tauolapp::Tauola::spin_correlation.HIGGS_H=
fPSet->
getParameter<
bool>(curSet);
116 if(curSet==
"spinCorrelationHIGGSA") Tauolapp::Tauola::spin_correlation.HIGGS_A=
fPSet->
getParameter<
bool>(curSet);
117 if(curSet==
"spinCorrelationHIGGSPLUS") Tauolapp::Tauola::spin_correlation.HIGGS_PLUS=
fPSet->
getParameter<
bool>(curSet);
118 if(curSet==
"spinCorrelationHIGGSMINUS") Tauolapp::Tauola::spin_correlation.HIGGS_MINUS=
fPSet->
getParameter<
bool>(curSet);
119 if(curSet==
"spinCorrelationWPLUS") Tauolapp::Tauola::spin_correlation.W_PLUS=
fPSet->
getParameter<
bool>(curSet);
120 if(curSet==
"spinCorrelationWMINUS") Tauolapp::Tauola::spin_correlation.W_MINUS=
fPSet->
getParameter<
bool>(curSet);
122 if(curSet==
"setHiggsScalarPseudoscalarPDG") Tauolapp::Tauola::setHiggsScalarPseudoscalarPDG(
fPSet->
getParameter<
int>(curSet));
123 if(curSet==
"setHiggsScalarPseudoscalarMixingAngle") Tauolapp::Tauola::setHiggsScalarPseudoscalarMixingAngle(
fPSet->
getParameter<
double>(curSet));
125 if(curSet==
"setRadiation") Tauolapp::Tauola::setRadiation(
fPSet->
getParameter<
bool>(curSet));
126 if(curSet==
"setRadiationCutOff") Tauolapp::Tauola::setRadiationCutOff(
fPSet->
getParameter<
double>(curSet));
128 if(curSet==
"setEtaK0sPi"){
130 if(vpar.size()==3) Tauolapp::Tauola::setEtaK0sPi(vpar[0],vpar[1],vpar[2]);
131 else {
std::cout <<
"WARNING invalid size for setEtaK0sPi: " << vpar.size() <<
" Require 3 elements " << std::endl;}
134 if(curSet==
"setTaukle"){
136 if(vpar.size()==4) Tauolapp::Tauola::setTaukle(vpar[0], vpar[1], vpar[2], vpar[3]);
137 else {
std::cout <<
"WARNING invalid size for setTaukle: " << vpar.size() <<
" Require 4 elements " << std::endl;}
140 if(curSet==
"setTauBr"){
142 std::vector<int> vJAK = cfg.
getParameter<std::vector<int> >(
"JAK");
143 std::vector<double> vBR = cfg.
getParameter<std::vector<double> >(
"BR");
144 if(vJAK.size() == vBR.size()){
145 for(
unsigned int i=0;
i<vJAK.size();
i++) Tauolapp::Tauola::setTauBr(vJAK[
i],vBR[i]);
147 else {
std::cout <<
"WARNING invalid size for setTauBr - JAK: " << vJAK.size() <<
" BR: " << vBR.size() << std::endl;}
156 if ( fMDTAU != 0 && fMDTAU != 1 )
161 Tauolapp::Log::LogWarning(
false);
170 <<
"TauolaInterface::flat: Attempt to generate random number when engine pointer is null\n"
171 <<
"This might mean that the code was modified to generate a random number outside the\n"
172 <<
"event and beginLuminosityBlock methods, which is not allowed.\n";
180 int NPartBefore = evt->particles_size();
181 int NVtxBefore = evt->vertices_size();
198 auto * t_event =
new Tauolapp::TauolaHepMCEvent(evt);
206 t_event->decayTaus();
218 for (
int iv=NVtxBefore+1; iv<=evt->vertices_size(); iv++ )
220 HepMC::GenVertex* GenVtx = evt->barcode_to_vertex(-iv);
226 std::vector<int> BCodes;
228 for (HepMC::GenVertex::particle_iterator pitr= GenVtx->particles_begin(HepMC::children);
229 pitr != GenVtx->particles_end(HepMC::children); ++pitr)
231 if ( (*pitr)->barcode() > 10000 )
233 BCodes.push_back( (*pitr)->barcode() );
236 if ( BCodes.size() > 0 )
238 for (
size_t ibc=0; ibc<BCodes.size(); ibc++ )
241 int nbc = p1->barcode() - 10000 + NPartBefore;
242 p1->suggest_barcode( nbc );
277 if ( mdtau == 101 || mdtau == 201 )
281 Tauolapp::jaki_.jak1 = 1;
282 Tauolapp::jaki_.jak2 = 1;
283 Tauolapp::Tauola::setSameParticleDecayMode( 1 ) ;
284 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 ) ;
288 if ( mdtau == 102 || mdtau == 202 )
292 Tauolapp::jaki_.jak1 = 2;
293 Tauolapp::jaki_.jak2 = 2;
294 Tauolapp::Tauola::setSameParticleDecayMode( 2 ) ;
295 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 ) ;
299 if ( mdtau == 111 || mdtau == 211 )
304 Tauolapp::jaki_.jak1 = 1;
305 Tauolapp::jaki_.jak2 = 0;
306 Tauolapp::Tauola::setSameParticleDecayMode( 1 ) ;
307 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
311 if ( mdtau == 112 || mdtau == 212 )
316 Tauolapp::jaki_.jak1 = 2;
317 Tauolapp::jaki_.jak2 = 0;
318 Tauolapp::Tauola::setSameParticleDecayMode( 2 ) ;
319 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
323 if ( mdtau == 121 || mdtau == 221 )
328 Tauolapp::jaki_.jak1 = 0;
329 Tauolapp::jaki_.jak2 = 1;
330 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
331 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 ) ;
335 if ( mdtau == 122 || mdtau == 222 )
340 Tauolapp::jaki_.jak1 = 0;
341 Tauolapp::jaki_.jak2 = 2;
342 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
343 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 ) ;
347 if ( mdtau == 140 || mdtau == 240 )
351 Tauolapp::jaki_.jak1 = 3;
352 Tauolapp::jaki_.jak2 = 3;
353 Tauolapp::Tauola::setSameParticleDecayMode( 3 ) ;
354 Tauolapp::Tauola::setOppositeParticleDecayMode( 3 ) ;
358 if ( mdtau == 141 || mdtau == 241 )
363 Tauolapp::jaki_.jak1 = 3;
364 Tauolapp::jaki_.jak2 = 0;
365 Tauolapp::Tauola::setSameParticleDecayMode( 3 ) ;
366 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 ) ;
370 if ( mdtau == 142 || mdtau == 242 )
375 Tauolapp::jaki_.jak1 = 0;
376 Tauolapp::jaki_.jak2 = 3;
377 Tauolapp::Tauola::setSameParticleDecayMode( 0 ) ;
378 Tauolapp::Tauola::setOppositeParticleDecayMode( 3 ) ;
395 for (
int i=0;
i<22;
i++ )
399 if ( sumBra == 0. )
return ;
400 for (
int i=0;
i<22;
i++ )
403 Tauolapp::Tauola::setTauBr(
i+1, newBra );
408 double sumHadronBra = sumBra - sumLeptonBra;
410 for (
int i=0;
i<2;
i++ )
415 for (
int i=2;
i<22;
i++ )
433 Tauolapp::jaki_.jak1 =
mode;
434 Tauolapp::Tauola::setSameParticleDecayMode( mode );
436 Tauolapp::jaki_.jak2 =
mode;
437 Tauolapp::Tauola::setOppositeParticleDecayMode( mode );
446 Tauolapp::jaki_.jak1 = modeL;
447 Tauolapp::jaki_.jak2 = 0;
448 Tauolapp::Tauola::setSameParticleDecayMode( modeL );
449 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
455 Tauolapp::jaki_.jak1 = 0;
456 Tauolapp::jaki_.jak2 = modeL;
457 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
458 Tauolapp::Tauola::setOppositeParticleDecayMode( modeL );
464 Tauolapp::jaki_.jak1 = modeL;
465 Tauolapp::jaki_.jak2 = modeH;
466 Tauolapp::Tauola::setSameParticleDecayMode( modeL );
467 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
473 Tauolapp::jaki_.jak1 = modeH;
474 Tauolapp::jaki_.jak2 = modeL;
475 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
476 Tauolapp::Tauola::setOppositeParticleDecayMode( modeL );
482 Tauolapp::jaki_.jak1 = 1;
483 Tauolapp::jaki_.jak2 = modeH;
484 Tauolapp::Tauola::setSameParticleDecayMode( 1 );
485 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
491 Tauolapp::jaki_.jak1 = modeH;
492 Tauolapp::jaki_.jak2 = 1;
493 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
494 Tauolapp::Tauola::setOppositeParticleDecayMode( 1 );
500 Tauolapp::jaki_.jak1 = 2;
501 Tauolapp::jaki_.jak2 = modeH;
502 Tauolapp::Tauola::setSameParticleDecayMode( 2 );
503 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
509 Tauolapp::jaki_.jak1 = modeH;
510 Tauolapp::jaki_.jak2 = 2;
511 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
512 Tauolapp::Tauola::setOppositeParticleDecayMode( 2 );
518 Tauolapp::jaki_.jak1 = modeH;
520 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
521 Tauolapp::Tauola::setOppositeParticleDecayMode( Tauolapp::jaki_.
jak2 );
527 Tauolapp::jaki_.jak1 = modeH;
528 Tauolapp::jaki_.jak2 = 0;
529 Tauolapp::Tauola::setSameParticleDecayMode( modeH );
530 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
536 Tauolapp::jaki_.jak1 = 0;
537 Tauolapp::jaki_.jak2 = modeH;
538 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
539 Tauolapp::Tauola::setOppositeParticleDecayMode( modeH );
548 Tauolapp::Tauola::setSameParticleDecayMode( 0 );
549 Tauolapp::Tauola::setOppositeParticleDecayMode( 0 );
581 if ( prob > 0. && prob <= sumBra )
588 for (
int i=1;
i<NN;
i++ )
T getParameter(std::string const &) const
static AlgebraicMatrix initialize()
TauolappInterface(const edm::ParameterSet &)
edm::ParameterSet * fPSet
std::vector< double > fScaledHadronBrRatios
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void rmarin_(int *, int *, int *)
void getData(T &iHolder) const
std::vector< int > fLeptonModes
Abs< T >::type abs(const T &t)
void ranmar_(float *rvec, int *lenv)
HepPDT::ParticleData ParticleData
void init(const edm::EventSetup &)
HepMC::GenEvent * decay(HepMC::GenEvent *)
std::vector< double > fScaledLeptonBrRatios
static CLHEP::HepRandomEngine * fRandomEngine
return(e1-e2)*(e1-e2)+dp *dp
std::vector< int > fHadronModes
edm::ESHandle< HepPDT::ParticleDataTable > fPDGTable
volatile std::atomic< bool > shutdown_flag false
void selectDecayByMDTAU()