Version: SMASH-3.1
smash::CustomNucleus Class Reference

#include <customnucleus.h>

Inheriting from Nucleus-Class using modified Nucleon configurations.

Configurations are read in from external lists.

Definition at line 41 of file customnucleus.h.

Inheritance diagram for smash::CustomNucleus:
smash::Nucleus

Public Member Functions

 CustomNucleus (Configuration &config, int testparticles, bool same_file)
 Constructor that needs configuration parameters from input file and the number of testparticles. More...
 
void fill_from_list (const std::vector< Nucleoncustom > &vec)
 Fills Particlelist from vector containing data for one nucleus. More...
 
ThreeVector distribute_nucleon () override
 Returns position of a nucleon as given in the external file. More...
 
void arrange_nucleons () override
 Sets the positions of the nucleons inside a nucleus. More...
 
std::vector< Nucleoncustomreadfile (std::ifstream &infile) const
 The returned vector contains Data for one nucleus given in the particlelist. More...
 
std::string file_path (const std::string &file_directory, const std::string &file_name)
 Generates the name of the stream file. More...
 
void generate_fermi_momenta () override
 Generates Fermi momenta as it is done in the mother class but in addition prints a warning that the Fermi momenta are generated accoriding to Woods-Saxon distributed nucleons. More...
 
- Public Member Functions inherited from smash::Nucleus
 Nucleus ()=default
 default constructor More...
 
 Nucleus (Configuration &config, int nTest)
 Constructor for Nucleus, that needs the configuration parameters from the inputfile and the number of testparticles. More...
 
 Nucleus (const std::map< PdgCode, int > &particle_list, int nTest)
 Constructor which directly initializes the Nucleus with particles and respective counts. More...
 
virtual ~Nucleus ()=default
 
double mass () const
 
double woods_saxon (double x)
 Woods-Saxon distribution. More...
 
virtual void set_parameters_automatic ()
 Sets the deformation parameters of the Woods-Saxon distribution according to the current mass number. More...
 
virtual void set_parameters_from_config (Configuration &config)
 Sets the parameters of the Woods-Saxon according to manually added values in the configuration file. More...
 
void boost (double beta_scalar)
 Boosts the nuclei into the computational frame, such that the nucleons have the appropriate momentum and the nuclei are lorentz-contracted. More...
 
void fill_from_list (const std::map< PdgCode, int > &particle_list, int testparticles)
 Adds particles from a map PDG code => Number_of_particles_with_that_PDG_code to the nucleus. More...
 
void shift (double z_offset, double x_offset, double simulation_time)
 Shifts the nucleus to correct impact parameter and z displacement. More...
 
virtual void rotate ()
 Rotates the nucleus. More...
 
void copy_particles (Particles *particles)
 Copies the particles from this nucleus into the particle list. More...
 
size_t size () const
 Number of numerical (=test-)particles in the nucleus: More...
 
size_t number_of_particles () const
 Number of physical particles in the nucleus: More...
 
size_t number_of_protons () const
 Number of physical protons in the nucleus: More...
 
FourVector center () const
 Calculate geometrical center of the nucleus. More...
 
void set_label (BelongsTo label)
 Sets target / projectile labels on nucleons. More...
 
void align_center ()
 Shifts the nucleus so that its center is at (0,0,0) More...
 
virtual double nucleon_density (double r, double, double) const
 Return the Woods-Saxon probability density for the given position. More...
 
virtual double nucleon_density_unnormalized (double r, double, double) const
 Return the unnormalized Woods-Saxon distribution for the given position without deformation. More...
 
virtual double calculate_saturation_density () const
 
virtual void set_saturation_density (double density)
 Sets the saturation density of the nucleus. More...
 
std::vector< ParticleData >::iterator begin ()
 For iterators over the particle list: More...
 
std::vector< ParticleData >::iterator end ()
 For iterators over the particle list: More...
 
std::vector< ParticleData >::const_iterator cbegin () const
 For const iterators over the particle list: More...
 
std::vector< ParticleData >::const_iterator cend () const
 For const iterators over the particle list: More...
 
void set_diffusiveness (double diffuse)
 Sets the diffusiveness of the nucleus. More...
 
double get_diffusiveness () const
 
double get_saturation_density () const
 
double default_nuclear_radius ()
 Default nuclear radius calculated as: More...
 
void set_nuclear_radius (double rad)
 Sets the nuclear radius. More...
 
double get_nuclear_radius () const
 

Private Attributes

std::unique_ptr< std::ifstream > filestream_
 Filestream variable used if projectile and target are read in from different files and they therefore use different streams. More...
 
