Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RateBD0starLepNu.cc
Go to the documentation of this file.
1 ///
2 /// @file RateBD0starLepNu.cc
3 /// @brief \f$ B \rightarrow D_0^* \tau\nu \f$ total rate
4 ///
5 
6 //**** This file is a part of the HAMMER library
7 //**** Copyright (C) 2016 - 2020 The HAMMER Collaboration
8 //**** HAMMER is licensed under version 3 of the GPL; see COPYING for details
9 //**** Please note the MCnet academic guidelines; see GUIDELINES for details
10 
11 // -*- C++ -*-
12 #include <cmath>
14 #include "Hammer/IndexLabels.hh"
15 #include "Hammer/Math/Constants.hh"
17 #include "Hammer/Particle.hh"
18 #include "Hammer/Tools/Pdg.hh"
19 
20 using namespace std;
21 
22 namespace Hammer {
23 
24  namespace MD = MultiDimensional;
25 
26  RateBD0starLepNu::RateBD0starLepNu() {
27  //Create tensor rank and dimensions
28  vector<IndexType> dims{{11, 4, 11, 4, _nPoints}};
29  string name {"RateBD0starLepNuQ2"};
30  auto& pdg = PID::instance();
31  addProcessSignature(PID::BPLUS,{-PID::DSSD0STAR,PID::NU_TAU,PID::ANTITAU});
32  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::ANTITAU), pdg.getMass(PID::BPLUS)-pdg.getMass(PID::DSSD0STAR))});
34 
35  addProcessSignature(PID::BZERO,{PID::DSSD0STARMINUS,PID::NU_TAU,PID::ANTITAU});
36  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::ANTITAU), pdg.getMass(PID::BZERO)-pdg.getMass(PID::DSSD0STARMINUS))});
38 
39  addProcessSignature(PID::BPLUS,{-PID::DSSD0STAR,PID::NU_MU,PID::ANTIMUON});
40  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::ANTIMUON), pdg.getMass(PID::BPLUS)-pdg.getMass(PID::DSSD0STAR))});
42 
43  addProcessSignature(PID::BZERO,{PID::DSSD0STARMINUS,PID::NU_MU,PID::ANTIMUON});
44  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::ANTIMUON), pdg.getMass(PID::BZERO)-pdg.getMass(PID::DSSD0STARMINUS))});
46 
47  addProcessSignature(PID::BPLUS,{-PID::DSSD0STAR,PID::NU_E,PID::POSITRON});
48  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::POSITRON), pdg.getMass(PID::BPLUS)-pdg.getMass(PID::DSSD0STAR))});
50 
51  addProcessSignature(PID::BZERO,{PID::DSSD0STARMINUS,PID::NU_E,PID::POSITRON});
52  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::POSITRON), pdg.getMass(PID::BZERO)-pdg.getMass(PID::DSSD0STARMINUS))});
54 
55  //bs -> cs
56  addProcessSignature(PID::BS,{PID::DSSDS0STARMINUS,PID::NU_TAU,PID::ANTITAU});
57  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::ANTITAU), pdg.getMass(PID::BS)-pdg.getMass(PID::DSSDS0STARMINUS))});
59 
60  addProcessSignature(PID::BS,{PID::DSSDS0STARMINUS,PID::NU_MU,PID::ANTIMUON});
61  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::ANTIMUON), pdg.getMass(PID::BS)-pdg.getMass(PID::DSSDS0STARMINUS))});
63 
64  addProcessSignature(PID::BS,{PID::DSSDS0STARMINUS,PID::NU_E,PID::POSITRON});
65  addIntegrationBoundaries({PS::makeQ2Function(pdg.getMass(PID::POSITRON), pdg.getMass(PID::BS)-pdg.getMass(PID::DSSDS0STARMINUS))});
67 
68  setSignatureIndex();
69  }
70 
71  Tensor RateBD0starLepNu::evalAtPSPoint(const vector<double>& point) {
72  auto labs = getTensor().labels();
73  labs.pop_back();
74  auto dimensions = getTensor().dims();
75  dimensions.pop_back();
76  Tensor result{"RateBD0starLepNu", MD::makeEmptySparse(dimensions, labs)};
77 
78  const double Mb = masses()[0];
79  const double Mc = masses()[1];
80  const double Mt = masses()[3];
81  const double Mb2 = Mb*Mb;
82  const double Mc2 = Mc*Mc;
83  const double Mt2 = Mt*Mt;
84 
85  //kinematic objects
86  const double Sqq = point[0];
87  // const double Sqq2 = Sqq*Sqq;
88  const double mSqq = Sqq/Mb2;
89  const double w = (Mb2 + Mc2 - Sqq)/(2 * Mb * Mc);
90  const double rC = Mc/Mb;
91  const double rt = Mt/Mb;
92 
93  const double mSqqSq = mSqq*mSqq;
94  const double wSq = w*w;
95  const double rtSq = rt*rt;
96  const double rCSq = rC*rC;
97  const double rCp1Sq = (rC + 1.)*(rC + 1.);
98  const double rCm1Sq = (rC - 1.)*(rC - 1.);
99  // const double wp1Sq = (w + 1.)*(w + 1.);
100  // const double wm1Sq = (w - 1.)*(w - 1.);
101  // const double wSqm1Sq = (wSq - 1.)*(wSq - 1.);
102  // const double wp1Cu = wp1Sq*(w + 1.);
103  // const double wm1Cu = wm1Sq*(w - 1.);
104  // const double wSqm1Cu = wSqm1Sq*(wSq - 1.);
105 
106  double RateNorm = (GFermi*GFermi*Mb2*Mc*rCSq*(-Mt2 + Sqq)*(1 + rCSq - rtSq - 2*rC*w)*sqrt(w*w - 1.))/(16.*pow(pi,3.)*(1 + rCSq - 2*rC*w));
107 
108  //set non-zero tensor elements
109  result.element({0,1,0,1}) = ((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
110  result.element({0,1,0,2}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
111  result.element({0,1,1,0}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
112  result.element({0,1,3,0}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
113  result.element({0,1,5,1}) = -((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
114  result.element({0,1,5,2}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
115  result.element({0,1,7,1}) = ((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
116  result.element({0,1,7,2}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
117  result.element({0,1,9,3}) = (-2*(1 + rC)*rt*(-1 + wSq))/mSqq;
118  result.element({0,2,0,1}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
119  result.element({0,2,0,2}) = ((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
120  result.element({0,2,1,0}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
121  result.element({0,2,3,0}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
122  result.element({0,2,5,1}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
123  result.element({0,2,5,2}) = -((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
124  result.element({0,2,7,1}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
125  result.element({0,2,7,2}) = ((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
126  result.element({0,2,9,3}) = (-2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
127  result.element({1,0,0,1}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
128  result.element({1,0,0,2}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
129  result.element({1,0,1,0}) = 0.5;
130  result.element({1,0,3,0}) = -0.5;
131  result.element({1,0,5,1}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
132  result.element({1,0,5,2}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
133  result.element({1,0,7,1}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
134  result.element({1,0,7,2}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
135  result.element({2,0,2,0}) = 0.5;
136  result.element({2,0,4,0}) = -0.5;
137  result.element({2,0,6,1}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
138  result.element({2,0,6,2}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
139  result.element({2,0,8,1}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
140  result.element({2,0,8,2}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
141  result.element({3,0,0,1}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
142  result.element({3,0,0,2}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
143  result.element({3,0,1,0}) = -0.5;
144  result.element({3,0,3,0}) = 0.5;
145  result.element({3,0,5,1}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
146  result.element({3,0,5,2}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
147  result.element({3,0,7,1}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
148  result.element({3,0,7,2}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
149  result.element({4,0,2,0}) = -0.5;
150  result.element({4,0,4,0}) = 0.5;
151  result.element({4,0,6,1}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
152  result.element({4,0,6,2}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
153  result.element({4,0,8,1}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
154  result.element({4,0,8,2}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
155  result.element({5,1,0,1}) = -((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
156  result.element({5,1,0,2}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
157  result.element({5,1,1,0}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
158  result.element({5,1,3,0}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
159  result.element({5,1,5,1}) = ((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
160  result.element({5,1,5,2}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
161  result.element({5,1,7,1}) = -((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
162  result.element({5,1,7,2}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
163  result.element({5,1,9,3}) = (2*(1 + rC)*rt*(-1 + wSq))/mSqq;
164  result.element({5,2,0,1}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
165  result.element({5,2,0,2}) = -((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
166  result.element({5,2,1,0}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
167  result.element({5,2,3,0}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
168  result.element({5,2,5,1}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
169  result.element({5,2,5,2}) = ((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
170  result.element({5,2,7,1}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
171  result.element({5,2,7,2}) = -((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
172  result.element({5,2,9,3}) = (2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
173  result.element({6,1,2,0}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
174  result.element({6,1,4,0}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
175  result.element({6,1,6,1}) = ((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
176  result.element({6,1,6,2}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
177  result.element({6,1,8,1}) = -((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
178  result.element({6,1,8,2}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
179  result.element({6,1,10,3}) = (-2*(1 + rC)*rt*(-1 + wSq))/mSqq;
180  result.element({6,2,2,0}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
181  result.element({6,2,4,0}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
182  result.element({6,2,6,1}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
183  result.element({6,2,6,2}) = ((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
184  result.element({6,2,8,1}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
185  result.element({6,2,8,2}) = -((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
186  result.element({6,2,10,3}) = (-2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
187  result.element({7,1,0,1}) = ((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
188  result.element({7,1,0,2}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
189  result.element({7,1,1,0}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
190  result.element({7,1,3,0}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
191  result.element({7,1,5,1}) = -((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
192  result.element({7,1,5,2}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
193  result.element({7,1,7,1}) = ((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
194  result.element({7,1,7,2}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
195  result.element({7,1,9,3}) = (-2*(1 + rC)*rt*(-1 + wSq))/mSqq;
196  result.element({7,2,0,1}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
197  result.element({7,2,0,2}) = ((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
198  result.element({7,2,1,0}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
199  result.element({7,2,3,0}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
200  result.element({7,2,5,1}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
201  result.element({7,2,5,2}) = -((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
202  result.element({7,2,7,1}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
203  result.element({7,2,7,2}) = ((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
204  result.element({7,2,9,3}) = (-2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
205  result.element({8,1,2,0}) = ((-1 + rC)*rt*(1 + w))/(2.*mSqq);
206  result.element({8,1,4,0}) = -((-1 + rC)*rt*(1 + w))/(2.*mSqq);
207  result.element({8,1,6,1}) = -((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
208  result.element({8,1,6,2}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
209  result.element({8,1,8,1}) = ((1 + w)*(mSqq*rCp1Sq*(-1 + w) + rtSq*(1 + 2*w - 2*rC*(2 + w) + rCSq*(1 + 2*w))))/(3.*mSqqSq);
210  result.element({8,1,8,2}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
211  result.element({8,1,10,3}) = (2*(1 + rC)*rt*(-1 + wSq))/mSqq;
212  result.element({8,2,2,0}) = ((1 + rC)*rt*(-1 + w))/(2.*mSqq);
213  result.element({8,2,4,0}) = -((1 + rC)*rt*(-1 + w))/(2.*mSqq);
214  result.element({8,2,6,1}) = -((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
215  result.element({8,2,6,2}) = -((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
216  result.element({8,2,8,1}) = ((-1 + rCSq)*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqqSq);
217  result.element({8,2,8,2}) = ((-1 + w)*(mSqq*rCm1Sq*(1 + w) + rtSq*(-1 + 2*rC*(-2 + w) + 2*w + rCSq*(-1 + 2*w))))/(3.*mSqqSq);
218  result.element({8,2,10,3}) = (2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
219  result.element({9,3,0,1}) = (-2*(1 + rC)*rt*(-1 + wSq))/mSqq;
220  result.element({9,3,0,2}) = (-2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
221  result.element({9,3,5,1}) = (2*(1 + rC)*rt*(-1 + wSq))/mSqq;
222  result.element({9,3,5,2}) = (2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
223  result.element({9,3,7,1}) = (-2*(1 + rC)*rt*(-1 + wSq))/mSqq;
224  result.element({9,3,7,2}) = (-2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
225  result.element({9,3,9,3}) = (8*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqq);
226  result.element({10,3,6,1}) = (-2*(1 + rC)*rt*(-1 + wSq))/mSqq;
227  result.element({10,3,6,2}) = (-2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
228  result.element({10,3,8,1}) = (2*(1 + rC)*rt*(-1 + wSq))/mSqq;
229  result.element({10,3,8,2}) = (2*(-1 + rC)*rt*(-1 + wSq))/mSqq;
230  result.element({10,3,10,3}) = (8*(mSqq + 2*rtSq)*(-1 + wSq))/(3.*mSqq);
231 
232  result*=(RateNorm);
233 
234  return result;
235 
236  }
237 
238 }
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
LabelsList labels() const
get the labels of all the indices at once
Definition: Tensor.cc:83
static constexpr double GFermi
Definition: Constants.hh:29
Tensor indices label definitions.
Sparse tensor data container.
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
Various numerical constants.
Hammer particle data class.
BoundaryFunction makeQ2Function(double qmin, double qmax)
Definition: RateBase.hh:122
Hammer particle class.
static constexpr double pi
Definition: Constants.hh:21