#include #include #include #include "Log.h" #include "Tauola.h" #include "TauolaEvent.h" namespace Tauolapp { bool Tauola::m_is_initialized = false; int Tauola::m_pdg_id = 15; int Tauola::m_firstDecayMode = 0; int Tauola::m_secondDecayMode = 0; bool Tauola::m_rad = true; double Tauola::m_rad_cut_off = 0.001; double Tauola::m_iniphy = 0.1; double Tauola::m_higgs_scalar_pseudoscalar_mix = M_PI/4; int Tauola::m_higgs_scalar_pseudoscalar_pdg = 35; int Tauola::m_helPlus = 0; int Tauola::m_helMinus = 0; double Tauola::m_wtEW = 0.0; double Tauola::m_wtEW0 = 0.0; double Tauola::table11A[NS1][NCOS][4][4] = {{{{0.0}}}}; double Tauola::table1A [NS1][NCOS][4][4] = {{{{0.0}}}}; double Tauola::table2A [NS1][NCOS][4][4] = {{{{0.0}}}}; double Tauola::wtable11A[NS1][NCOS] = {{0.0}}; double Tauola::wtable1A [NS1][NCOS] = {{0.0}}; double Tauola::wtable2A [NS1][NCOS] = {{0.0}}; double Tauola::w0table11A[NS1][NCOS] = {{0.0}}; double Tauola::w0table1A [NS1][NCOS] = {{0.0}}; double Tauola::w0table2A [NS1][NCOS] = {{0.0}}; double Tauola::table11B[NS2][NCOS][4][4] = {{{{0.0}}}}; double Tauola::table1B [NS2][NCOS][4][4] = {{{{0.0}}}}; double Tauola::table2B [NS2][NCOS][4][4] = {{{{0.0}}}}; double Tauola::wtable11B[NS2][NCOS] = {{0.0}}; double Tauola::wtable1B [NS2][NCOS] = {{0.0}}; double Tauola::wtable2B [NS2][NCOS] = {{0.0}}; double Tauola::w0table11B[NS2][NCOS] = {{0.0}}; double Tauola::w0table1B [NS2][NCOS] = {{0.0}}; double Tauola::w0table2B [NS2][NCOS] = {{0.0}}; double Tauola::table11C[NS3][NCOS][4][4] = {{{{0.0}}}}; double Tauola::table1C [NS3][NCOS][4][4] = {{{{0.0}}}}; double Tauola::table2C [NS3][NCOS][4][4] = {{{{0.0}}}}; double Tauola::wtable11C[NS3][NCOS] = {{0.0}}; double Tauola::wtable1C [NS3][NCOS] = {{0.0}}; double Tauola::wtable2C [NS3][NCOS] = {{0.0}}; double Tauola::w0table11C[NS3][NCOS] = {{0.0}}; double Tauola::w0table1C [NS3][NCOS] = {{0.0}}; double Tauola::w0table2C [NS3][NCOS] = {{0.0}}; double Tauola::sminA = 0; double Tauola::smaxA = 0; double Tauola::sminB = 0; double Tauola::smaxB = 0; double Tauola::sminC = 0; double Tauola::smaxC = 0; int Tauola::ion[3] = {0}; double Tauola::tau_lifetime = .08711; double Tauola::momentum_conservation_threshold = 0.1; Tauola::Particles Tauola::spin_correlation; Tauola::MomentumUnits Tauola::momentumUnit = Tauola::DEFAULT_MOMENTUM; Tauola::LengthUnits Tauola::lengthUnit = Tauola::DEFAULT_LENGTH; bool Tauola::m_is_using_decay_one = false; double Tauola::m_decay_one_polarization[3] = {0}; void (*Tauola::m_decay_one_boost_routine)(TauolaParticle*,TauolaParticle*) = NULL; int Tauola::buf_incoming_pdg_id = 0; int Tauola::buf_outgoing_pdg_id = 0; double Tauola::buf_invariant_mass_squared = -1.; double Tauola::buf_cosTheta = 0.; double Tauola::buf_R[4][4] = {{0.0}}; //density matrix double (*Tauola::randomDouble)() = Tauola::defaultRandomGenerator; void (*Tauola::redefineTauPlusProperties)(TauolaParticle *) = defaultRedPlus; void (*Tauola::redefineTauMinusProperties)(TauolaParticle *) = defaultRedMinus; /**************************************************************/ void Tauola::setNewCurrents(int mode) { inirchl_(&mode); } double Tauola::defaultRandomGenerator(){ return rand()*1./RAND_MAX; } void Tauola::setRandomGenerator(double (*gen)()){ if(gen==NULL) randomDouble = defaultRandomGenerator; else randomDouble = gen; } void Tauola::defaultRedPlus(TauolaParticle *tau) {} void Tauola::defaultRedMinus(TauolaParticle *tau) {} void Tauola::setRedefineTauMinus( void (*fun)(TauolaParticle *) ){ redefineTauMinusProperties=fun; } void Tauola::setRedefineTauPlus ( void (*fun)(TauolaParticle *) ){ redefineTauPlusProperties=fun; } void Tauola::getBornKinematics(int *incoming_pdg_id, int *outgoing_pdg_id, double *invariant_mass_squared,double *cosTheta){ *incoming_pdg_id = buf_incoming_pdg_id; *outgoing_pdg_id = buf_outgoing_pdg_id; *invariant_mass_squared = buf_invariant_mass_squared; *cosTheta = buf_cosTheta; // m_R[0][0] to be added in next step; } void Tauola::setUnits(MomentumUnits m, LengthUnits l){ Tauola::momentumUnit = m; Tauola::lengthUnit = l; } void Tauola::setTauLifetime(double t){ tau_lifetime = t; } void Tauola::initialize(){ printf("\n"); printf(" *************************************\n"); printf(" * TAUOLA C++ Interface v1.1.8 *\n"); printf(" *-----------------------------------*\n"); printf(" * *\n"); printf(" * (c) Nadia Davidson, (1,2) *\n"); printf(" * (c) Gizo Nanava, (3) *\n"); printf(" * Tomasz Przedzinski,(4) *\n"); printf(" * Elzbieta Richter-Was,(2,4) *\n"); printf(" * Zbigniew Was (2,5) *\n"); printf(" * *\n"); printf(" * 1) Unimelb, Melbourne, Australia *\n"); printf(" * 2) INP, Krakow, Poland *\n"); printf(" * 3) University Bonn, Germany *\n"); printf(" * 4) UJ, Krakow, Poland *\n"); printf(" * 5) CERN, Geneva, Switzerland *\n"); printf(" *************************************\n"); if(m_is_initialized) { printf(" * *\n"); printf(" * *\n"); printf(" *WARNING: Tauola already initialized*\n"); printf(" * reinitialization skipped *\n"); printf(" * *\n"); printf(" * *\n"); printf(" *************************************\n"); return; } m_is_initialized = true; // Turn on all spin correlations spin_correlation.setAll(true); // Ininitalize tauola-fortran f_interface_tauolaInitialize(m_pdg_id,m_firstDecayMode, m_secondDecayMode,m_rad, m_rad_cut_off, m_iniphy); //--------------------------------------------------------------------------- // Initialize SANC tables //--------------------------------------------------------------------------- cout<<"Reading SANC input files."<>buf>>dbuf1>>dbuf2>>dbuf3>>dbufcos; // Check table sizes if(dbuf1!=NS1 || dbuf2!=NS2 || dbuf3!=NS3 || dbufcos!=NCOS) { cout<<"mismatched NS1= "< "< "< "< "<>buf>>buf1>>buf2>>buf3>>buf4>>buf5>>buf6; // Set ranges if(sminA==0.0){ sminA=buf1; smaxA=buf2; sminB=buf3; smaxB=buf4; sminC=buf5; smaxC=buf6; } // Check ranges if(buf1!=sminA || buf2!=smaxA || buf3!=sminB || buf4!=smaxB || buf5!=sminC || buf6!=smaxC) { cout<<"mismatched sminA= "< "< "< "< "< "< "<>table1A[i][j][k][l]; } // for(l) } // for(k) f>>wtable1A[i][j]; f>>w0table1A[i][j]; } // for(j) } // for(i) // Find 2nd range while(!f.eof()){ f>>buf; if(strcmp(buf.c_str(),"BeginRange2")==0) break; } // Read table for (int i=0;i>table1B[i][j][k][l]; } // for(l) } // for(k) f>>wtable1B[i][j]; f>>w0table1B[i][j]; } // for(j) } // for(i) // Find 3rd range while(!f.eof()){ f>>buf; if(strcmp(buf.c_str(),"BeginRange3")==0) break; } // Read table for (int i=0;i>table1C[i][j][k][l]; } // for(l) } // for(k) f>>wtable1C[i][j]; f>>w0table1C[i][j]; } // for(j) } // for(i) // Check for proper file end f>>buf; if(buf.size() == 0 || strcmp(buf.c_str(),"End") != 0){ cout<<"...incorrect file version or file incomplete/damaged!"<>buf>>dbuf1>>dbuf2>>dbuf3>>dbufcos; // Check table sizes if(dbuf1!=NS1 || dbuf2!=NS2 || dbuf3!=NS3 || dbufcos!=NCOS) { cout<<"mismatched NS1= "< "< "< "< "<>buf>>buf1>>buf2>>buf3>>buf4>>buf5>>buf6; // Set ranges if(sminA==0.0) { sminA=buf1; smaxA=buf2; sminB=buf3; smaxB=buf4; sminC=buf5; smaxC=buf6; } // Check ranges if(buf1!=sminA || buf2!=smaxA || buf3!=sminB || buf4!=smaxB || buf5!=sminC || buf6!=smaxC) { cout<<"mismatched sminA= "< "< "< "< "< "< "<>table2A[i][j][k][l]; } // for(l) } // for(k) f>>wtable2A[i][j]; f>>w0table2A[i][j]; } // for(j) } // for(i) // Find 2nd range while(!f.eof()){ f>>buf; if(strcmp(buf.c_str(),"BeginRange2")==0) break; } // Read table for (int i=0;i>table2B[i][j][k][l]; } // for(l) } // for(k) f>>wtable2B[i][j]; f>>w0table2B[i][j]; } // for(j) } // for(i) // Find 3rd range while(!f.eof()){ f>>buf; if(strcmp(buf.c_str(),"BeginRange3")==0) break; } // Read table for (int i=0;i>table2C[i][j][k][l]; } // for(l) } // for(k) f>>wtable2C[i][j]; f>>w0table2C[i][j]; } // for(j) } // for(i) // Check for proper file end f>>buf; if(buf.size()==0 || strcmp(buf.c_str(),"End")!=0){ cout<<"...incorrect file version or file incomplete/damaged!"<>buf>>dbuf1>>dbuf2>>dbuf3>>dbufcos; // Check table sizes if(dbuf1!=NS1 || dbuf2!=NS2 || dbuf3!=NS3 || dbufcos!=NCOS) { cout<<"mismatched NS1= "< "< "< "< "<>buf>>buf1>>buf2>>buf3>>buf4>>buf5>>buf6; // Set ranges if(sminA==0.0) { sminA=buf1; smaxA=buf2; sminB=buf3; smaxB=buf4; sminC=buf5; smaxC=buf6; } // Check ranges if(buf1!=sminA || buf2!=smaxA || buf3!=sminB || buf4!=smaxB || buf5!=sminC || buf6!=smaxC) { cout<<"mismatched sminA= "< "< "< "< "< "< "<>table11A[i][j][k][l]; } // for(l) } // for(k) f>>wtable11A[i][j]; f>>w0table11A[i][j]; } // for(j) } // for(i) // Find 2nd range while(!f.eof()){ f>>buf; if(strcmp(buf.c_str(),"BeginRange2")==0) break; } // Read table for (int i=0;i>table11B[i][j][k][l]; } // for(l) } // for(k) f>>wtable11B[i][j]; f>>w0table11B[i][j]; } // for(j) } // for(i) // Find 3rd range while(!f.eof()){ f>>buf; if(strcmp(buf.c_str(),"BeginRange3")==0) break; } // Read table for (int i=0;i>table11C[i][j][k][l]; } // for(l) } // for(k) f>>wtable11C[i][j]; f>>w0table11C[i][j]; } // for(j) } // for(i) f>>buf; if(buf.size()==0 || strcmp(buf.c_str(),"End")!=0){ cout<<"...incorrect file version or file incomplete/damaged!"<1) { Log::Warning()<<"decayOne(): ignoring wrong polarization vector: "<hasDaughters()) { if(undecay) tau->undecay(); else { m_is_using_decay_one = false; return; } } std::vector list; list.push_back(tau); // Decay single tau TauolaParticlePair t_pair(list); t_pair.decayTauPair(); t_pair.checkMomentumConservation(); // Revert to normal mode m_is_using_decay_one = false; } void Tauola::initialise(){ Log::Warning() <<"Deprecated routine 'Tauola::initialise'"<taubra_.nchan || value<0.) Log::Warning()<<"setTauBr(): Invalid input. Value must be >= 0 and 0 < i <= "<1 || brk0<0 ||brk0>1 || brk0b<0 || brk0b>1 || brks<0 ||brks>1) { Log::Warning()<<"setTaukle(): variables must be in range [0,1]. Ignored."<