std::unique_ptr< std::ifstream > * used_filestream_
 Pointer to the used filestream pointer. More...
 
int number_of_nucleons_ = 0
 Number of nucleons per nucleus Set initally to zero to be modified in the constructor. More...
 
int number_of_protons_ = 0
 Number of protons per nucleus. More...
 
int number_of_neutrons_ = 0
 Number of neutrons per nucleus. More...
 
std::vector< Nucleoncustomcustom_nucleus_
 Vector contianing Data for one nucleus given in the particlelist. More...
 
size_t index_ = 0
 Index needed to read out vector in distribute nucleon. More...
 

Static Private Attributes

static std::unique_ptr< std::ifstream > filestream_shared_ = nullptr
 Filestream variable used if projectile and target are read in from the same file and they use the same static stream. More...
 

Additional Inherited Members

- Protected Member Functions inherited from smash::Nucleus
void random_euler_angles ()
 Randomly generate Euler angles. More...
 
- Protected Attributes inherited from smash::Nucleus
std::vector< ParticleDataparticles_
 Particles associated with this nucleus. More...
 
double saturation_density_ = nuclear_density
 Saturation density of this nucleus. More...
 
double euler_phi_
 Euler angel phi. More...
 
double euler_theta_
 Euler angel theta. More...
 
double euler_psi_
 Euler angel psi. More...
 

Constructor & Destructor Documentation

◆ CustomNucleus()

smash::CustomNucleus::CustomNucleus ( Configuration config,
int  testparticles,
bool  same_file 
)

Constructor that needs configuration parameters from input file and the number of testparticles.

Parameters
[in]configcontains the parameters from the inputfile on the numbers of particles with a certain PDG code and also the path where the external particle list is located
[in]testparticlesrepresents the number of testparticles
[in]same_filespecifies if target and projectile nucleus are read in from the same file, which is important for the ifstream

Definition at line 24 of file customnucleus.cc.

25  {
26  // Read in file directory from config
27  const std::string particle_list_file_directory =
28  config.take({"Custom", "File_Directory"});
29  // Read in file name from config
30  const std::string particle_list_file_name =
31  config.take({"Custom", "File_Name"});
32 
33  if (particles_.size() != 0) {
34  throw std::runtime_error(
35  "Your Particle List is already filled before reading in from the "
36  "external file."
37  "Something went wrong. Please check your config.");
38  }
39  /*
40  * Counts number of nucleons in one nucleus as it is specialized
41  * by the user in the config file.
42  * It is needed to read in the proper number of nucleons for one
43  * nucleus and to restart at the listreading for the following
44  * nucleus as one does not want to read configurations twice.
45  */
46  std::map<PdgCode, int> particle_list = config.take({"Particles"});
47  for (const auto& particle : particle_list) {
48  if (particle.first == pdg::p) {
49  number_of_protons_ = particle.second * testparticles;
50  } else if (particle.first == pdg::n) {
51  number_of_neutrons_ = particle.second * testparticles;
52  } else {
53  throw std::runtime_error(
54  "Your nucleus can only contain protons and/or neutrons."
55  "Please check what particles you have specified in the config");
56  }
58  }
59  /*
60  * "if" statement makes sure the streams to the file are initialized
61  * properly.
62  */
63  const std::string path =
64  file_path(particle_list_file_directory, particle_list_file_name);
65  if (same_file && !filestream_shared_) {
66  filestream_shared_ = std::make_unique<std::ifstream>(path);
68  } else if (!same_file) {
69  filestream_ = std::make_unique<std::ifstream>(path);
71  } else {
73  }
74 
77  // Inherited from nucleus class (see nucleus.h)
79 }
std::string file_path(const std::string &file_directory, const std::string &file_name)
Generates the name of the stream file.
static std::unique_ptr< std::ifstream > filestream_shared_
Filestream variable used if projectile and target are read in from the same file and they use the sam...
Definition: customnucleus.h:98
int number_of_protons_
Number of protons per nucleus.
std::vector< Nucleoncustom > custom_nucleus_
Vector contianing Data for one nucleus given in the particlelist.
int number_of_neutrons_
Number of neutrons per nucleus.
int number_of_nucleons_
Number of nucleons per nucleus Set initally to zero to be modified in the constructor.
std::unique_ptr< std::ifstream > filestream_
Filestream variable used if projectile and target are read in from different files and they therefore...
std::vector< Nucleoncustom > readfile(std::ifstream &infile) const
The returned vector contains Data for one nucleus given in the particlelist.
void fill_from_list(const std::vector< Nucleoncustom > &vec)
Fills Particlelist from vector containing data for one nucleus.
std::unique_ptr< std::ifstream > * used_filestream_
Pointer to the used filestream pointer.
virtual void set_parameters_automatic()
Sets the deformation parameters of the Woods-Saxon distribution according to the current mass number.
Definition: nucleus.cc:282
std::vector< ParticleData > particles_
Particles associated with this nucleus.
Definition: nucleus.h:288
constexpr int p
Proton.
constexpr int n
Neutron.

