Version: SMASH-2.0
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:
[legend]
Collaboration diagram for smash::CustomNucleus:
[legend]

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 align_center ()
 Shifts the nucleus so that its center is at (0,0,0) More...
 
virtual double nucleon_density (double r, double) const
 Return the Woods-Saxon probability density for the given position. 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
 
void set_saturation_density (double density)
 Sets the saturation density of the nucleus. More...
 
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 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 89 of file customnucleus.cc.

90  {
91  // Read in file directory from config
92  const std::string particle_list_file_directory =
93  config.take({"Custom", "File_Directory"});
94  // Read in file name from config
95  const std::string particle_list_file_name =
96  config.take({"Custom", "File_Name"});
97 
98  if (particles_.size() != 0) {
99  throw std::runtime_error(
100  "Your Particle List is already filled before reading in from the "
101  "external file."
102  "Something went wrong. Please check your config.");
103  }
104  /*
105  * Counts number of nucleons in one nucleus as it is specialized
106  * by the user in the config file.
107  * It is needed to read in the proper number of nucleons for one
108  * nucleus and to restart at the listreading for the following
109  * nucleus as one does not want to read configurations twice.
110  */
111  std::map<PdgCode, int> particle_list = config.take({"Particles"});
112  for (const auto& particle : particle_list) {
113  if (particle.first == pdg::p) {
114  number_of_protons_ = particle.second * testparticles;
115  } else if (particle.first == pdg::n) {
116  number_of_neutrons_ = particle.second * testparticles;
117  } else {
118  throw std::runtime_error(
119  "Your nucleus can only contain protons and/or neutrons."
120  "Please check what particles you have specified in the config");
121  }
123  }
124  /*
125  * "if" statement makes sure the streams to the file are initialized
126  * properly.
127  */
128  const std::string path =
129  file_path(particle_list_file_directory, particle_list_file_name);
130  if (same_file && !filestream_shared_) {
131  filestream_shared_ = make_unique<std::ifstream>(path);
133  } else if (!same_file) {
134  filestream_ = make_unique<std::ifstream>(path);
136  } else {
138  }
139 
142  // Inherited from nucleus class (see nucleus.h)
144 }
Here is the call graph for this function:

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 146 of file customnucleus.cc.

