file src/SpecBit_SubGeVDM.cpp

[No description available] More…

Namespaces

Name
Gambit
TODO: see if we can use this one:
Gambit::SpecBit

Detailed Description

Author: Felix Kahlhoefer (kahlhoefer@kit.edu)

Date: 2022 May

Functions of module SpecBit

SpecBit module functions related to the SubGeVDM model.


Authors (add name and date if you modify):


Source code

//   GAMBIT: Global and Modular BSM Inference Tool
//   *********************************************
///  \file
///
///  Functions of module SpecBit
///
///  SpecBit module functions related to the
///  SubGeVDM model.
///
///  *********************************************
///
///  Authors (add name and date if you modify):
///
///  \author Felix Kahlhoefer
///          (kahlhoefer@kit.edu)
///  \date 2022 May
///
///  *********************************************

#include <string>
#include <sstream>

#include "gambit/Elements/gambit_module_headers.hpp"

#include "gambit/Elements/spectrum.hpp"
#include "gambit/Utils/stream_overloads.hpp"
#include "gambit/Utils/util_macros.hpp"

#include "gambit/SpecBit/SpecBit_rollcall.hpp"
#include "gambit/SpecBit/SpecBit_helpers.hpp"
#include "gambit/SpecBit/QedQcdWrapper.hpp"
#include "gambit/Models/SimpleSpectra/SMHiggsSimpleSpec.hpp"
#include "gambit/Models/SimpleSpectra/SubGeVDMSimpleSpec.hpp"

// Switch for debug mode
//#define SPECBIT_DEBUG

namespace Gambit
{

  namespace SpecBit
  {
    using namespace LogTags;

    /// Get a (simple) Spectrum object wrapper for the SubGeVDM model
    void get_SubGeVDM_spectrum(Spectrum& result)
    {
      using namespace Pipes::get_SubGeVDM_spectrum;
      const SMInputs& sminputs = *Dep::SMINPUTS;

      // Mass cut on the dark photon mass mAp >= 2 mDM
      bool dark_photon_mass_cut = runOptions->getValueOrDef<bool>(true, "dark_photon_mass_cut");
      if(dark_photon_mass_cut and *Param.at("mAp") < 2. * *Param.at("mDM"))
      {
        std::stringstream msg;
        msg << "Parameter point [mDM, mAp] = [" << *Param.at("mDM") << ", " << *Param.at("mAp") << "] is invalid. Dark photon mass must satisfy mAp >= 2 mDM. ";
        invalid_point().raise(msg.str());
      }

      // Initialise an object to carry the Singlet plus Higgs sector information
      Models::SubGeVDMModel SubGeVmodel;

      // quantities needed to fill container spectrum, intermediate calculations
      double alpha_em = 1.0 / sminputs.alphainv;
      double C = alpha_em * pi / (sminputs.GF * pow(2,0.5));
      double sinW2 = 0.5 - pow( 0.25 - C/pow(sminputs.mZ,2) , 0.5);
      double cosW2 = 0.5 + pow( 0.25 - C/pow(sminputs.mZ,2) , 0.5);
      double e = pow( 4*pi*( alpha_em ),0.5) ;

      double vev        = 1. / sqrt(sqrt(2.)*sminputs.GF);
      SubGeVmodel.vev        = vev;
      SubGeVmodel.SubGeV_DMPoleMass = *Param.at("mDM");
      SubGeVmodel.SubGeV_ApPoleMass = *Param.at("mAp");
      SubGeVmodel.SubGeV_gDM   = *Param.at("gDM");
      SubGeVmodel.SubGeV_kappa   = *Param.at("kappa");

      // Standard model
      SubGeVmodel.sinW2 = sinW2;

      // gauge couplings
      SubGeVmodel.g1 = sqrt(5/3) * e / sqrt(cosW2);
      SubGeVmodel.g2 = e / sqrt(sinW2);
      SubGeVmodel.g3   = pow( 4*pi*( sminputs.alphaS ),0.5) ;

      // Yukawas
      double sqrt2v = pow(2.0,0.5)/vev;
      SubGeVmodel.Yu[0] = sqrt2v * sminputs.mU;
      SubGeVmodel.Yu[1] = sqrt2v * sminputs.mCmC;
      SubGeVmodel.Yu[2] = sqrt2v * sminputs.mT;
      SubGeVmodel.Ye[0] = sqrt2v * sminputs.mE;
      SubGeVmodel.Ye[1] = sqrt2v * sminputs.mMu;
      SubGeVmodel.Ye[2] = sqrt2v * sminputs.mTau;
      SubGeVmodel.Yd[0] = sqrt2v * sminputs.mD;
      SubGeVmodel.Yd[1] = sqrt2v * sminputs.mS;
      SubGeVmodel.Yd[2] = sqrt2v * sminputs.mBmB;

      // Create a SubSpectrum object to wrap the EW sector information
      Models::SubGeVDMSimpleSpec SubGeVspec(SubGeVmodel);

      // Retrieve any mass cuts
      static const Spectrum::mc_info mass_cut = runOptions->getValueOrDef<Spectrum::mc_info>(Spectrum::mc_info(), "mass_cut");
      static const Spectrum::mr_info mass_ratio_cut = runOptions->getValueOrDef<Spectrum::mr_info>(Spectrum::mr_info(), "mass_ratio_cut");

      // We don't supply a LE subspectrum here; an SMSimpleSpec will therefore be automatically created from 'sminputs'
      result = Spectrum(SubGeVspec,sminputs,&Param,mass_cut,mass_ratio_cut);

    }