Member Function Documentation

◆ fill_from_list()

void smash::CustomNucleus::fill_from_list ( const std::vector< Nucleoncustom > &  vec)

Fills Particlelist from vector containing data for one nucleus.

The data contains everything that is written in struct Nucleoncustom.

Parameters
[in]vecvector containing data from external list for one nucleus

Definition at line 81 of file customnucleus.cc.

81  {
82  particles_.clear();
83  index_ = 0;
84  // checking if particle is proton or neutron
85  for (const auto& it : vec) {
86  PdgCode pdgcode;
87  if (it.isospin == 1) {
88  pdgcode = pdg::p;
89  } else if (it.isospin == 0) {
90  pdgcode = pdg::n;
91  } else {
92  throw std::runtime_error(
93  "Your particles charges are not 1 = proton or 0 = neutron.\n"
94  "Check whether your list is correct or there is an error.");
95  }
96  // setting parameters for the particles in the particlelist in smash
97  const ParticleType& current_type = ParticleType::find(pdgcode);
98  double current_mass = current_type.mass();
99  particles_.emplace_back(current_type);
100  particles_.back().set_4momentum(current_mass, 0.0, 0.0, 0.0);
101  }
102 }
size_t index_
Index needed to read out vector in distribute nucleon.
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99

◆ distribute_nucleon()

ThreeVector smash::CustomNucleus::distribute_nucleon ( )
overridevirtual

Returns position of a nucleon as given in the external file.

Reimplemented from smash::Nucleus.

Definition at line 104 of file customnucleus.cc.

104  {
105  /*
106  * As only arrange_nucleons is called at the beginning of every
107  * event it is important to have readfile and fill from list
108  * called again when a new event starts. The constructor is only
109  * called twice to initialize the first target and projectile.
110  * Therefore this if statement is implemented.
111  */
112  if (index_ >= custom_nucleus_.size()) {
115  }
116  const auto& pos = custom_nucleus_.at(index_);
117  index_++;
118  ThreeVector nucleon_position(pos.x, pos.y, pos.z);
119  // rotate nucleon about euler angle
120  nucleon_position.rotate(euler_phi_, euler_theta_, euler_psi_);
121 
122  return nucleon_position;
123 }
double euler_theta_
Euler angel theta.
Definition: nucleus.h:303
double euler_phi_
Euler angel phi.
Definition: nucleus.h:301
double euler_psi_
Euler angel psi.
Definition: nucleus.h:305

◆ arrange_nucleons()

void smash::CustomNucleus::arrange_nucleons ( )
overridevirtual

Sets the positions of the nucleons inside a nucleus.

Reimplemented from smash::Nucleus.

Definition at line 125 of file customnucleus.cc.

125  {
126  /* Randomly generate Euler angles for rotation everytime a new
127  * custom nucleus is initialized. Therefore this is done 2 times per
128  * event.
129  */
131 
132  for (auto i = begin(); i != end(); i++) {
133  // Initialize momentum
134  i->set_4momentum(i->pole_mass(), 0.0, 0.0, 0.0);
135  /* Sampling the Woods-Saxon, get the radial
136  * position and solid angle for the nucleon. */
137  ThreeVector pos = distribute_nucleon();
138  // Set the position of the nucleon.
139  i->set_4position(FourVector(0.0, pos));
140  }
141  // Recenter
142  align_center();
143 }
ThreeVector distribute_nucleon() override
Returns position of a nucleon as given in the external file.
void random_euler_angles()
Randomly generate Euler angles.
Definition: nucleus.cc:480
void align_center()
Shifts the nucleus so that its center is at (0,0,0)
Definition: nucleus.h:223
std::vector< ParticleData >::iterator begin()
For iterators over the particle list:
Definition: nucleus.h:309
std::vector< ParticleData >::iterator end()
For iterators over the particle list:
Definition: nucleus.h:313

◆ readfile()

std::vector< Nucleoncustom > smash::CustomNucleus::readfile ( std::ifstream &  infile) const

The returned vector contains Data for one nucleus given in the particlelist.

Parameters
[in]infileis needed to read in from the external file

Definition at line 162 of file customnucleus.cc.

