edit · history · print

Dark Matter models, their implementation in MicroMegas and calculations

MicroMegas models

This section contains model files for MicroMegas that have been created with FeynRules and then exported in CalcHEP format with subsequent slight corrections to make the model work in CalcHEP (sometimes CalcHEP is picky on the order of function definitions etc). The model files listed here can be used in a newProject created project workspace inside MicroMegas 2.2 and higher without modifications. The separate subsections for separate models describe the publication according to which they are implemented as well as variable explanations.

Singlet model

Inert Doublet Model

MicroMegas coding tips

These tips are based on the micrOMEGAs 2.0 manual which can be found here.

Variable assignment and model parameters

Default model parameters are defined in work/model/vars1.mdl file. To change these variables you can use the assignVal(name,val) function. If you want to print out parameters, then you can either print out all parameters with for example printVar(stdout) or find the variable first with findVal(name,&val) and then use the printf facility in C.

The findVal function can also be used to find the value of calculated variables e.g. vacuum expectation value or some new particle mass etc, however to make this work the respective parameter needs to have a * prefixed in front of the variable name in the work/models/func1.mdl or it will just not be found.

Before any other calculations can happen the model parameters have to be set to their needed values and the function sortOddParticles(message) has to be called where message is a string variable containing the error message in case something goes wrong. Remember, that this function has to be called always after you change the model parameters as otherwise you might get inconsistent results. Once the odd particles are sorted you can find out which particle was defined as the dark matter candidate from the message variable and the mass of the particle from the lopmass_() function e.g.

printf("Dark Matter candidate is %s with mass %1.2f GeV\n",mess,lopmass_());

Relic density calculation

The routine which is why MicroMegas was first conceived is the calculation of the relic density, which you can do with the following function:

darkOmega(&Xf, fast, Beps)

where Xf is a pointer to a double precision variable, fast is either 1 or 0 depending if you want a fast or precise calculation. To the first order fast gives you the same result within 1% so if that's ok, then it's the preferred method. Beps defines a cutoff for which channels will be added to the calculation. If you just want the LOP itself, then set Beps to 1. If you want to consider most channels then a recommended value is around 10^-4 - 10^-6. The function returns the Omega h^2 value, Xf will be M_LOP/Tf, where Tf is the freezout temperature.

If you want to know which channels contributed to the calculation, then the function printChannels can be used, the arguments the function takes are:

Xf - as returned by darkOmega
cut - lowest value to be printed
Beps is the same as in darkOmega
prcnt - if non-zero, then the output will be in percentages
file - file where to print this information or stdout to print to the output screen 


Calculating the spectrums of photons, positrons, anti-protons and neutrinos is easily possible with the calcSpectrum command. However note that the command uses pre-built tables from pythia hadronizations to get the final spectra based on relative contributions from different channels. AFAIK a newer version for spectrum calculation is on the way, but as of the writing of this document was not yet available in MicroMegas.

v - relative velocity in natural units (e.g. 0.001 in our galaxy ~300km/s)
outP - particle for which the spectrum is calculated (0,1,2,3,4,5 e.g. gamma,e+,p-,nu_e,nu_mu,nu_tau)
tab - array of doubles which contains 250 elements, essentially defined as double tab[250];
err - pointer to an int which will be 0 if everything was ok
The function itself returns the relative cross section <sigma v>

The spectrum you can then use for what ever reasons you need. The most likely use is to propagate it with GalProp and for that you first need to save the spectrum to a file, which can be done using the following function:

tab - the array with the spectrum from calcSpectrum function
fname - filename, where to write
mess - string that describes the spectrum
Xmin - minimal energy to consider in the units of E/M_LOP
N - number of points (<300)

If you want to use the spectrum directly during code execution, then you can use zInterp(x,tab) function where x=log(E/M) that you want and tab is the spectrum. The result is dN/dx where N is the number of particles.

Cross sections and relative contributions of different channels

Although MicroMegas supports also cross section calculations they aren't trivial. More comprehensive information is availabel in MicroMegas documentation as referenced above. The one situation that I was interested in is calculation of the relative cross sections of the final annihilation channels based on the current model parameters inside the program. One can do that based on an example given in the sample MSSM code. I'll give an altered example with descriptions below:

  numout* cc; // variable pointing to the compiled library
  double Pcm;   // Center of mass energy
  cc=newProcess("","omg__t_si__t_si");  // Start using the pre-compiled library, you have to look 
               // up the name in work/so_generated/ folder e.g. work/so_generated/omg__t_si__t_si.so
  if(cc)   // If the library is available
  { int ntot,l;
    char * name[4];
    double mass[4];
    procInfo1(cc,&ntot,NULL,NULL);  // ntot is filled with number of sub-processes available
    for(l=1;l<=ntot; l++)  // iterate over all subprocesses
    { int err;
      double cs;
      procInfo2(cc,l,name,mass);  // Fills an array of particle names and masses for that particular sub-process
      if(l==1) { Pcm=mass[0]*v/2; printf("(Pcm=%.2E)\n",Pcm);}  
                  // Just some printout for the first sub-process. The particle in slot 0 is always the LOP
      printf("%3s,%3s -> %3s %3s  ",name[0],name[1],name[2],name[3]); // Print the actual process
      cs= cs22(cc,l,Pcm,-1.,1.,&err);  
                // Calculate the cross section using the library in cc, subprocess l, c.m.s energy Pcm.
                // -1 .. 1 in cos(theta) phase space e.g. all
      if(err) printf("Error\n");  // If there is an error just say so
      else if(cs==0.) printf("Zero\n");  // If the cross setion comes out zero print Zero
      else printf("%.2E [pb] ( sigma*v=%.2E [cm^3/sec] )   \n",cs, cs*v*2.9979E-26); 
           // Print out the cross section in natural units as well as units of cm^3/s

an example output of that code snippet:

~Si,~Si ->   H   H  2.85E+02 [pb] ( sigma*v=1.71E-26 [cm^3/sec] )   
~Si,~Si ->   w   W  2.57E+01 [pb] ( sigma*v=1.54E-27 [cm^3/sec] )   
~Si,~Si ->   Z   Z  2.11E+01 [pb] ( sigma*v=1.26E-27 [cm^3/sec] )   
~Si,~Si ->   b   B  7.62E-01 [pb] ( sigma*v=4.57E-29 [cm^3/sec] )   
~Si,~Si ->   t   T  1.87E+01 [pb] ( sigma*v=1.12E-27 [cm^3/sec] )   
~Si,~Si ->   c   C  6.96E-02 [pb] ( sigma*v=4.17E-30 [cm^3/sec] )   
~Si,~Si ->  ta  TA  3.63E-02 [pb] ( sigma*v=2.18E-30 [cm^3/sec] )   

GalProp usage

edit · history · print
Page last modified on January 27, 2009, at 08:35 AM