146  {
147  particles_.clear();
148  index_ = 0;
149  // checking if particle is proton or neutron
150  for (const auto& it : vec) {
151  PdgCode pdgcode;
152  if (it.isospin == 1) {
153  pdgcode = pdg::p;
154  } else if (it.isospin == 0) {
155  pdgcode = pdg::n;
156  } else {
157  throw std::runtime_error(
158  "Your particles charges are not 1 = proton or 0 = neutron.\n"
159  "Check whether your list is correct or there is an error.");
160  }
161  // setting parameters for the particles in the particlelist in smash
162  const ParticleType& current_type = ParticleType::find(pdgcode);
163  double current_mass = current_type.mass();
164  particles_.emplace_back(current_type);
165  particles_.back().set_4momentum(current_mass, 0.0, 0.0, 0.0);
166  }
167 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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 169 of file customnucleus.cc.

169  {
170  /*
171  * As only arrange_nucleons is called at the beginning of every
172  * event it is important to have readfile and fill from list
173  * called again when a new event starts. The constructor is only
174  * called twice to initialize the first target and projectile.
175  * Therefore this if statement is implemented.
176  */
177  if (index_ >= custom_nucleus_.size()) {
180  }
181  const auto& pos = custom_nucleus_.at(index_);
182  index_++;
183  ThreeVector nucleon_position(pos.x, pos.y, pos.z);
184  // rotate nucleon about euler angle
185  nucleon_position.rotate(euler_phi_, euler_theta_, euler_psi_);
186 
187  return nucleon_position;
188 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ arrange_nucleons()

void smash::CustomNucleus::arrange_nucleons ( )
overridevirtual

Sets the positions of the nucleons inside a nucleus.

Reimplemented from smash::Nucleus.

Definition at line 190 of file customnucleus.cc.

190  {
191  /* Randomly generate Euler angles for rotation everytime a new
192  * custom nucleus is initialized. Therefore this is done 2 times per
193  * event.
194  */
196 
197  for (auto i = begin(); i != end(); i++) {
198  // Initialize momentum
199  i->set_4momentum(i->pole_mass(), 0.0, 0.0, 0.0);
200  /* Sampling the Woods-Saxon, get the radial
201  * position and solid angle for the nucleon. */
202  ThreeVector pos = distribute_nucleon();
203  // Set the position of the nucleon.
204  i->set_4position(FourVector(0.0, pos));
205  }
206  // Recenter
207  align_center();
208 }
Here is the call graph for this function:

◆ 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 227 of file customnucleus.cc.

228  {
229  int proton_counter = 0;
230  int neutron_counter = 0;
231  std::string line;
232  std::vector<Nucleoncustom> custom_nucleus;
233  // read in only A particles for one nucleus
234  for (int i = 0; i < number_of_nucleons_; ++i) {
235  std::getline(infile, line);
236  // make sure the stream goes back to the beginning when it hits end of file
237  if (infile.eof()) {
238  infile.clear();
239  infile.seekg(0, infile.beg);
240  std::getline(infile, line);
241  }
242  Nucleoncustom nucleon;
243  std::istringstream iss(line);
244  if (!(iss >> nucleon.x >> nucleon.y >> nucleon.z >>
245  nucleon.spinprojection >> nucleon.isospin)) {
246  throw std::runtime_error(
247  "SMASH could not read in a line from your initial nuclei input file."
248  "\nCheck if your file has the following format: x y z "
249  "spinprojection isospin");
250  }
251  if (nucleon.isospin == 1) {
252  proton_counter++;
253  } else if (nucleon.isospin == 0) {
254  neutron_counter++;
255  }
256  custom_nucleus.push_back(nucleon);
257  }
258  if (proton_counter != number_of_protons_ ||
259  neutron_counter != number_of_neutrons_) {
260  throw std::runtime_error(
261  "Number of protons and/or neutrons in the nuclei input file does not "
262  "correspond to the number specified in the config.\nCheck the config "
263  "and your input file.");
264  } else {
265  return custom_nucleus;
266  }
267 }
Here is the caller graph for this function:

◆ 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 218 of file customnucleus.cc.

219  {
220  if (file_directory.back() == '/') {
221  return file_directory + file_name;
222  } else {
223  return file_directory + '/' + file_name;
224  }
225 }
Here is the caller graph for this function:

◆ 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 210 of file customnucleus.cc.

210  {
212  logg[LCollider].warn() << "Fermi motion activated with a custom nucleus.\n";
213  logg[LCollider].warn() << "Be aware that generating the Fermi momenta\n"
214  << "assumes nucleons distributed according to a\n"
215  << "Woods-Saxon distribution.";
216 }
Here is the call graph for this function:

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:
smash::CustomNucleus::distribute_nucleon
ThreeVector distribute_nucleon() override
Returns position of a nucleon as given in the external file.
Definition: customnucleus.cc:169
smash::Nucleus::random_euler_angles
void random_euler_angles()
Randomly generate Euler angles.
Definition: nucleus.cc:497
smash::Nucleus::generate_fermi_momenta
virtual void generate_fermi_momenta()
Generates momenta according to Fermi motion for the nucleons.
Definition: nucleus.cc:365
smash::Nucleus::begin
std::vector< ParticleData >::iterator begin()
For iterators over the particle list:
Definition: nucleus.h:273
smash::Nucleus::euler_theta_
double euler_theta_
Euler angel theta.
Definition: nucleus.h:267
smash::Nucleus::align_center
void align_center()
Shifts the nucleus so that its center is at (0,0,0)
Definition: nucleus.h:215
smash::logg
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
smash::Nucleus::set_parameters_automatic
virtual void set_parameters_automatic()
Sets the deformation parameters of the Woods-Saxon distribution according to the current mass number.
Definition: nucleus.cc:280
smash::Nucleus::particles_
std::vector< ParticleData > particles_
Particles associated with this nucleus.
Definition: nucleus.h:256
smash::ParticleType::find
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99
smash::CustomNucleus::filestream_
std::unique_ptr< std::ifstream > filestream_
Filestream variable used if projectile and target are read in from different files and they therefore...
Definition: customnucleus.h:103
smash::Nucleus::euler_psi_
double euler_psi_
Euler angel psi.
Definition: nucleus.h:269
smash::CustomNucleus::custom_nucleus_
std::vector< Nucleoncustom > custom_nucleus_
Vector contianing Data for one nucleus given in the particlelist.
Definition: customnucleus.h:118
smash::CustomNucleus::number_of_nucleons_
int number_of_nucleons_
Number of nucleons per nucleus Set initally to zero to be modified in the constructor.
Definition: customnucleus.h:112
smash::Nucleus::end
std::vector< ParticleData >::iterator end()
For iterators over the particle list:
Definition: nucleus.h:277
smash::CustomNucleus::number_of_neutrons_
int number_of_neutrons_
Number of neutrons per nucleus.
Definition: customnucleus.h:116
smash::LCollider
static constexpr int LCollider
Definition: collidermodus.cc:30
smash::CustomNucleus::used_filestream_
std::unique_ptr< std::ifstream > * used_filestream_
Pointer to the used filestream pointer.
Definition: customnucleus.h:105
smash::CustomNucleus::file_path
std::string file_path(const std::string &file_directory, const std::string &file_name)
Generates the name of the stream file.
Definition: customnucleus.cc:218
smash::CustomNucleus::number_of_protons_
int number_of_protons_
Number of protons per nucleus.
Definition: customnucleus.h:114
smash::Nucleus::euler_phi_
double euler_phi_
Euler angel phi.
Definition: nucleus.h:265
smash::CustomNucleus::filestream_shared_
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
smash::CustomNucleus::index_
size_t index_
Index needed to read out vector in distribute nucleon.
Definition: customnucleus.h:120
smash::CustomNucleus::fill_from_list
void fill_from_list(const std::vector< Nucleoncustom > &vec)
Fills Particlelist from vector containing data for one nucleus.
Definition: customnucleus.cc:146
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::pdg::n
constexpr int n
Neutron.
Definition: pdgcode_constants.h:30
smash::CustomNucleus::readfile
std::vector< Nucleoncustom > readfile(std::ifstream &infile) const
The returned vector contains Data for one nucleus given in the particlelist.
Definition: customnucleus.cc:227