163  {
164  int proton_counter = 0;
165  int neutron_counter = 0;
166  std::string line;
167  std::vector<Nucleoncustom> custom_nucleus;
168  // read in only A particles for one nucleus
169  for (int i = 0; i < number_of_nucleons_; ++i) {
170  std::getline(infile, line);
171  // make sure the stream goes back to the beginning when it hits end of file
172  if (infile.eof()) {
173  infile.clear();
174  infile.seekg(0, infile.beg);
175  std::getline(infile, line);
176  }
177  Nucleoncustom nucleon;
178  std::istringstream iss(line);
179  if (!(iss >> nucleon.x >> nucleon.y >> nucleon.z >>
180  nucleon.spinprojection >> nucleon.isospin)) {
181  throw std::runtime_error(
182  "SMASH could not read in a line from your initial nuclei input file."
183  "\nCheck if your file has the following format: x y z "
184  "spinprojection isospin");
185  }
186  if (nucleon.isospin == 1) {
187  proton_counter++;
188  } else if (nucleon.isospin == 0) {
189  neutron_counter++;
190  }
191  custom_nucleus.push_back(nucleon);
192  }
193  if (proton_counter != number_of_protons_ ||
194  neutron_counter != number_of_neutrons_) {
195  throw std::runtime_error(
196  "Number of protons and/or neutrons in the nuclei input file does not "
197  "correspond to the number specified in the config.\nCheck the config "
198  "and your input file.");
199  } else {
200  return custom_nucleus;
201  }
202 }

◆ file_path()

std::string smash::CustomNucleus::file_path ( const std::string &  file_directory,
const std::string &  file_name 
)

Generates the name of the stream file.

Parameters
[in]file_directoryis the path to the external file
[in]file_nameis the name of the external file

Definition at line 153 of file customnucleus.cc.

154  {
155  if (file_directory.back() == '/') {
156  return file_directory + file_name;
157  } else {
158  return file_directory + '/' + file_name;
159  }
160 }

◆ generate_fermi_momenta()

void smash::CustomNucleus::generate_fermi_momenta ( )
overridevirtual

Generates Fermi momenta as it is done in the mother class but in addition prints a warning that the Fermi momenta are generated accoriding to Woods-Saxon distributed nucleons.

Reimplemented from smash::Nucleus.

Definition at line 145 of file customnucleus.cc.

145  {
147  logg[LCollider].warn() << "Fermi motion activated with a custom nucleus.\n";
148  logg[LCollider].warn() << "Be aware that generating the Fermi momenta\n"
149  << "assumes nucleons distributed according to a\n"
150  << "Woods-Saxon distribution.";
151 }
virtual void generate_fermi_momenta()
Generates momenta according to Fermi motion for the nucleons.
Definition: nucleus.cc:348
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
static constexpr int LCollider

Member Data Documentation

◆ filestream_shared_

std::unique_ptr< std::ifstream > smash::CustomNucleus::filestream_shared_ = nullptr
staticprivate

Filestream variable used if projectile and target are read in from the same file and they use the same static stream.

Definition at line 98 of file customnucleus.h.

◆ filestream_

std::unique_ptr<std::ifstream> smash::CustomNucleus::filestream_
private

Filestream variable used if projectile and target are read in from different files and they therefore use different streams.

Definition at line 103 of file customnucleus.h.

◆ used_filestream_

std::unique_ptr<std::ifstream>* smash::CustomNucleus::used_filestream_
private

Pointer to the used filestream pointer.

Definition at line 105 of file customnucleus.h.

◆ number_of_nucleons_

int smash::CustomNucleus::number_of_nucleons_ = 0
private

Number of nucleons per nucleus Set initally to zero to be modified in the constructor.

Is obtained by adding the proton and neutron numbers specified in the config.yaml

Definition at line 112 of file customnucleus.h.

◆ number_of_protons_

int smash::CustomNucleus::number_of_protons_ = 0
private

Number of protons per nucleus.

Definition at line 114 of file customnucleus.h.

◆ number_of_neutrons_

int smash::CustomNucleus::number_of_neutrons_ = 0
private

Number of neutrons per nucleus.

Definition at line 116 of file customnucleus.h.

◆ custom_nucleus_

std::vector<Nucleoncustom> smash::CustomNucleus::custom_nucleus_
private

Vector contianing Data for one nucleus given in the particlelist.

Definition at line 118 of file customnucleus.h.

◆ index_

size_t smash::CustomNucleus::index_ = 0
private

Index needed to read out vector in distribute nucleon.

Definition at line 120 of file customnucleus.h.


The documentation for this class was generated from the following files: