gambit is hosted by Hepforge, IPPP Durham
GAMBIT  v1.5.0-2191-ga4742ac
a Global And Modular Bsm Inference Tool
SpecBit_tests.cpp
Go to the documentation of this file.
1 // GAMBIT: Global and Modular BSM Inference Tool
2 // *********************************************
22 
23 #include <string>
24 #include <sstream>
25 #include <cmath>
26 
30 
31 #include "SLHAea/slhaea.h"
32 #include <boost/preprocessor/tuple/to_seq.hpp>
33 #include <boost/preprocessor/seq/for_each.hpp>
34 #include <boost/preprocessor/seq/elem.hpp>
35 #include <boost/preprocessor/seq/for_each_product.hpp>
36 
38 
39 // MAtrix macros were super slow to compile, have now removed them.
40 
41 namespace Gambit
42 {
43 
44  namespace SpecBit
45  {
46 
47  using namespace std;
48  using namespace LogTags;
49 
50  // Helper function to add error information to report
51  void add_error(std::ostringstream& out, const std::exception& e, const std::string& msg)
52  {
53  out << "------------------------------" << std::endl;
54  out << "TEST FAIL: " << msg << std::endl;
55  out << "Exception thrown was: "<<e.what()<<std::endl;
56  return;
57  }
58 
59  // Test function for Matematica
60  void Math_test(bool &result)
61  {
62  namespace myPipe = Pipes::Math_test;
63 
64  int input1 = 3, input2 = 4;
65 
66  int output= myPipe::BEreq::MathTest(input1,input2);
67  cout << "Testing Mathematica" << endl;
68  cout << "Result : " << output << endl;
69 
70 
71  result = true;
72 
73  }
74 
75  void SUSYHD_test(bool &result)
76  {
77  using namespace Pipes::SUSYHD_test;
78 
79  const triplet<double> &mh = *Dep::prec_mh;
80 
81  cout << "mh = " << mh.central << " + " << mh.upper << " - " << mh.lower << endl;
82 
83  if(!mh.central) result = false;
84  else result = true;
85 
86  return ;
87  }
88 
89  // Testing function for SPheno
90  void SPheno_MSSM_test(bool &result)
91  {
92  namespace myPipe = Pipes::SPheno_MSSM_test;
93  const Spectrum& fullspectrum = *myPipe::Dep::unimproved_MSSM_spectrum;
94 
95  std::cout << fullspectrum.getSLHAea(2) << std::endl;
96 
97  result = 0;
98  }
99 
102  void MSSMspectrum_test (bool &result)
103  {
104 
105  // Retrieve pointer to Spectrum object, delivered by dependency resolver
106  // Module function asks for Spectrum* with capability unimproved_MSSM_spectrum.
107  namespace myPipe = Pipes::MSSMspectrum_test;
108  const Spectrum& fullspectrum = *myPipe::Dep::unimproved_MSSM_spectrum;
109  const SubSpectrum& spec = fullspectrum.get_HE(); // MSSMSpec SubSpectrum object
110  const SubSpectrum& SM = fullspectrum.get_LE(); // QedQcdWrapper SubSpectrum object
111 
112  using namespace Par; // Bring parameter tags into scope
113 
114  std::ostringstream report; // Information about any problems encountered
115 
116  // Extract SLHAea object
117  // This copies the data out. Could possibly change it to pass out a
118  // reference instead, or have another function to do that.
119  SLHAea::Coll slhaea = fullspectrum.getSLHAea(2);
120  // for testing, write this to file
121  std::ofstream out1;
122  out1.open("SpecBit/MSSMspectrum_test.slha");
123  out1 << slhaea;
124  out1.close();
125 
126  // SLHAea::Coll slhaea = spec.getSLHAea(2); // The above is just a wrapper for this.
127 
128  // If this is a valid model point, return true and dump information, else false
129 
130  // SLHAea objects behave mostly like maps, but with special kinds of keys. For
131  // "at" and "operator[]", it does automatic conversion, but for "find" it does
132  // not, so we have to manually do it.
133  SLHAea::Block spinfo = slhaea.at("SPINFO");
134  //std::vector<std::string> k3(1, "3");
135  std::vector<std::string> k4(1, "4");
136 
137  // See if error code entries exist
138  //if(spinfo.find(k3) == spinfo.end() and spinfo.find(k4) == spinfo.end())
139  if(spinfo.find(k4) == spinfo.end())
140  {
141  std::cout << "Good spectrum found! Inspecting contents..." << std::endl;
142  std::cout << std::endl << slhaea << std::endl;
143 
144  // Write to file so we can check it
145  spec.writeSLHAfile(2, "SpecBit/MSSMspectrum_test_good.slha");
146 
147  // ---------------------------------------------------------
148  // BEGIN DEMO OF SPECTRUM OBJECT AND PARTICLE DATABASE
149  // ---------------------------------------------------------
150 
151  #define ECHO(COMMAND) \
152  { \
153  try { \
154  cout << " " << STRINGIFY(COMMAND) << " = " << COMMAND << endl;\
155  } \
156  catch (const std::exception& e) \
157  { add_error(report,e,STRINGIFY(COMMAND)); } \
158  }
159 
160  /* ----------Test particle database access ---------------- */
161  const auto& PDB = Models::ParticleDB();
162 
163  // First check out what is actually in the database
164  PDB.check_contents();
165 
166  // Demo a couple of particle name retrievals
167  cout<<endl;
168  cout<<"Demo retrieval of lightest neutralino info from particle database"<<endl;
169  cout<<"-----------------------------------------------------------------"<<endl;
170  ECHO( PDB.pdg_pair("~chi0_1") ) // Input long name, retrieve PDG code + context integer
171  ECHO( PDB.pdg_pair("~chi0",1) ) // Input short name + index, retrieve PDG code + context integer
172  ECHO( PDB.long_name("~chi0",1) ) // Input short name + index, retrieve long name
173  ECHO( PDB.long_name(std::make_pair(1000022,0)) ) // Input PDG code + context integer, retrieve long name
174  ECHO( PDB.long_name(1000022,0) ) // Input PDG code + context integer, retrieve long name
175  ECHO( PDB.short_name_pair("~chi0_1") ) // Input long name, retrieve short name + index
176  ECHO( PDB.short_name_pair(std::make_pair(1000022,0)) ) // Input PDG code plus context integer, retrieve short name + index
177  ECHO( PDB.short_name_pair(1000022,0) ) // Input PDG code plus context integer, retrieve short name + index
178 
179  cout<<endl;
180  cout<<"Demo retrieval of antiparticle names/codes using particle names/codes"<<endl;
181  cout<<"-----------------------------------------------------------------"<<endl;
182  // Check existence in various ways
183  ECHO( PDB.has_antiparticle("~chi0_1") )
184  ECHO( PDB.has_antiparticle("~chi0",1) )
185  ECHO( PDB.has_antiparticle(std::make_pair("~chi0",1)) )
186  ECHO( PDB.has_antiparticle(1000022,0) )
187  ECHO( PDB.has_antiparticle(std::make_pair(1000022,0)) )
188  ECHO( PDB.get_antiparticle("~chi0_1") ) // Input long name, retrieve antiparticle long name
189  ECHO( PDB.get_antiparticle("~chi0",1) ) // Input short name + index, retrieve antiparticle short name + index
190  ECHO( PDB.get_antiparticle(std::make_pair("~chi0",1)) ) // Input short name + index, retrieve antiparticle short name + index
191  ECHO( PDB.get_antiparticle(1000022,0) ) // Input PDG code + context integet, retrieve antiparticle PDG code + context integer
192  ECHO( PDB.get_antiparticle(std::make_pair(1000022,0)) ) // Input PDG code + context integet, retrieve antiparticle PDG code + context integer
193  ECHO( PDB.has_antiparticle("~chi+_1") )
194  ECHO( PDB.has_antiparticle("~chi+",1) )
195  ECHO( PDB.has_antiparticle(std::make_pair("~chi+",1)) )
196  ECHO( PDB.has_antiparticle(1000024,0) )
197  ECHO( PDB.has_antiparticle(std::make_pair(1000024,0)) )
198  ECHO( PDB.get_antiparticle("~chi+_1") ) // Input long name, retrieve antiparticle long name
199  ECHO( PDB.get_antiparticle("~chi+",1) ) // Input short name + index, retrieve antiparticle short name + index
200  ECHO( PDB.get_antiparticle(std::make_pair("~chi+",1)) ) // Input short name + index, retrieve antiparticle short name + index
201  ECHO( PDB.get_antiparticle(1000024,0) ) // Input PDG code + context integet, retrieve antiparticle PDG code + context integer
202  ECHO( PDB.get_antiparticle(std::make_pair(1000024,0)) ) // Input PDG code + context integet, retrieve antiparticle PDG code + context integer
203  ECHO( PDB.has_antiparticle("u_1") )
204  ECHO( PDB.has_antiparticle("u",1) )
205  ECHO( PDB.has_antiparticle(std::make_pair("u",1)) )
206  ECHO( PDB.has_antiparticle(2,0) )
207  ECHO( PDB.has_antiparticle(std::make_pair(2,0)) )
208  ECHO( PDB.get_antiparticle("u_1") ) // Input long name, retrieve antiparticle long name
209  ECHO( PDB.get_antiparticle("u",1) ) // Input short name + index, retrieve antiparticle short name + index
210  ECHO( PDB.get_antiparticle(std::make_pair("u",1)) ) // Input short name + index, retrieve antiparticle short name + index
211  ECHO( PDB.get_antiparticle(2,0) ) // Input PDG code + context integet, retrieve antiparticle PDG code + context integer
212  ECHO( PDB.get_antiparticle(std::make_pair(2,0)) ) // Input PDG code + context integet, retrieve antiparticle PDG code + context integer
213 
214 
215  cout<<endl;
216  cout<<"Demo retrieval when no short name exists"<<endl;
217  cout<<"-----------------------------------------------------------------"<<endl;
218  ECHO( PDB.pdg_pair("H+") )
219  //ECHO( PDB.pdg_pair("H+",1) ) // Error!
220  //ECHO( PDB.long_name("H+",1) ) // Error!
221  ECHO( PDB.long_name(std::make_pair(37,0)) )
222  ECHO( PDB.long_name(37,0) )
223  //ECHO( PDB.short_name_pair("H+") ) // Error!
224  //ECHO( PDB.short_name_pair(std::make_pair(37,0)) ) // Error!
225  //ECHO( PDB.short_name_pair(37,0) ) // Error!
226  //ECHO( PDB.short_name_pair(37) ) // Error!
227  cout<<endl;
228  /* ----------------- Pole masses --------------------------- */
229 
230  cout<<"Begin demo retrievals from Spectrum and SubSpectrum objects"<<endl;
231  cout<<"-----------------------------------------------------------------"<<endl;
232  cout<<endl;
233  cout<<"First, general methods for accessing different sorts of information."<<endl;
234  cout<<endl;
235  // At the moment it is only pole masses which have getters overloaded to use
236  // the particle database information. It is only the MASS block in the
237  // spectrum generator output SLHA files which use PDG numbers anyway, so I
238  // think this makes sense.
239  cout<<"Lightest neutral Higgs boson pole mass:"<<endl;
240  ECHO( fullspectrum.get(Pole_Mass, PDB.short_name_pair(25,0) ) )
241  ECHO( fullspectrum.get(Pole_Mass, PDB.long_name(25,0) ) )
242  ECHO( fullspectrum.get(Pole_Mass,25,0) )
243  ECHO( fullspectrum.get(Pole_Mass, PDB.pdg_pair("h0",1) ) )
244  ECHO( fullspectrum.get(Pole_Mass,"h0",1) )
245  ECHO( fullspectrum.get(Pole_Mass,"h0_1") )
246 
247  ECHO( spec.get(Pole_Mass, PDB.short_name_pair(25,0) ) )
248  ECHO( spec.get(Pole_Mass, PDB.long_name(25,0) ) )
249  ECHO( spec.get(Pole_Mass,25,0) )
250  ECHO( spec.get(Pole_Mass, PDB.pdg_pair("h0",1) ) )
251  ECHO( spec.get(Pole_Mass,"h0",1) )
252  ECHO( spec.get(Pole_Mass,"h0_1") )
253 
254  cout<<endl;
255  cout<<"Retrieval of Spectrum object contents, with"<<endl;
256  cout<<"correspondence to SLHAea object entries"<<endl;
257  cout<<"-----------------------------------------------------------------"<<endl;
258 
259  // MZ was a bad first example; it is empty unless you switch on the SM pole mass
260  // calculator for flexiblesusy. We do not yet pass any input value of MZ though
261  // Similar issues with other gauge boson masses. So don't use these yet or
262  // you'll get zero for all these masses.
263  cout<<endl;
264  cout<<"Gauge boson pole masses:"<<endl;
265  cout<<endl;
266  ECHO( fullspectrum.get(Par::Pole_Mass,"Z0") )
267  ECHO( SM.get(Par::Pole_Mass,"Z0") )
268  ECHO( slhaea.at("SMINPUTS").at(4).at(1) )
269  cout<<endl;
270  ECHO( fullspectrum.get(Par::Pole_Mass,"gamma") )
271  ECHO( SM.get(Par::Pole_Mass,"gamma") )
272  cout<<" ***Not in slha***"<<endl;
273  cout<<endl;
274  ECHO( fullspectrum.get(Par::Pole_Mass,"W+") )
275  ECHO( SM.get(Par::Pole_Mass,"W+") )
276  ECHO( slhaea.at("MASS").at(24).at(1) )
277  cout<<endl;
278  ECHO( fullspectrum.get(Par::Pole_Mass,"g") )
279  ECHO( SM.get(Par::Pole_Mass,"g") )
280  cout<<" ***Not in slha***"<<endl;
281  cout<<endl;
282  cout<<"Quark pole masses (actually the slha entries are MSbar except the top mass):"<<endl;
283  cout<<endl;
284  // I'm a little unclear on what the pole masses for the lighter quarks mean, since I thought
285  // that non-perturbative effects made definining them difficult... well anyway will have
286  // to ask Peter what is being computed here.
287 
288  //ECHO( spec.get(Par::Pole_Mass,"u",1) ) // i.e. up (mass eigenstate)
289  cout<<" ***u Pole mass not well defined***"<<endl;
290  ECHO( slhaea.at("SMINPUTS").at(22).at(1) ) // mu(2 GeV)^MS-bar, not pole mass
291  cout<<endl;
292  //ECHO( spec.get(Par::Pole_Mass,"u",2) ) // i.e. charm
293  cout<<" ***c Pole mass not well defined***"<<endl;
294  ECHO( slhaea.at("SMINPUTS").at(24).at(1) ) // mc(mc)^MS-bar, not pole mass
295  cout<<endl;
296  //ECHO( spec.get(Par::Pole_Mass,"u",3) ) // i.e. top
297  ECHO( fullspectrum.get(Par::Pole_Mass,"t") )
298  ECHO( SM.get(Par::Pole_Mass,"u",3) ) // i.e. top
299  ECHO( slhaea.at("SMINPUTS").at(6).at(1) )
300  cout<<endl;
301  //ECHO( spec.get(Par::Pole_Mass,"d",1) ) // i.e. down
302  cout<<" ***d Pole mass not well defined***"<<endl;
303  ECHO( slhaea.at("SMINPUTS").at(21).at(1) ) // md(2 GeV)^MS-bar, not pole mass
304  cout<<endl;
305  //ECHO( spec.get(Par::Pole_Mass,"d",2) ) // i.e. strange
306  cout<<" ***s Pole mass not well defined***"<<endl;
307  ECHO( slhaea.at("SMINPUTS").at(23).at(1) ) // ms(2 GeV)^MS-bar, not pole mass
308  cout<<endl;
309  //ECHO( spec.get(Par::Pole_Mass,"d",3) ) // i.e. bottom
310  ECHO( fullspectrum.get(Par::Pole_Mass,"b") )
311  ECHO( SM.get(Par::Pole_Mass,"d",3) ) // i.e. bottom
312  ECHO( slhaea.at("SMINPUTS").at(5).at(1) ) // mb(mb)^MS-bar, not pole mass.
313  cout<<endl;
314  cout<<"Charged fermions pole masses:"<<endl;
315  cout<<endl;
316  //ECHO( spec.get(Par::Pole_Mass,"e-",1) ) // i.e. electron
317  ECHO( fullspectrum.get(Par::Pole_Mass,"e-") )
318  ECHO( SM.get(Par::Pole_Mass,"e-",1) ) // i.e. electron
319  ECHO( slhaea.at("SMINPUTS").at(11).at(1) )
320  cout<<endl;
321  //ECHO( spec.get(Par::Pole_Mass,"e-",2) ) // i.e. muon
322  ECHO( fullspectrum.get(Par::Pole_Mass,"mu-") )
323  ECHO( SM.get(Par::Pole_Mass,"e-",2) ) // i.e. muon
324  ECHO( slhaea.at("SMINPUTS").at(13).at(1) )
325  cout<<endl;
326  //ECHO( spec.get(Par::Pole_Mass,"e-",3) ) // i.e. tau
327  ECHO( fullspectrum.get(Par::Pole_Mass,"tau-") )
328  ECHO( SM.get(Par::Pole_Mass,"e-",3) ) // i.e. tau
329  ECHO( slhaea.at("SMINPUTS").at(7).at(1) )
330  cout<<endl;
331  cout<<"Neutrinos pole masses:"<<endl;
332  cout<<endl;
333  // These will produce errors because currently no neutrino mass getters are hooked up
334  //ECHO( spec.get(Par::Pole_Mass,"nu",1) ) // Just mass ordered (if there is mixing)
335  ECHO( fullspectrum.get(Par::Pole_Mass,"nu",1) )
336  ECHO( SM.get(Par::Pole_Mass,"nu",1) ) // Just mass ordered (if there is mixing)
337  ECHO( slhaea.at("SMINPUTS").at(12).at(1) )
338  cout<<endl;
339  //ECHO( spec.get(Par::Pole_Mass,"nu",2) )
340  ECHO( fullspectrum.get(Par::Pole_Mass,"nu",2) )
341  ECHO( SM.get(Par::Pole_Mass,"nu",2) )
342  ECHO( slhaea.at("SMINPUTS").at(14).at(1) )
343  cout<<endl;
344  //ECHO( spec.get(Par::Pole_Mass,"nu",3) )
345  ECHO( fullspectrum.get(Par::Pole_Mass,"nu",3) )
346  ECHO( SM.get(Par::Pole_Mass,"nu",3) )
347  ECHO( slhaea.at("SMINPUTS").at(8).at(1) )
348  cout<<endl;
349  // Now for SUSY particles
350  cout<<endl;
351  cout<<"MSSM Higgs sector pole masses:"<<endl;
352  cout<<endl;
353  ECHO( fullspectrum.get(Par::Pole_Mass,"h0",1) )
354  ECHO( spec.get(Par::Pole_Mass,"h0",1) ) // Lightest neutral Higgs boson
355  ECHO( slhaea.at("MASS").at(25).at(1) )
356  cout<<endl;
357  ECHO( fullspectrum.get(Par::Pole_Mass,"h0",2) )
358  ECHO( spec.get(Par::Pole_Mass,"h0",2) ) // Heavy neutral Higgs boson
359  ECHO( slhaea.at("MASS").at(35).at(1) )
360  cout<<endl;
361  ECHO( fullspectrum.get(Par::Pole_Mass,"H+") )
362  ECHO( spec.get(Par::Pole_Mass,"H+") ) // Charged Higgs
363  ECHO( slhaea.at("MASS").at(37).at(1) )
364  cout<<endl;
365  ECHO( fullspectrum.get(Par::Pole_Mass,"A0") )
366  ECHO( spec.get(Par::Pole_Mass,"A0") ) // Pseudoscalar neutral Higgs
367  ECHO( slhaea.at("MASS").at(36).at(1) )
368  cout<<endl;
369 
370  // I'm going to use these nested functors to save lots of typing for the rest. It is just the
371  // same as the examples above, except that the PDG codes are retrieved from the particle database.
372  // The PDG code - string name correspondences are defined in 'Models/src/particle_database.cpp'
373 
374  struct get_polemass_functor
375  {
376  // Single mass
377  void operator()(const std::string& longname)
378  {
379  std::ostringstream echo1, echo2, echo3;
380  echo1 << " fullspectrum.get(Par::Pole_Mass,"<<longname<<") = ";
381  double value1 = fullspectrum.get(Par::Pole_Mass,longname);
382  cout << echo1.str() << value1 << endl;
383  echo2 << " spec.get(Par::Pole_Mass,"<<longname<<") = ";
384  double value2 = spec.get(Par::Pole_Mass,longname);
385  cout << echo2.str() << value2 << endl;
386  echo3 << " slhaea.at(\"MASS\").at("<<PDB.pdg_pair(longname).first<<").at(1) = ";
387  str value3 = slhaea.at("MASS").at( PDB.pdg_pair(longname).first ).at(1);
388  cout << echo3.str() << value3 << endl;
389  cout<<endl;
390  }
391  // Range of indexes masses
392  void operator()(const std::string& longname, int from, int to)
393  {
394  for(int i=from; i<=to; ++i)
395  {
396  std::ostringstream echo1;
397  std::ostringstream echo2;
398  echo1 << " spec.get(Par::Pole_Mass,"<<longname<<","<<i<<") = ";
399  double value1 = spec.get(Par::Pole_Mass,longname,i);
400  echo2 << " slhaea.at(\"MASS\").at("<<PDB.pdg_pair(longname,i).first<<").at(1) = ";
401  str value2 = slhaea.at("MASS").at( PDB.pdg_pair(longname,i).first ).at(1);
402  cout << echo1.str() << value1 << endl;
403  cout << echo2.str() << value2 << endl;
404  cout<<endl;
405  }
406  }
407 
408  get_polemass_functor(const Spectrum& fullin, const SubSpectrum& specin, SLHAea::Coll& slhaeain)
409  : fullspectrum(fullin)
410  , spec(specin)
411  , slhaea(slhaeain)
412  {}
413 
414  private:
415  const Spectrum& fullspectrum;
416  const SubSpectrum& spec;
417  SLHAea::Coll slhaea;
419  };
420 
421  get_polemass_functor get_polemass(fullspectrum,spec,slhaea);
422 
423  cout<<endl<<"Gaugino pole masses:"<<endl<<endl;
424  get_polemass("~g");
425  get_polemass("~chi+",1,2);
426  get_polemass("~chi0",1,4);
427  cout<<endl<<"Squark pole masses:"<<endl<<endl;
428  get_polemass("~d",1,6);
429  get_polemass("~u",1,6);
430  cout<<endl<<"Slepton pole masses:"<<endl<<endl;
431  get_polemass("~e-",1,6);
432  get_polemass("~nu",1,3);
433 
434  cout << endl << "Mixing matrices:" << endl << endl;
435 
436  // Note, currently we are not using a matrix object or any such thing, so you have to
437  // extract the elements of each matrix one at a time. It would probably be handy to
438  // add such a return type though.
439 
440  #define GET_MIX_MATRIX_EL(r, PRODUCT) \
441  { \
442  str label = BOOST_PP_SEQ_ELEM(0, PRODUCT); \
443  str block = BOOST_PP_SEQ_ELEM(1, PRODUCT); \
444  int i = BOOST_PP_SEQ_ELEM(2, PRODUCT); \
445  int j = BOOST_PP_SEQ_ELEM(3, PRODUCT); \
446  try{ \
447  std::ostringstream echo1; \
448  std::ostringstream echo2; \
449  echo1 << " spec.get(Par::Pole_Mixing,"<<label<<","<<i<<","<<j<<") = "; \
450  double value1 = spec.get(Par::Pole_Mixing,label,i,j); \
451  echo2 << " SLHAea::to<double>( slhaea.at("<<block<<").at("<<i<<","<<j<<").at(2) ) = "; \
452  double value2 = SLHAea::to<double>( slhaea.at(block).at(i,j).at(2) ); \
453  cout << echo1.str() << value1 <<endl; \
454  cout << echo2.str() << value2 <<endl; \
455  cout << endl; \
456  } \
457  catch (const std::exception& e) \
458  { add_error(report,e,label+": "+block); } \
459  }
460 
461  #define GET_MIX_MATRIX(NAME,BLOCK,__IND1,__IND2) BOOST_PP_SEQ_FOR_EACH_PRODUCT(GET_MIX_MATRIX_EL, ((NAME))((BLOCK))(BOOST_PP_TUPLE_TO_SEQ(__IND1))(BOOST_PP_TUPLE_TO_SEQ(__IND2)))
462 
463  // The names here could perhaps be improved. They are not so immediately obvious to me.
464 
465  // GET_MIX_MATRIX("~chi-","UMIX",(1,2),(1,2)) cout<<endl;
466  // GET_MIX_MATRIX("~chi+","VMIX",(1,2),(1,2)) cout<<endl;
467  // GET_MIX_MATRIX("A0","PSEUDOSCALARMIX",(1,2),(1,2)) cout<<endl;
468  // GET_MIX_MATRIX("~d","DSQMIX",(1,2,3,4,5,6),(1,2,3,4,5,6)) cout<<endl;
469  // GET_MIX_MATRIX("~e-","SELMIX",(1,2,3,4,5,6),(1,2,3,4,5,6)) cout<<endl;
470  // GET_MIX_MATRIX("h0","SCALARMIX",(1,2),(1,2)) cout<<endl;
471  // GET_MIX_MATRIX("~chi0","NMIX",(1,2,3,4),(1,2,3,4)) cout<<endl;
472  // GET_MIX_MATRIX("H+","CHARGEMIX",(1,2),(1,2)) cout<<endl;
473  // GET_MIX_MATRIX("~u","USQMIX",(1,2,3,4,5,6),(1,2,3,4,5,6)) cout<<endl;
474  // GET_MIX_MATRIX("~nu","SNUMIX",(1,2,3),(1,2,3)) cout<<endl;
475 
476  cout<<endl;
477  cout << "Next up: running parameters" << endl;
478  cout << "These are all given in the DRbar scheme, at least when running FlexibleSUSY or SoftSUSY. ";
479  cout << "There may be some switching or converting once other spectrum generator are added." << endl;
480  cout<<endl;
481  cout << "Spectrum object running parameters are currently defined at scale Q="
482  << spec.GetScale() << " [GeV]" << endl << endl;
483  cout<<endl;
484  cout << "-- Dimensionless parameters --" <<endl;
485  cout << endl << "Gauge couplings:" << endl << endl;
486  ECHO( spec.get(Par::dimensionless,"g1") ) // U_Y(1) gauge coupling in SU(5) normalisation
487  ECHO( slhaea.at("GAUGE").at(1).at(1) ) // This is in the Standard Model normalisation as per SLHA conventions
488  cout << "Note: " << spec.get(Par::dimensionless,"g1") << " * sqrt(3/5) = "
489  << spec.get(Par::dimensionless,"g1")*sqrt(3./5.) << endl;
490  cout<<endl;
491  ECHO( spec.get(Par::dimensionless,"g2") ) // SU(2) gauge coupling
492  ECHO( slhaea.at("GAUGE").at(2).at(1) )
493  cout<<endl;
494  ECHO( spec.get(Par::dimensionless,"g3") ) // SU(3) gauge coupling
495  ECHO( slhaea.at("GAUGE").at(3).at(1) )
496  cout<<endl;
497 
498  cout << endl << "Yukawa matrices:" << endl << endl;
499 
500  // Note, currently we are not using a matrix object or any such thing, so you have to
501  // extract the elements of the matrix one at a time. It would probably be handy to
502  // add such a return type though.
503 
504  #define GET_MATRIX_EL(r, PRODUCT) \
505  { \
506  str label = BOOST_PP_SEQ_ELEM(0, PRODUCT); \
507  str block = BOOST_PP_SEQ_ELEM(1, PRODUCT); \
508  int i = BOOST_PP_SEQ_ELEM(2, PRODUCT); \
509  int j = BOOST_PP_SEQ_ELEM(3, PRODUCT); \
510  try{ \
511  std::ostringstream echo1; \
512  std::ostringstream echo2; \
513  echo1 << " spec.get(Par::dimensionless,"<<label<<","<<i<<","<<j<<") = "; \
514  double value1 = spec.get(Par::dimensionless,label,i,j); \
515  echo2 << " SLHAea::to<double>( slhaea.at("<<block<<").at("<<i<<","<<j<<").at(2) ) = "; \
516  double value2 = SLHAea::to<double>( slhaea.at(block).at(i,j).at(2) ); \
517  cout << echo1.str() << value1 <<endl; \
518  cout << echo2.str() << value2 <<endl; \
519  cout << endl; \
520  } catch (const std::exception& e) \
521  { add_error(report,e,label+": "+block); } \
522  }
523 
524  #define GET_MATRIX(NAME,BLOCK,__IND1,__IND2) BOOST_PP_SEQ_FOR_EACH_PRODUCT(GET_MATRIX_EL, ((NAME))((BLOCK))(BOOST_PP_TUPLE_TO_SEQ(__IND1))(BOOST_PP_TUPLE_TO_SEQ(__IND2)))
525 
526  // GET_MATRIX("Yu","YU",(1,2,3),(1,2,3)) cout << endl;
527  // GET_MATRIX("Yd","YD",(1,2,3),(1,2,3)) cout << endl;
528  // GET_MATRIX("Ye","YE",(1,2,3),(1,2,3)) cout << endl;
529 
530  // Mass dimension 1 parameters
531 
532  cout<<endl;
533  cout<<"MSSM mass dimension 1 running parameters"<<endl;
534  cout<<endl;
535  ECHO( spec.get(Par::mass1,"M1") ) // Gaugino mass parameter "MassB"
536  ECHO( slhaea.at("MSOFT").at(1).at(1) )
537  cout<<endl;
538  ECHO( spec.get(Par::mass1,"M2") ) // Gaugino mass parameter "MassWB"
539  ECHO( slhaea.at("MSOFT").at(2).at(1) )
540  cout<<endl;
541  ECHO( spec.get(Par::mass1,"M3") ) // Gaugino mass parameter "MassG"
542  ECHO( slhaea.at("MSOFT").at(3).at(1) )
543  cout<<endl;
544  ECHO( spec.get(Par::mass1,"Mu") ) // Superpotential mu parameter
545  ECHO( slhaea.at("HMIX").at(1).at(1) )
546  cout<<endl;
547  ECHO( spec.get(Par::mass1,"vd") ) // Down-type Higgs vev
548  ECHO( slhaea.at("HMIX").at(102).at(1) )
549  cout<<endl;
550  ECHO( spec.get(Par::mass1,"vu") ) // Up-type Higgs vev
551  ECHO( slhaea.at("HMIX").at(103).at(1) )
552  cout<<endl;
553 
554  // Matrices
555 
556  #define GET_M1_MATRIX_EL(r, PRODUCT) \
557  { \
558  str label = BOOST_PP_SEQ_ELEM(0, PRODUCT); \
559  str block = BOOST_PP_SEQ_ELEM(1, PRODUCT); \
560  int i = BOOST_PP_SEQ_ELEM(2, PRODUCT); \
561  int j = BOOST_PP_SEQ_ELEM(3, PRODUCT); \
562  try{ \
563  std::ostringstream echo1; \
564  std::ostringstream echo2; \
565  echo1 << " spec.get(Par::mass1,"<<label<<","<<i<<","<<j<<") = "; \
566  double value1 = spec.get(Par::mass1,label,i,j); \
567  echo2 << " SLHAea::to<double>( slhaea.at("<<block<<").at("<<i<<","<<j<<").at(2) ) = "; \
568  double value2 = SLHAea::to<double>( slhaea.at(block).at(i,j).at(2) ); \
569  cout << echo1.str() << value1 <<endl; \
570  cout << echo2.str() << value2 <<endl; \
571  cout << endl; \
572  } catch (const std::exception& e) \
573  { add_error(report,e,label+": "+block); } \
574  }
575 
576  #define GET_M1_MATRIX(NAME,BLOCK,__IND1,__IND2) BOOST_PP_SEQ_FOR_EACH_PRODUCT(GET_M1_MATRIX_EL, ((NAME))((BLOCK))(BOOST_PP_TUPLE_TO_SEQ(__IND1))(BOOST_PP_TUPLE_TO_SEQ(__IND2)))
577 
578  cout << endl << "Triliner coupling matrices? SLHA says these blocks should be called AU,AD,AE, not TU,TD,TE though, so I'm not sure. Need to check with Peter." << endl << endl;
579 
580  // Seem to be the trilinears, and TYu and au etc. seem to be equal. Ask Peter...
581 
582  // GET_M1_MATRIX("TYu","TU",(1,2,3),(1,2,3)) cout << endl;
583  // GET_M1_MATRIX("TYd","TD",(1,2,3),(1,2,3)) cout << endl;
584  // GET_M1_MATRIX("TYe","TE",(1,2,3),(1,2,3)) cout << endl;
585  // cout << endl;
586  // GET_M1_MATRIX("au","TU",(1,2,3),(1,2,3)) cout << endl;
587  // GET_M1_MATRIX("ad","TD",(1,2,3),(1,2,3)) cout << endl;
588  // GET_M1_MATRIX("ae","TE",(1,2,3),(1,2,3)) cout << endl;
589 
590  // Mass dimension 2 parameters
591 
592  cout<<endl;
593  cout<<"MSSM mass dimension 2 running parameters"<<endl;
594  cout<<endl;
595  ECHO( spec.get(Par::mass2,"mHd2") ) // Down-type Higgs soft mass
596  ECHO( slhaea.at("MSOFT").at(21).at(1) )
597  cout<<endl;
598  ECHO( spec.get(Par::mass2,"mHu2") ) // Up-type Higgs soft mass
599  ECHO( slhaea.at("MSOFT").at(22).at(1) )
600  cout<<endl;
601  ECHO( spec.get(Par::mass2,"BMu") ) // Higgs bilinear soft parameter
602  ECHO( slhaea.at("HMIX").at(101).at(1) )
603  cout<<endl;
604 
605  // Matrices
606 
607  #define GET_M2_MATRIX_EL(r, PRODUCT) \
608  { \
609  str label = BOOST_PP_SEQ_ELEM(0, PRODUCT); \
610  str block = BOOST_PP_SEQ_ELEM(1, PRODUCT); \
611  int i = BOOST_PP_SEQ_ELEM(2, PRODUCT); \
612  int j = BOOST_PP_SEQ_ELEM(3, PRODUCT); \
613  std::ostringstream echo1; \
614  try { \
615  std::ostringstream echo2; \
616  echo1 << " spec.get(Par::mass2,"<<label<<","<<i<<","<<j<<") = "; \
617  double value1 = spec.get(Par::mass2,label,i,j); \
618  echo2 << " SLHAea::to<double>( slhaea.at("<<block<<").at("<<i<<","<<j<<").at(2) ) = "; \
619  double value2 = SLHAea::to<double>( slhaea.at(block).at(i,j).at(2) ); \
620  cout << echo1.str() << value1 <<endl; \
621  cout << echo2.str() << value2 <<endl; \
622  cout << endl; \
623  } catch (const std::exception& e) \
624  { add_error(report,e,label+": "+block); } \
625  }
626 
627  #define GET_M2_MATRIX(NAME,BLOCK,__IND1,__IND2) BOOST_PP_SEQ_FOR_EACH_PRODUCT(GET_M2_MATRIX_EL, ((NAME))((BLOCK))(BOOST_PP_TUPLE_TO_SEQ(__IND1))(BOOST_PP_TUPLE_TO_SEQ(__IND2)))
628 
629  cout << endl << "Mass matrices:" << endl << endl;
630 
631  // GET_M2_MATRIX("mq2","MSQ2",(1,2,3),(1,2,3)) cout << endl;
632  // GET_M2_MATRIX("mu2","MSU2",(1,2,3),(1,2,3)) cout << endl;
633  // GET_M2_MATRIX("md2","MSD2",(1,2,3),(1,2,3)) cout << endl;
634  // GET_M2_MATRIX("me2","MSE2",(1,2,3),(1,2,3)) cout << endl;
635  // GET_M2_MATRIX("ml2","MSL2",(1,2,3),(1,2,3)) cout << endl;
636 
637  cout << endl;
638 
641  std::unique_ptr<SubSpectrum> clonedspec = spec.clone();
642 
643  cout << "Testing set_override functions" << endl;
644 
645  cout << "Original M1:" << clonedspec->get(Par::mass1,"M1") << endl;
646  clonedspec->set_override(Par::mass1,-666,"M1");
647  cout << "Override M1:" << clonedspec->get(Par::mass1,"M1") << endl;
648  // Check that original can still be accessed using special optional argument
649  cout << "Original M1 via no_overrides:" << clonedspec->get(Par::mass1,"M1",ignore_overrides) << endl;
650 
651  cout << "Original ~e-(1):" << clonedspec->get(Par::Pole_Mass,"~e-",1) << endl;
652  clonedspec->set_override(Par::Pole_Mass,-667,"~e-",1);
653  cout << "Override ~e-(1):" << clonedspec->get(Par::Pole_Mass,"~e-",1) << endl;
654  cout << "Original ~e-(1) via no_overrides:" << clonedspec->get(Par::Pole_Mass,"~e-",1,ignore_overrides) << endl;
655 
656  // Make sure that we can set overrides via long name strings properly
657  cout << "Original ~e-(2):" << clonedspec->get(Par::Pole_Mass,"~e-",2) << endl;
658  clonedspec->set_override(Par::Pole_Mass,-345,"~e-_2");
659  cout << "Override ~e-(2):" << clonedspec->get(Par::Pole_Mass,"~e-",2) << endl;
660  cout << "Original ~e-(2) via no_overrides:" << clonedspec->get(Par::Pole_Mass,"~e-",2,ignore_overrides) << endl;
661  clonedspec->set_override(Par::Pole_Mass,-347,"~e-",2);
662  cout << "Override ~e-(2) (second time):" << clonedspec->get(Par::Pole_Mass,"~e-",2) << endl;
663  cout << "Original ~e-(2) via no_overrides (second time):" << clonedspec->get(Par::Pole_Mass,"~e-",2,ignore_overrides) << endl;
664 
665 
666 
667  cout << "Original ml2(1,1):" << clonedspec->get(Par::mass2,"ml2",1,1) << endl;
668  clonedspec->set_override(Par::mass2,-668,"ml2",1,1);
669  cout << "Override ml2(1,1):" << clonedspec->get(Par::mass2,"ml2",1,1) << endl;
670  cout << "Original ml2(1,1) via no_overrides:" << clonedspec->get(Par::mass2,"ml2",1,1,ignore_overrides) << endl;
671 
672 
674  cout << "has 'new_entry'? " << clonedspec->has(Par::mass1,"new_entry") << endl;
675  cout << "..." << endl;
677  //clonedspec->set_override(Par::mass2,-1234,"new_entry"); // incorrect: "allow_new" false by default
678  clonedspec->set_override(Par::mass1,-1234,"new_entry",true); // correct: "allow_new" = true
679  cout << "has 'new_entry'? " << clonedspec->has(Par::mass1,"new_entry") << endl;
680  cout << "new_entry = " << clonedspec->get(Par::mass1,"new_entry") << endl;
681  cout << endl;
682 
684 
685 
687  cout << "Test retrieval of antiparticle entries" << endl;
688 
689  cout << "has '~e+' pole mass? " << clonedspec->has(Par::Pole_Mass,"~e+",1) << endl;
690  cout << "'~e+' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",1) << endl;
691  cout << "'~e-' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",1) << endl;
692  cout << "Setting new ~e+ pole mass value" << endl;
693  clonedspec->set(Par::Pole_Mass,-666,"~e+",1);
694  cout << "'~e+' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",1) << endl;
695  cout << "'~e-' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",1) << endl;
696  cout << "Setting override ~e+ pole mass value" << endl;
697  // Need to turn on the "allow_new" check for this, because no explicit entry for
698  // ~e+_1 exists yet, and need to turn on the "decouple" option to prevent conversion
699  // to the antiparticle string name. This action will decouple the ~e-_1 and ~e+_1 masses from
700  // here onwards.
701  clonedspec->set_override(Par::Pole_Mass,-999,"~e+",1,true,true); // "allow_new" + "decouple" = true
702  cout << "'~e+' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",1) << endl;
703  cout << "'~e-' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",1) << endl;
704  cout << "Set ~e+ pole mass via PDG code" << endl;
705  // Can leave safety check on this time, because now an explicit entry for
706  // ~e+_1 DOES exist (i.e. the previous override entry)
707  clonedspec->set_override(Par::Pole_Mass,-111,std::make_pair(-1000011,0));
708  cout << "'(-1000011,0)' pole mass = " << clonedspec->get(Par::Pole_Mass,std::make_pair(-1000011,0)) << endl;
709  cout << "'~e+' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",1) << endl;
710  cout << "'~e-' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",1) << endl;
711  cout << "Setting new ~e+ pole mass value (will be hidden by override!)" << endl;
712  // This should also throw a warning explaining that the newly set value is not retrievable by
713  // the getters, due to being hidden by an override value.
714  clonedspec->set(Par::Pole_Mass,-96969,"~e+",1);
715  cout << "'~e+' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",1) << endl;
716  cout << "'~e-' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",1) << endl;
717  cout << endl;
718 
719  cout << "has '~e+,2' pole mass? " << clonedspec->has(Par::Pole_Mass,"~e+",2) << endl;
720  cout << "'~e+,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",2) << endl;
721  cout << "'~e-,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",2) << endl;
722  cout << "Setting new ~e+,2 pole mass value" << endl;
723  clonedspec->set(Par::Pole_Mass,-666,"~e+",2);
724  cout << "'~e+,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",2) << endl;
725  cout << "'~e-,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",2) << endl;
726  cout << "Setting override ~e+,2 pole mass value" << endl;
727  clonedspec->set_override(Par::Pole_Mass,-999,"~e+",2,true);
728  cout << "'~e+,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",2) << endl;
729  cout << "'~e-,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",2) << endl;
730  cout << "Set ~e+,2 pole mass via PDG code" << endl;
731  clonedspec->set_override(Par::Pole_Mass,-111,std::make_pair(-1000013,0));
732  cout << "'(-1000013,0)' pole mass = " << clonedspec->get(Par::Pole_Mass,std::make_pair(-1000013,0)) << endl;
733  cout << "'~e+,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e+",2) << endl;
734  cout << "'~e-,2' pole mass = " << clonedspec->get(Par::Pole_Mass,"~e-",2) << endl;
735 
736 
737  cout << "Test report:" << std::endl << report.str();
738 
740  SpecBit_warning().raise(LOCAL_INFO,"\n *** Finished examining spectrum contents ***");
741  result = 0;
742  }
743  }
744 
745  // Test that output of Standard Model wrapper (e.g. QedQcdWrapper) matches
746  // SMINPUTS sufficiently accurately
747  // Set flag SLHAonly=1 if SMskeleton and/or MSSMskeleton are being used.
748  void light_quark_test(bool&)
749  {
750  namespace myPipe = Pipes::light_quark_test;
751  const SubSpectrum& qedqcd = **myPipe::Dep::qedqcd_subspectrum;
752 
753  // Check light quark mass ratios
754  logger() << "Checking light quark mass ratios:" << EOM;
755 
757  double Qs[] = {
758  1.00000000e-02, 1.25892541e-02, 1.58489319e-02,
759  1.99526231e-02, 2.51188643e-02, 3.16227766e-02,
760  3.98107171e-02, 5.01187234e-02, 6.30957344e-02,
761  7.94328235e-02, 1.00000000e-01, 1.25892541e-01,
762  1.58489319e-01, 1.99526231e-01, 2.51188643e-01,
763  3.16227766e-01, 3.98107171e-01, 5.01187234e-01,
764  6.30957344e-01, 7.94328235e-01, 1.00000000e+00,
765  1.25892541e+00, 1.58489319e+00, 1.99526231e+00,
766  2.51188643e+00, 3.16227766e+00, 3.98107171e+00,
767  5.01187234e+00, 6.30957344e+00, 7.94328235e+00,
768  1.00000000e+01, 1.25892541e+01, 1.58489319e+01,
769  1.99526231e+01, 2.51188643e+01, 3.16227766e+01,
770  3.98107171e+01, 5.01187234e+01, 6.30957344e+01,
771  7.94328235e+01, 1.00000000e+02, 1.25892541e+02,
772  1.58489319e+02, 1.99526231e+02, 2.51188643e+02,
773  3.16227766e+02, 3.98107171e+02, 5.01187234e+02,
774  6.30957344e+02, 7.94328235e+02, 1.00000000e+03,
775  1.25892541e+03, 1.58489319e+03, 1.99526231e+03,
776  2.51188643e+03, 3.16227766e+03, 3.98107171e+03,
777  5.01187234e+03, 6.30957344e+03, 7.94328235e+03,
778  1.00000000e+04, 1.25892541e+04, 1.58489319e+04,
779  1.99526231e+04, 2.51188643e+04, 3.16227766e+04,
780  3.98107171e+04, 5.01187234e+04, 6.30957344e+04,
781  7.94328235e+04
782  };
783 
784  std::vector<double> Qvec(Qs, Utils::endA(Qs));
785 
786  std::ofstream Qout;
787  Qout.open("SpecBit/light_quark_txt");
788 
789  Qout <<std::setw(12)<<"Qin"
790  <<std::setw(12)<<"Qreal"
791  <<std::setw(12)<<"alphaS"
792  <<std::setw(12)<<"md"
793  <<std::setw(12)<<"mu"
794  <<std::setw(12)<<"ms"
795  <<std::setw(12)<<"mu/md"
796  <<std::setw(12)<<"ms/md"
797  <<std::endl;
798  for(std::vector<double>::iterator it = Qvec.begin(); it != Qvec.end(); ++it)
799  {
800  // Clone to avoid buildup of errors
801  std::unique_ptr<SubSpectrum> SMloop = qedqcd.clone();
802 
803  SMloop->RunToScale(*it);
804  double Q = SMloop->GetScale();
805  double mu = SMloop->get(Par::mass1,"u");
806  double md = SMloop->get(Par::mass1,"d");
807  double ms = SMloop->get(Par::mass1,"s");
808  double alphas = SMloop->get(Par::dimensionless,"alphaS");
809  // Write to file
810  Qout <<std::setw(12)<<*it
811  <<std::setw(12)<<Q
812  <<std::setw(12)<<alphas
813  <<std::setw(12)<<md
814  <<std::setw(12)<<mu
815  <<std::setw(12)<<ms
816  <<std::setw(12)<<mu/md
817  <<std::setw(12)<<ms/md
818  <<std::endl;
819  }
820 
821  Qout.close();
822 
823  std::cout << " light quark test finished, bailing out!" << std::endl;
824  exit(0);
825  }
826  }
827 
828 }
829 
830 #undef PDB
double get(const Par::Tags partype, const std::string &mass) const
Definition: spectrum.cpp:249
Define overloadings of the stream operator for various containers.
This class is used to deliver both information defined in the Standard Model (or potentially just QED...
Rollcall header for module SpecBit.
virtual std::unique_ptr< SubSpectrum > clone() const =0
Clone the SubSpectrum object.
#define LOCAL_INFO
Definition: local_info.hpp:34
SLHAstruct getSLHAea(int) const
SLHAea object getter First constructs an SLHAea object from the SMINPUTS object, then adds the info f...
Definition: spectrum.cpp:432
STL namespace.
virtual double GetScale() const
Returns the renormalisation scale of parameters.
virtual void writeSLHAfile(int, const str &) const
Dump out spectrum information to an SLHA file (if possible)
Definition: subspectrum.cpp:40
#define ECHO(COMMAND)
void SPheno_MSSM_test(bool &result)
std::chrono::milliseconds ms
virtual double get(const Par::Tags, const str &, const SpecOverrideOptions=use_overrides, const SafeBool check_antiparticle=SafeBool(true)) const =0
void SUSYHD_test(bool &result)
const double mu
Definition: SM_Z.hpp:42
partmap & ParticleDB()
Database accessor function.
Definition: partmap.cpp:36
const Logging::endofmessage EOM
Explicit const instance of the end of message struct in Gambit namespace.
Definition: logger.hpp:100
void add_error(std::ostringstream &out, const std::exception &e, const std::string &msg)
Header file that includes all GAMBIT headers required for a module source file.
EXPORT_SYMBOLS Logging::LogMaster & logger()
Function to retrieve a reference to the Gambit global log object.
Definition: logger.cpp:95
#define PDB
std::string str
Shorthand for a standard string.
Definition: Analysis.hpp:35
void Math_test(bool &result)
void light_quark_test(bool &)
SubSpectrum & get_LE()
Standard getters Return references to internal data members.
Definition: spectrum.cpp:224
Virtual base class for interacting with spectrum generator output.
Definition: subspectrum.hpp:87
Spectrum Spectrum Spectrum Spectrum Spectrum Spectrum mh
T * endA(T(&arr)[N])
TODO: see if we can use this one:
Definition: Analysis.hpp:33
void MSSMspectrum_test(bool &result)
Verify consistency of the contents of a Spectrum object of capability MSSMspectrum.
SubSpectrum & get_HE()
Definition: spectrum.cpp:225
"Standard Model" (low-energy) plus high-energy model container class
Definition: spectrum.hpp:110