Version: SMASH-2.2
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 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) const
 Return the Woods-Saxon probability density for the given position. More...
 
virtual double nucleon_density_unnormalized (double r, 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 98 of file customnucleus.cc.

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

155  {
156  particles_.clear();
157  index_ = 0;
158  // checking if particle is proton or neutron
159  for (const auto& it : vec) {
160  PdgCode pdgcode;
161  if (it.isospin == 1) {
162  pdgcode = pdg::p;
163  } else if (it.isospin == 0) {
164  pdgcode = pdg::n;
165  } else {
166  throw std::runtime_error(
167  "Your particles charges are not 1 = proton or 0 = neutron.\n"
168  "Check whether your list is correct or there is an error.");
169  }
170  // setting parameters for the particles in the particlelist in smash
171  const ParticleType& current_type = ParticleType::find(pdgcode);
172  double current_mass = current_type.mass();
173  particles_.emplace_back(current_type);
174  particles_.back().set_4momentum(current_mass, 0.0, 0.0, 0.0);
175  }
176 }
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
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 178 of file customnucleus.cc.

178  {
179  /*
180  * As only arrange_nucleons is called at the beginning of every
181  * event it is important to have readfile and fill from list
182  * called again when a new event starts. The constructor is only
183  * called twice to initialize the first target and projectile.
184  * Therefore this if statement is implemented.
185  */
186  if (index_ >= custom_nucleus_.size()) {
189  }
190  const auto& pos = custom_nucleus_.at(index_);
191  index_++;
192  ThreeVector nucleon_position(pos.x, pos.y, pos.z);
193  // rotate nucleon about euler angle
194  nucleon_position.rotate(euler_phi_, euler_theta_, euler_psi_);
195 
196  return nucleon_position;
197 }
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
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 199 of file customnucleus.cc.

199  {
200  /* Randomly generate Euler angles for rotation everytime a new
201  * custom nucleus is initialized. Therefore this is done 2 times per
202  * event.
203  */
205 
206  for (auto i = begin(); i != end(); i++) {
207  // Initialize momentum
208  i->set_4momentum(i->pole_mass(), 0.0, 0.0, 0.0);
209  /* Sampling the Woods-Saxon, get the radial
210  * position and solid angle for the nucleon. */
211  ThreeVector pos = distribute_nucleon();
212  // Set the position of the nucleon.
213  i->set_4position(FourVector(0.0, pos));
214  }
215  // Recenter
216  align_center();
217 }
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:479
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
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 236 of file customnucleus.cc.

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

228  {
229  if (file_directory.back() == '/') {
230  return file_directory + file_name;
231  } else {
232  return file_directory + '/' + file_name;
233  }
234 }
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 219 of file customnucleus.cc.

219  {
221  logg[LCollider].warn() << "Fermi motion activated with a custom nucleus.\n";
222  logg[LCollider].warn() << "Be aware that generating the Fermi momenta\n"
223  << "assumes nucleons distributed according to a\n"
224  << "Woods-Saxon distribution.";
225 }
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
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: