|
GAMBIT
v1.5.0-2191-ga4742ac
a Global And Modular Bsm Inference Tool
|
Go to the documentation of this file. 28 #include "boost/make_shared.hpp" 43 TH_ProcessCatalog* const catalog, 48 : Gamma_mh(gammaH), v0 (vev), 49 alpha_s (alpha_strong), vSigma_semi (vSigma_s) 51 mh = catalog->getParticleProperty( "h0_1").mass; 52 mb = catalog->getParticleProperty( "d_3").mass; 53 mc = catalog->getParticleProperty( "u_2").mass; 54 mtau = catalog->getParticleProperty( "e-_3").mass; 55 mt = catalog->getParticleProperty( "u_3").mass; 56 mZ0 = catalog->getParticleProperty( "Z0").mass; 57 mW = catalog->getParticleProperty( "W+").mass; 58 mS = catalog->getParticleProperty( "S").mass; 65 return 1/((s- mh* mh)*(s- mh* mh)+mh*mh*Gamma_mh*Gamma_mh); 74 double sv(std::string channel, double lambda, double mass, double v) 78 double s = 4*mass*mass/(1-v*v/4); 79 double sqrt_s = sqrt(s); 83 "SingletDM sigmav called with sqrt_s < 90 GeV."); 87 if ( channel == "Sh" ) 89 if (sqrt_s > ( mh+mS)) return vSigma_semi; 93 if ( channel == "hh" ) 98 return sv_hh(lambda, mass, v)*GeV2tocm3s1; 103 if ( channel == "bb" and sqrt_s < mb*2 ) return 0; 104 if ( channel == "cc" and sqrt_s < mc*2 ) return 0; 105 if ( channel == "tautau" and sqrt_s < mtau*2 ) return 0; 106 if ( channel == "tt" and sqrt_s < mt*2 ) return 0; 107 if ( channel == "ZZ" and sqrt_s < mZ0*2) return 0; 108 if ( channel == "WW" and sqrt_s < mW*2) return 0; 117 if ( channel == "tt" and sqrt_s < mt*2) return 0; 119 double res = 2*lambda*lambda* v0* v0/ 120 sqrt_s*Dh2(s)*Gamma_s*GeV2tocm3s1*br; 125 if ( channel == "bb" ) return sv_ff(lambda, mass, v, mb, true); 126 if ( channel == "cc" ) return sv_ff(lambda, mass, v, mc, true); 127 if ( channel == "tautau" ) return sv_ff(lambda, mass, v, mtau, false); 128 if ( channel == "tt" ) return sv_ff(lambda, mass, v, mt, true); 129 if ( channel == "ZZ" ) return sv_ZZ(lambda, mass, v); 130 if ( channel == "WW" ) return sv_WW(lambda, mass, v); 136 double sv_WW( double lambda, double mass, double v) 138 double s = 4*mass*mass/(1-v*v/4); 139 double x = pow( mW,2)/s; 141 return pow(lambda,2)*s/8/M_PI*sqrt(1-4*x)*Dh2(s)*(1-4*x+12* pow(x,2)) 146 double sv_ZZ( double lambda, double mass, double v) 148 double s = 4*mass*mass/(1-v*v/4); 149 double x = pow(mZ0,2)/s; 151 return pow(lambda,2)*s/16/M_PI*sqrt(1-4*x)*Dh2(s)*(1-4*x+12* pow(x,2)) 157 double lambda, double mass, double v, double mf, bool is_quark) 159 double s = 4*mass*mass/(1-v*v/4); 160 double vf = sqrt(1-4* pow(mf,2)/s); 162 if ( is_quark ) Xf = 3 * 163 (1+(3/2*log( pow(mf,2)/s)+9/4)*4*alpha_s/3/M_PI); 165 return pow(lambda,2)* 166 pow(mf,2)/4/M_PI*Xf* pow(vf,3) * Dh2(s) * GeV2tocm3s1; 170 double sv_hh( double lambda, double mass, double v) 173 double s = 4*mass*mass/(1-v*v/4); 174 double vh = sqrt(1-4* mh* mh/s); 176 double vs = std::max(v/2, 1e-6); 177 double tp = pow(mass,2)+ pow( mh,2)-0.5*s*(1-vs*vh); 178 double tm = pow(mass,2)+ pow( mh,2)-0.5*s*(1+vs*vh); 180 double aR = 1+3* mh* mh*(s- mh* mh)*Dh2(s); 181 double aI = 3* mh* mh*sqrt(s)*Gamma_mh*Dh2(s); 183 return pow(lambda,2)/16/M_PI/ pow(s,2)/vs * 185 ( pow(aR,2)+ pow(aI,2))*s*vh*vs 187 *log(std::abs( pow(mass,2)-tp)/std::abs( pow(mass,2)-tm)) 188 +(2* pow(lambda,2)* pow( v0,4)*s*vh*vs) 189 /( pow(mass,2)-tm)/( pow(mass,2)- tp)); 193 double Gamma_mh, mh, v0, alpha_s, mb, mc, mtau, mt, mZ0, mW, mS, vSigma_semi; 208 double fp = 2./9. + 7./9.*(*Param[ "fpu"] + *Param[ "fpd"] + *Param[ "fps"]); 209 double fn = 2./9. + 7./9.*(*Param[ "fnu"] + *Param[ "fnd"] + *Param[ "fns"]); 217 logger() << " gps = " << result.gps << std::endl; 218 logger() << " gns = " << result.gns << std::endl; 219 logger() << " gpa = " << result.gpa << std::endl; 220 logger() << " gna = " << result.gna << EOM; 259 #define getSMmass(Name, spinX2) \ 260 catalog.particleProperties.insert(std::pair<string, TH_ParticleProperty> \ 261 (Name , TH_ParticleProperty(SM.get(Par::Pole_Mass,Name), spinX2))); 262 #define addParticle(Name, Mass, spinX2) \ 263 catalog.particleProperties.insert(std::pair<string, TH_ParticleProperty> \ 264 (Name , TH_ParticleProperty(Mass, spinX2))); 302 double alpha_s = SMI. alphaS; 343 std::set<string> importedDecays; 346 double minBranching = 0; 353 ImportDecays( "h0_1", catalog, importedDecays, tbl, minBranching, 354 daFunk::vec<std::string>( "Z0", "W+", "W-", "e+_2", "e-_2", "e+_3", "e-_3")); 357 auto singletDM = boost::make_shared<ScalarSingletDM>(&catalog, gammaH, v, alpha_s, 0.0); 365 daFunk::vec<string>( "bb", "WW", "cc", "tautau", "ZZ", "tt", "hh"); 367 daFunk::vec<string>( "d_3", "W+", "u_2", "e+_3", "Z0", "u_3", "h0_1"); 369 daFunk::vec<string>( "dbar_3", "W-", "ubar_2", "e-_3", "Z0", "ubar_3", "h0_1"); 371 for ( unsigned int i = 0; i < channel.size(); i++ ) 374 catalog.getParticleProperty(p1[i]).mass + 375 catalog.getParticleProperty(p2[i]).mass; 377 if ( mS*2 > mtot_final*0.5 ) 380 &ScalarSingletDM::sv, channel[i], lambda, mS, daFunk::var( "v")); 382 daFunk::vec<string>(p1[i], p2[i]), kinematicFunction 386 if ( mS*2 > mtot_final ) 389 push_back(mtot_final); 398 catalog.processList.push_back(process_ann); 407 ScalarSingletDM test = *singletDM; 410 for ( int ii=0; ii < nc ; ii++) 412 total = total + test.sv(channel[ii], lambda, mS, 0.0); 414 cout << " --- Testing process catalouge --- " << endl; 415 cout << "Total sigma V from process catalouge = " << total << endl; 416 cout << " ---------- " << endl; 443 double * SpNe=NULL,*SpNm=NULL,*SpNl=NULL; 444 double * SpA=NULL,*SpE=NULL,*SpP=NULL; 451 DarkBit_error().raise( LOCAL_INFO, "MicrOmegas spectrum calculation returned error code = " + std::to_string(err)); 455 MicrOmegas::aChannel* vSigmaCh; 456 vSigmaCh = *BEreq::vSigmaCh; 458 int n_channels = sizeof(vSigmaCh); 461 cout << "--- Semi-annihilation processes and BRs --- " << endl; 465 while ((vSigmaCh[i].weight!=0) && (i < n_channels)) 468 const char* p1 = vSigmaCh[i].prtcl[2]; 469 const char* p2 = vSigmaCh[i].prtcl[3]; 472 if ( (strcmp(p1, "h")==0) && ( (strcmp(p2, "~ss")==0) || (strcmp(p2, "~SS")==0) ) ) 474 BR_semi = BR_semi + vSigmaCh[i].weight; 476 cout << "process: " << vSigmaCh[i].prtcl[0] << " + "; 477 cout << vSigmaCh[i].prtcl[1] << " -> " << p1 << " + " << p2; 478 cout << ", BR = " << vSigmaCh[i].weight << endl; 486 double vSigma_semi = BR_semi * 2.0 * vSigma_total; 489 cout << "--- --- " << endl; 490 cout << "Total sigma v from MicrOmegas = " << vSigma_total << " cm^3/s" << endl; 491 cout << "semi-annihilation BR = " << BR_semi << endl; 492 cout << "semi-annihilation sigma v from MicrOmegas = " << 0.5*vSigma_semi << " cm^3/s" << endl; 493 cout << "Total sigma v from MicrOmegas excluding semi-annihilations = " << vSigma_total - 0.5*vSigma_semi << endl; 494 cout << "--------- " << endl; 503 #define getSMmass(Name, spinX2) \ 504 catalog.particleProperties.insert(std::pair<string, TH_ParticleProperty> \ 505 (Name , TH_ParticleProperty(SM.get(Par::Pole_Mass,Name), spinX2))); 506 #define addParticle(Name, Mass, spinX2) \ 507 catalog.particleProperties.insert(std::pair<string, TH_ParticleProperty> \ 508 (Name , TH_ParticleProperty(Mass, spinX2))); 546 double alpha_s = SMI. alphaS; 587 std::set<string> importedDecays; 590 double minBranching = 0; 597 ImportDecays( "h0_1", catalog, importedDecays, tbl, minBranching, 598 daFunk::vec<std::string>( "Z0", "W+", "W-", "e+_2", "e-_2", "e+_3", "e-_3")); 601 auto singletDM = boost::make_shared<ScalarSingletDM>(&catalog, gammaH, v, alpha_s, vSigma_semi); 609 daFunk::vec<string>( "bb", "WW", "cc", "tautau", "ZZ", "tt", "hh", "Sh"); 611 daFunk::vec<string>( "d_3", "W+", "u_2", "e+_3", "Z0", "u_3", "h0_1", "S"); 613 daFunk::vec<string>( "dbar_3", "W-", "ubar_2", "e-_3", "Z0", "ubar_3", "h0_1", "h0_1"); 615 for ( unsigned int i = 0; i < channel.size(); i++ ) 618 catalog.getParticleProperty(p1[i]).mass + 619 catalog.getParticleProperty(p2[i]).mass; 621 if ( mS*2 > mtot_final*0.5 ) 624 &ScalarSingletDM::sv, channel[i], lambda, mS, daFunk::var( "v")); 626 daFunk::vec<string>(p1[i], p2[i]), kinematicFunction 630 if ( mS*2 > mtot_final ) 633 push_back(mtot_final); 642 catalog.processList.push_back(process_ann); 650 ScalarSingletDM test = *singletDM; 653 for ( int ii=0; ii < nc ; ii++) 655 total = total + test.sv(channel[ii], lambda, mS, 0.0); 657 cout << " --- Testing process catalouge --- " << endl; 658 cout << "Total sigma V from process catalouge excluding semi-annihilations = " << total << endl; 659 total = total + test.sv( "Sh", lambda, mS, 0.0); 660 cout << "Total including semi-annihilations = " << total << endl; 661 cout << " ---------- " << endl; std::vector< TH_Channel > channelList List of channels.
double get(const Par::Tags partype, const std::string &mass) const
Simple function for returning SM Higgs partial and total widths as a function of virtuality, as read from data files from CERN Yellow Paper arXiv:1101.0593.
std::chrono::steady_clock::time_point tp
void DD_couplings_ScalarSingletDM_Z2(DM_nucleon_couplings &result) Direct detection couplings for Z2 scalar singlet DM.
std::vector< TH_Resonance > resonances
Entry & at(std::pair< int, int >) Get entry in decay table for a give particle, throwing an error if particle is absent.
void ImportDecays(std::string pID, TH_ProcessCatalog &catalog, std::set< std::string > &importedDecays, const DecayTable *tbl, double minBranching, std::vector< std::string > excludeDecays=std::vector< std::string >())
Funk funcM(O *obj, double(O::*f)(funcargs...), Args... args)
Simple reader for ASCII tables.
#define addParticle(Name, Mass, spinX2)
std::vector< double > threshold_energy
void TH_ProcessCatalog_ScalarSingletDM_Z2(DarkBit::TH_ProcessCatalog &result) Set up process catalog for Z2 scalar singlet DM.
Funk var(std::string arg)
double virtual_SMHiggs_widths(str, double) Higgs branching ratios and total width Gamma [GeV], as function of mass [GeV] (90 - 300 GeV) ...
void DD_couplings_ScalarSingletDM_Z3(DM_nucleon_couplings &result) Direct detection couplings for Z3 scalar singlet DM.
Piped_invalid_point piped_invalid_point Global instance of piped invalid point class.
bool isSelfConj Does the process contain self-conjugate DM? (accounting for correct factors of 1/2 in annihilation sp...
Spectrum Spectrum Spectrum Spectrum Spectrum Spectrum Spectrum ScalarSingletDM_Z3_spectrum
ScalarSingletDM_Z2_spectrum
A single resonance of a given width at a given energy (both in GeV)
void DarkMatterConj_ID_ScalarSingletDM(std::string &result)
virtual double get(const Par::Tags, const str &, const SpecOverrideOptions=use_overrides, const SafeBool check_antiparticle=SafeBool(true)) const =0
void DarkMatter_ID_ScalarSingletDM(std::string &result)
TH_resonances_thresholds resonances_thresholds List of resonances and thresholds.
double width_in_GeV Total particle width (in GeV)
void TH_ProcessCatalog_ScalarSingletDM_Z3(DarkBit::TH_ProcessCatalog &result) Set up process catalog for Z3 scalar singlet DM.
A container holding all annihilation and decay initial states relevant for DarkBit.
const Logging::endofmessage EOM Explicit const instance of the end of message struct in Gambit namespace.
EXPORT_SYMBOLS Logging::LogMaster & logger() Function to retrieve a reference to the Gambit global log object.
SubSpectrum & get_LE() Standard getters Return references to internal data members.
All data on a single annihilation or decay channel, e.g.
double lambda(double x, double y, double z)
Virtual base class for interacting with spectrum generator output.
#define getSMmass(Name, spinX2)
Rollcall header for module DarkBit.
GAMBIT native decay table class.
double pow(const double &a) Outputs a^i.
Spectrum Spectrum Spectrum Spectrum Spectrum Spectrum mh
void request(std::string message) Request an exception.
A container for a single process.
T byVal(T t) Redirection function to turn an lvalue into an rvalue, so that it is correctly passed by value when d...
shared_ptr< FunkBase > Funk
void get_ScalarSingletDM_DD_couplings(const Spectrum &spec, DM_nucleon_couplings &result, Models::safe_param_map< safe_ptr< const double > > &Param) Common code for different scalar singlet direct detection coupling routines.
TODO: see if we can use this one:
"Standard Model" (low-energy) plus high-energy model container class
SMInputs & get_SMInputs()
Utility functions for DarkBit.
|