    // print spectrum out, stripped down copy from MSSM version with variable names changed
    void fill_map_from_SubGeVDM_spectrum(std::map<std::string,double>&, const Spectrum&);

    void get_SubGeVDM_spectrum_as_map (std::map<std::string,double>& specmap)
    {
      using namespace Pipes::get_SubGeVDM_spectrum_as_map;
      const Spectrum& SubGeVdmspec(*Dep::SubGeVDM_spectrum);
      fill_map_from_SubGeVDM_spectrum(specmap, SubGeVdmspec);
    }

    void fill_map_from_SubGeVDM_spectrum(std::map<std::string,double>& specmap, const Spectrum& SubGeVdmspec)
    {
      /// Add everything... use spectrum contents routines to automate task
      static const SpectrumContents::SubGeVDM contents;
      static const std::vector<SpectrumParameter> required_parameters = contents.all_parameters();

      for(std::vector<SpectrumParameter>::const_iterator it = required_parameters.begin();
           it != required_parameters.end(); ++it)
      {
         const Par::Tags        tag   = it->tag();
         const std::string      name  = it->name();
         const std::vector<int> shape = it->shape();

         /// Verification routine should have taken care of invalid shapes etc, so won't check for that here.

         // Check scalar case
         if(shape.size()==1 and shape[0]==1)
         {
           std::ostringstream label;
           label << name <<" "<< Par::toString.at(tag);
           specmap[label.str()] = SubGeVdmspec.get_HE().get(tag,name);
         }
         // Check vector case
         else if(shape.size()==1 and shape[0]>1)
         {
           for(int i = 1; i<=shape[0]; ++i) {
             std::ostringstream label;
             label << name <<"_"<<i<<" "<< Par::toString.at(tag);
             specmap[label.str()] = SubGeVdmspec.get_HE().get(tag,name,i);
           }
         }
         // Check matrix case
         else if(shape.size()==2)
         {
           for(int i = 1; i<=shape[0]; ++i) {
             for(int j = 1; j<=shape[0]; ++j) {
               std::ostringstream label;
               label << name <<"_("<<i<<","<<j<<") "<<Par::toString.at(tag);
               specmap[label.str()] = SubGeVdmspec.get_HE().get(tag,name,i,j);
             }
           }
         }
         // Deal with all other cases
         else
         {
           // ERROR
           std::ostringstream errmsg;
           errmsg << "Error, invalid parameter received while converting SubGeVDM_spectrum to map of strings! This should no be possible if the spectrum content verification routines were working correctly; they must be buggy, please report this.";
           errmsg << "Problematic parameter was: "<< tag <<", " << name << ", shape="<< shape;
           utils_error().forced_throw(LOCAL_INFO,errmsg.str());
         }
      }

    }

  } // end namespace SpecBit
} // end namespace Gambit

Updated on 2024-07-18 at 13:53:32 +0000