wimpydd is hosted by Hepforge, IPPP Durham

Following Haxton and group it is possible to factorize WIMP and nuclear physics:

\[\frac{1}{2j_\chi+1}\frac{1}{2j_T+1}|\mathcal{M}|^2=\frac{4\pi}{2j_T+1}\sum_{\tau =0,1}\sum_{\tau^\prime =0,1}\sum_k R^{\tau\tau^\prime}_k W^{\tau\tau^\prime}_{Tk}\]

where \(j_\chi, j_T\) are WIMP and nuclear target spins respectively. The WIMP response functions are denoted by \( R^{\tau\tau^\prime}_k\) while the nuclear response functions are represented as \(W^{\tau\tau^\prime}_{Tk}\). Assumming nuclear ground state to be a \(CP\) eigenstate gives rise to the following nuclear response functions: \(k= M, \Sigma^{\prime\prime}, \Sigma^\prime, \Phi^{\prime\prime}, \Phi^{\prime\prime} M, \tilde \Phi^\prime, \Delta, \Delta \Sigma^\prime\).

Nuclear Response function

There are 30 nuclear response functions have been implemented in WimPyDD including different isotopes of various targets:

 C, 19F, 23Na, 28Si, 70Ge, 72Ge, 73Ge, 74Ge, 76Ge, 127I
 128Xe, 129Xe, 130Xe, 131Xe, 132Xe, 134Xe, 136Xe, 16O, 40Ar, 40Ca
 128Xe, 129Xe, 130Xe, 131Xe, 132Xe, 134Xe, 136Xe, 16O, 40Ar, 40Ca
 H, 3He, 4He, 14N, 20Ne, 24Mg, 27Al, 32S, 56Fe, 59Ni

Upon instantiation the element object acquires the method func_w, an array that contains a function func_w_default(q) for each isotope of the element. Before moving to the examples of nuclear response functions, the first step is to import WimPyDD:

 >>> import WimPyDD as WD 

Now the user can define an element:

 >>> ni=WD.element('ni')

The nuclear response function is an attribute of the class element so user can access it following:

 >>> ni.func_w
     array([<\function define_w..func_w_default at 0x120e60790>,
     <\function define_w.<\locals>.func_w_default at 0x120e60700>,
     <\function define_w.<\locals>.func_w_default at 0x120e60670>,
     <\function define_w.<\locals>.func_w_default at 0x120e605e0>,
     <\function define_w.<\locals>.func_w_default at 0x120e60550>,
     <\function define_w.<\locals>.func_w_default at 0x120e604c0>],

which gives an array of nuclear response functions corresponding to the isotopes of the considered element which is 6 in the case of Nickel (\({}^{58}\)Ni, \({}^{59}\)Ni, \({}^{60}\)Ni, \({}^{61}\)Ni, \({}^{62}\)Ni, \({}^{64}\)Ni). Now the user can access different nuclear response functions by following:

 >>> ni.func_w[1](0.001)
     array([[[ 2.76974325e+02, -1.40831795e+01],
            [-1.40831795e+01,  7.16079175e-01]], 

            [[ 4.32402314e-02, -4.31357437e-02],
            [-4.31357437e-02,  4.30315559e-02]],

            [[ 8.64770873e-02, -8.62681258e-02],
            [-8.62681258e-02,  8.60596642e-02]],

            [[ 2.29030771e+01, -1.39462465e+00],
            [-1.39462465e+00,  9.23353467e-02]],

            [[ 1.29157709e-02, -1.27681600e-02],
            [-1.27681600e-02,  1.26222473e-02]],

            [[ 2.23458314e-02, -2.20597592e-02],
            [-2.20597592e-02,  2.17774866e-02]],

            [[-7.96316503e+01,  4.04898547e+00],
            [ 4.82118321e+00, -2.45139687e-01]],

            [[-4.39590258e-02,  4.38528413e-02],
            [ 4.33964023e-02, -4.32915176e-02]]])

Inside WimPyDD the nuclear response functions structure is defined as:


where isotopes is the isotopes of the considered element, q is the transfered momentum, tau, tau_prime=0,1 are the isospins. The user can access different nuclear response functins \(k= M, \Sigma^{\prime\prime}, \Sigma^\prime, \Phi^{\prime\prime}, \Phi^{\prime\prime} M, \tilde \Phi^\prime, \Delta, \Delta \Sigma^\prime\) by using the index k order as: \[0=M, 1=\Sigma^{\prime\prime}, 2=\Sigma^\prime, 3=\Phi^{\prime\prime}, 4=\tilde \Phi^\prime, 5=\Delta, 6=\Phi^{\prime\prime} M, 7=\Delta \Sigma^\prime\] Each \(2\times 2\) matrix represents \(W^{\tau\tau^\prime}_{Tk}\) with \(\tau=0,1\), \(\tau^\prime=0,1\) two isospin indices. So the user can directly find the \(2\times 2\) matrix for a particular response function, for example in the case of \({}^{59}\)Ni, and \(\Delta \Sigma^\prime\) nuclear response function:

 >>> ni.func_w[1](0.001)[7] 
     array([[-0.04395903,  0.04385284], 
            [0.0433964 , -0.04329152]])

The information about nuclear response functions for different targets is stored in:


It is important to mention that the user can customize the definition of nuclear response function by adding a file in the same Nuclear_response_functions directory such as:


with isotope_name one of the entries of the element.isotopes attribute. For instance, for Tungsten:

 >>> tungsten=WD.element('W')
 >>> tungsten.isotopes
     array(['180W', '182W', '183W', '184W', '186W'])

The nuclear response functions for 183W can be implemented by adding the file:


to the folder WimPyDD/Targets/Nuclear_response_functions.

WIMP Response function

WIMP response function is an attribute of the class Experiment. Once an experiment is defined, the user can load/calculate these response functions using the prescribed EFT Hamiltonian, for example:

 >>> pico60=WD.experiment(name='pico60_2019')
 >>> c1=WD.eft_hamiltonian('c1',{1: lambda cp=1,cn=1: np.array([cp+cn, cp-cn])})
 >>> WD.load_response_functions(pico60,c1,j_chi=0.0)

loads/calculates WIMP response functions for PICO60 experiment and \(\mathcal{O}_1\) interaction. It stores the response function information inside dictionary exp_obj.response_functions= {(hamiltonian_obj,j_chi):r} for example the user can found WIMP responses functions using:

 >>> pico60.response_functions[(c1,0.0)]

for spin-0 WIMP and \(\mathcal{O}_1\) intercation. The same tables are also saved in the folder:


For saved response functions, the array:


contains a sampling of recoil energy values in keV and the following array:


contains the corresponding tabulated integrated response function. The structure of the saved WIMP response functions can be summarized as:

  • n_cicj=0,...,len(hamiltonian.coeff_squared_list)-1 (couplings product)
  • n_vel=0,1,2,3 for 4 integrated response functions based on velocity depedence. The response functions correspond to v=1,2 are related to the inelastic scattering.
  • tau=0,1 (nuclear isospin)
  • tau_prime=0,1 (nuclear isospin)
  • n_bin=0,...,len(exp.data)-1 (energy bin)-1
  • n_element=0,...,len(exp.target.element)-1 (element in target)
  • n_isotope=1,...,len(exp.target.element[n_element]) (isotope of element)

The interested user should look into WimPyDD Documentation for more details.