flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
slha_io.hpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of FlexibleSUSY.
3//
4// FlexibleSUSY is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// FlexibleSUSY is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with FlexibleSUSY. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
19#ifndef SLHA_IO_H
20#define SLHA_IO_H
21
22#include "slha_format.hpp"
23#include "unitarity.hpp"
24
25#include <complex>
26#include <functional>
27#include <iosfwd>
28#include <memory>
29#include <string>
30#include <vector>
31
32#include <Eigen/Core>
33
34namespace softsusy {
35 class QedQcd;
36} // namespace softsusy
37
38namespace SLHAea {
39 class Coll;
40 class Line;
41} // namespace SLHAea
42
43namespace flexiblesusy {
44
45 class Spectrum_generator_settings;
46 class LToLConversion_settings;
47 class FlexibleDecay_settings;
48 class Physical_input;
49 struct PMNS_parameters;
50
95class SLHA_io {
96public:
97 using Tuple_processor = std::function<void(int, double)>;
98 enum Position { front, back };
99 struct Modsel {
103 void clear() { *this = Modsel(); }
104 };
105
107 double lambdaW{0.}, aCkm{0.}, rhobar{0.}, etabar{0.};
108 void clear() { *this = CKM_wolfenstein(); }
109 };
110
111 SLHA_io();
112 SLHA_io(const SLHA_io&);
113 SLHA_io(SLHA_io&&) noexcept;
115
116 SLHA_io& operator=(const SLHA_io&);
117 SLHA_io& operator=(SLHA_io&&) noexcept;
118
119 void clear();
120
121 // reading functions
122 bool block_exists(const std::string&) const;
123 void fill(softsusy::QedQcd&) const;
124 void fill(FlexibleDecay_settings&) const;
126 void fill(LToLConversion_settings&) const;
127 void fill(Physical_input&) const;
128 const Modsel& get_modsel() const { return modsel; }
129 const SLHAea::Coll& get_data() const;
130 void read_from_file(const std::string&);
131 void read_from_source(const std::string&);
132 void read_from_stream(std::istream&);
133 double read_block(const std::string&, const Tuple_processor&) const;
134 template <class Derived>
135 double read_block(const std::string&, Eigen::PlainObjectBase<Derived>&) const;
136 double read_block(const std::string&, double&) const;
137 double read_entry(const std::string&, int) const;
138 double read_scale(const std::string&) const;
139
140 // writing functions
141 void set_data(const SLHAea::Coll&);
142 void set_block(const std::ostringstream&, Position position = back);
143 void set_block(const std::string&, Position position = back);
144 void set_blocks(const std::vector<std::string>&, Position position = back);
145 void set_block(const std::string&, double, const std::string&, double scale = 0.);
146 template <class Derived>
147 void set_block(const std::string&, const Eigen::MatrixBase<Derived>&, const std::string&, double scale = 0.);
148 template <class Derived>
149 void set_block_imag(const std::string&, const Eigen::MatrixBase<Derived>&, const std::string&, double scale = 0.);
150 void set_effectivecouplings_block(const std::vector<std::tuple<int, int, int, double, std::string>>&);
151 void set_modsel(const Modsel&);
156 void set_sminputs(const softsusy::QedQcd&);
158 void write_to_file(const std::string&) const;
159 void write_to_stream() const;
160 void write_to_stream(std::ostream&) const;
161
162private:
163 std::unique_ptr<SLHAea::Coll> data;
165
166 static std::string block_head(const std::string& name, double scale);
167 static bool read_scale(const SLHAea::Line& line, double& scale);
168
169 void read_modsel();
170 double read_matrix(const std::string&, double*, int, int) const;
171 double read_matrix(const std::string&, std::complex<double>*, int, int) const;
172 double read_vector(const std::string&, double*, int) const;
173 double read_vector(const std::string&, std::complex<double>*, int) const;
174
175 void set_vector(const std::string&, const double*, const std::string&, double, int);
176 void set_vector(const std::string&, const std::complex<double>*, const std::string&, double, int);
177 void set_matrix(const std::string&, const double*, const std::string&, double, int, int);
178 void set_matrix(const std::string&, const std::complex<double>*, const std::string&, double, int, int);
179
180 void set_vector_imag(const std::string&, const double*, const std::string&, double, int);
181 void set_vector_imag(const std::string&, const std::complex<double>*, const std::string&, double, int);
182 void set_matrix_imag(const std::string&, const double*, const std::string&, double, int, int);
183 void set_matrix_imag(const std::string&, const std::complex<double>*, const std::string&, double, int, int);
184};
185
194template <class Derived>
195double SLHA_io::read_block(const std::string& block_name, Eigen::PlainObjectBase<Derived>& dense) const
196{
197 return dense.cols() == 1
198 ? read_vector(block_name, dense.data(), dense.rows())
199 : read_matrix(block_name, dense.data(), dense.rows(), dense.cols());
200}
201
210template<class Derived>
211void SLHA_io::set_block(const std::string& name,
212 const Eigen::MatrixBase<Derived>& dense,
213 const std::string& symbol, double scale)
214{
215 dense.cols() == 1
216 ? set_vector(name, dense.eval().data(), symbol, scale, dense.rows())
217 : set_matrix(name, dense.eval().data(), symbol, scale, dense.rows(), dense.cols());
218}
219
228template<class Derived>
229void SLHA_io::set_block_imag(const std::string& name,
230 const Eigen::MatrixBase<Derived>& dense,
231 const std::string& symbol, double scale)
232{
233 dense.cols() == 1
234 ? set_vector_imag(name, dense.eval().data(), symbol, scale, dense.rows())
235 : set_matrix_imag(name, dense.eval().data(), symbol, scale, dense.rows(), dense.cols());
236}
237
238} // namespace flexiblesusy
239
240#endif
stores physical input parameters
Handles reading and writing of SLHA files.
Definition: slha_io.hpp:95
const Modsel & get_modsel() const
Definition: slha_io.hpp:128
void set_vector_imag(const std::string &, const double *, const std::string &, double, int)
Definition: slha_io.cpp:1005
double read_vector(const std::string &, double *, int) const
Definition: slha_io.cpp:957
void set_modsel(const Modsel &)
Definition: slha_io.cpp:829
void set_blocks(const std::vector< std::string > &, Position position=back)
Definition: slha_io.cpp:807
void set_matrix(const std::string &, const double *, const std::string &, double, int, int)
Definition: slha_io.cpp:993
void set_FlexibleDecay_settings(const FlexibleDecay_settings &)
Definition: slha_io.cpp:884
void set_vector(const std::string &, const double *, const std::string &, double, int)
Definition: slha_io.cpp:981
void set_effectivecouplings_block(const std::vector< std::tuple< int, int, int, double, std::string > > &)
Definition: slha_io.cpp:1028
double read_block(const std::string &, const Tuple_processor &) const
Definition: slha_io.cpp:687
void set_settings(const Spectrum_generator_settings &)
Definition: slha_io.cpp:858
void read_from_file(const std::string &)
opens SLHA input file and reads the content
Definition: slha_io.cpp:534
bool block_exists(const std::string &) const
Definition: slha_io.cpp:508
double read_entry(const std::string &, int) const
Definition: slha_io.cpp:739
void read_from_stream(std::istream &)
clears stored data and reads SLHA data from a stream
Definition: slha_io.cpp:548
void set_unitarity_infinite_s(Spectrum_generator_settings const &, UnitarityInfiniteS const &)
Definition: slha_io.cpp:923
std::unique_ptr< SLHAea::Coll > data
SHLA data.
Definition: slha_io.hpp:163
void read_from_source(const std::string &)
reads from source
Definition: slha_io.cpp:521
void set_block(const std::ostringstream &, Position position=back)
Definition: slha_io.cpp:788
void set_LToLConversion_settings(const LToLConversion_settings &)
Definition: slha_io.cpp:871
void set_matrix_imag(const std::string &, const double *, const std::string &, double, int, int)
Definition: slha_io.cpp:1017
static std::string block_head(const std::string &name, double scale)
Definition: slha_io.cpp:493
double read_scale(const std::string &) const
Definition: slha_io.cpp:771
std::function< void(int, double)> Tuple_processor
Definition: slha_io.hpp:97
void set_sminputs(const softsusy::QedQcd &)
Definition: slha_io.cpp:897
const SLHAea::Coll & get_data() const
Definition: slha_io.cpp:481
Modsel modsel
data from block MODSEL
Definition: slha_io.hpp:164
void set_block_imag(const std::string &, const Eigen::MatrixBase< Derived > &, const std::string &, double scale=0.)
Definition: slha_io.hpp:229
void fill(softsusy::QedQcd &) const
Definition: slha_io.cpp:578
double read_matrix(const std::string &, double *, int, int) const
Definition: slha_io.cpp:969
void set_data(const SLHAea::Coll &)
Definition: slha_io.cpp:487
void write_to_file(const std::string &) const
Definition: slha_io.cpp:935
void write_to_stream() const
Definition: slha_io.cpp:951
void set_physical_input(const Physical_input &)
Definition: slha_io.cpp:843
stores the spectrum generator settings
Quark and lepton masses and gauge couplings in QEDxQCD effective theory.
Definition: lowe.h:64
Comment if you want default softsusy behaviour.
Definition: lowe.cpp:37
bool quark_flavour_violated
MODSEL[6].
Definition: slha_io.hpp:100
bool lepton_flavour_violated
MODSEL[6].
Definition: slha_io.hpp:101
double parameter_output_scale
MODSEL[12].
Definition: slha_io.hpp:102