Loading [MathJax]/extensions/tex2jax.js
 Version: SMASH-3.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
smash::RootOutput Class Reference

#include <rootoutput.h>

\brief SMASH output to ROOT file

SMASH supports ROOT output as an option (see http://root.cern.ch). The ROOT framework needs to be installed before building SMASH, otherwise ROOT support will be disabled.

This class produces file Particles.root, which contains a ROOT TTree. TTree contains information about particles from all SMASH events comprising a simulation. Output is happening in blocks. All particles in a block are at the same time and in the same event. However, it is possible that different blocks are at the same time and from the same event. Particle information is stored in TBranches. For each particle characteristic there is a separate branch. Currently these are t,x,y,z (coordinates), p0,px,py,pz (4-momentum), pdgcode - PDG code of the particle, characterizing its type, charge - electric charge of the particle, ev - event number in a given block, tcounter - number of the output block in a given event, npart - number of particles in the block, test_p - number of testpartciles per particle, modus_l - modus length, current_t - time associated with the output block, in fm, impact_b - impact parameter of the event, empty_event - whether there was no interaction between the projectile and the target, E_kinetic_tot - total kinetic energy in the system, E_fields_tot - total mean field energy * test_p, E_total - sum of E_kinetic_tot and E_fields_tot.

This class also produces file Collisions.root, organized in the same way, with a few additional fields: nin and nout - characterize number of incoming and outgoing particles in the reaction, with nin + nout = npart, weight - an action weight, whose meaning depends on the type of action: For collisions it is the total cross section, for decays it is the total decay width and for dilepton decays it is the shining weight.

If "Collisions:" section is present, then in addition to a file Particles.root with particles TTree, another file Collisions.root is created. It contains information about each collision, written as one leaf: nin, nout - number of incoming and outgoing particles, ev - event number, weight - total weight of the collision (wgt), partial_weight - partial weight of the collision (par_wgt), (t,x,y,z), (p0,px,py,pz) - arrays of dimension nin+nout that contain coordinates and momenta.

Definition at line 78 of file rootoutput.h.

Inheritance diagram for smash::RootOutput:
smash::OutputInterface

Public Member Functions

 RootOutput (const std::filesystem::path &path, const std::string &name, const OutputParameters &out_par)
 Construct ROOT output. More...
 
 ~RootOutput ()
 Destructor. More...
 
void at_eventstart (const Particles &particles, const EventLabel &event_label, const EventInfo &event) override
 update event number and writes intermediate particles to a tree. More...
 
void at_eventend (const Particles &particles, const EventLabel &event_label, const EventInfo &event) override
 update event number and impact parameter, and writes intermediate particles to a tree. More...
 
void at_intermediate_time (const Particles &particles, const std::unique_ptr< Clock > &clock, const DensityParameters &dens_param, const EventLabel &event_label, const EventInfo &event) override
 Writes intermediate particles to a tree defined by treename, if it is allowed (i.e., particles_only_final_ is No). More...
 
void at_interaction (const Action &action, const double density) override
 Writes collisions to a tree defined by treename. More...
 
- Public Member Functions inherited from smash::OutputInterface
 OutputInterface (std::string name)
 Construct output interface. More...
 
virtual ~OutputInterface ()=0
 Pure virtual destructor to make class abstract and prevent its instantiation. More...
 
virtual void at_eventstart (const std::vector< Particles > &, int)
 Output launched at event start after initialization, when particles are generated but not yet propagated. More...
 
virtual void at_eventstart (const int, const ThermodynamicQuantity, const DensityType, RectangularLattice< DensityOnLattice >)
 Output launched at event start after initialization, when particles are generated but not yet propagated. More...
 
virtual void at_eventstart (const int, const ThermodynamicQuantity, const DensityType, RectangularLattice< EnergyMomentumTensor >)
 Output launched at event start after initialization, when particles are generated but not yet propagated. More...
 
virtual void at_eventend (const ThermodynamicQuantity)
 Output launched at event end. More...
 
virtual void at_eventend (const std::vector< Particles > &, const int)
 Output launched at event end. More...
 
virtual void at_intermediate_time (const std::vector< Particles > &, const std::unique_ptr< Clock > &, const DensityParameters &)
 Output launched after every N'th timestep. More...
 
virtual void thermodynamics_output (const ThermodynamicQuantity, const DensityType, RectangularLattice< DensityOnLattice > &)
 Output to write thermodynamics from the lattice. More...
 
virtual void thermodynamics_output (const ThermodynamicQuantity, const DensityType, RectangularLattice< EnergyMomentumTensor > &)
 Output to write energy-momentum tensor and related quantities from the lattice. More...
 
virtual void thermodynamics_lattice_output (RectangularLattice< DensityOnLattice > &, const double)
 Output to write thermodynamics from the lattice. More...
 
virtual void thermodynamics_lattice_output (RectangularLattice< DensityOnLattice > &, const double, const std::vector< Particles > &, const DensityParameters &)
 Output to write thermodynamics from the lattice. More...
 
virtual void thermodynamics_lattice_output (const ThermodynamicQuantity, RectangularLattice< EnergyMomentumTensor > &, const double)
 Output to write energy-momentum tensor and related quantities from the lattice. More...
 
virtual void thermodynamics_output (const GrandCanThermalizer &)
 Output to write energy-momentum tensor and related quantities from the thermalizer class. More...
 
virtual void fields_output (const std::string, const std::string, RectangularLattice< std::pair< ThreeVector, ThreeVector >> &)
 Write fields in vtk output Fields are a pair of threevectors for example electric and magnetic field. More...
 
bool is_dilepton_output () const
 Get, whether this is the dilepton output? More...
 
bool is_photon_output () const
 Get, whether this is the photon output? More...
 
bool is_IC_output () const
 Get, whether this is the IC output? More...
 
const char * to_string (const ThermodynamicQuantity tq)
 Convert thermodynamic quantities to strings. More...
 
const char * to_string (const DensityType dens_type)
 Convert density types to strings. More...
 

Private Member Functions

template<typename T >
void particles_to_tree (T &particles)
 Writes particles to a tree defined by treename. More...
 
void collisions_to_tree (const ParticleList &incoming, const ParticleList &outgoing, const double weight, const double partial_weight)
 Writes collisions to a tree defined by treename. More...
 

Private Attributes

const std::filesystem::path filename_
 Filename of output. More...
 
std::filesystem::path filename_unfinished_
 Filename of output as long as simulation is still running. More...
 
std::unique_ptr< TFile > root_out_file_
 Pointer to root output file. More...
 
TTree * particles_tree_
 TTree for particles output. More...
 
TTree * collisions_tree_
 TTree for collision output. More...
 
int output_counter_ = 0
 Number of output in a given event. More...
 
int current_event_ = 0
 Number of current event. More...
 
int current_ensemble_ = 0
 Number of current ensemble. More...
 

Static Private Attributes

static const int max_buffer_size_ = 500000
 Maximal buffer size. More...
 

Buffer for filling TTree

See class documentation for definitions.

std::vector< double > p0_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > px_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > py_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > pz_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > t_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > x_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > y_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > z_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > formation_time_
 Property that is written to ROOT output. More...
 
std::vector< double > xsec_factor_ = std::vector<double>(max_buffer_size_, 0.0)
 Property that is written to ROOT output. More...
 
std::vector< double > time_last_coll_
 Property that is written to ROOT output. More...
 
std::vector< int > pdgcode_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > charge_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > coll_per_part_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > proc_id_origin_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > proc_type_origin_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > pdg_mother1_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > pdg_mother2_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > baryon_number_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
std::vector< int > strangeness_ = std::vector<int>(max_buffer_size_, 0)
 Property that is written to ROOT output. More...
 
int npart_
 Property that is written to ROOT output. More...
 
int tcounter_
 Property that is written to ROOT output. More...
 
int ev_
 Property that is written to ROOT output. More...
 
int ens_
 Property that is written to ROOT output. More...
 
int nin_
 Property that is written to ROOT output. More...
 
int nout_
 Property that is written to ROOT output. More...
 
int test_p_
 Property that is written to ROOT output. More...
 
double wgt_
 Property that is written to ROOT output. More...
 
double par_wgt_
 Property that is written to ROOT output. More...
 
double impact_b_
 Property that is written to ROOT output. More...
 
double modus_l_
 Property that is written to ROOT output. More...
 
double current_t_
 Property that is written to ROOT output. More...
 
double E_kinetic_tot_
 Property that is written to ROOT output. More...
 
double E_fields_tot_
 Property that is written to ROOT output. More...
 
double E_tot_
 Property that is written to ROOT output. More...
 
bool empty_event_
 Property that is written to ROOT output. More...
 
bool write_collisions_
 Option to write collisions tree. More...
 
bool write_particles_
 Option to write particles tree. More...
 
bool write_initial_conditions_
 Option to write particles tree for initial conditions. More...
 
OutputOnlyFinal particles_only_final_
 Print only final particles in the event, no intermediate output. More...
 
int autosave_frequency_ = -1
 ROOT file cannot be read if it was not properly closed and finalized. More...
 
const bool part_extended_
 Whether extended particle output is on. More...
 
const bool coll_extended_
 Whether extended collisions output is on. More...
 
const bool ic_extended_
 Whether extended ic output is on. More...
 
void init_trees ()
 Basic initialization routine, creating the TTree objects for particles and collisions. More...
 

Additional Inherited Members

- Protected Attributes inherited from smash::OutputInterface
const bool is_dilepton_output_
 Is this the dilepton output? More...
 
const bool is_photon_output_
 Is this the photon output? More...
 
const bool is_IC_output_
 Is this the IC output? More...
 

Constructor & Destructor Documentation

◆ RootOutput()

smash::RootOutput::RootOutput ( const std::filesystem::path &  path,
const std::string &  name,
const OutputParameters out_par 
)

Construct ROOT output.

Parameters
[in]pathOutput path.
[in]nameName of the ouput.
[in]out_parA structure containing parameters of the output.

Definition at line 233 of file rootoutput.cc.

235  : OutputInterface(name),
236  filename_(path / (name + ".root")),
237  write_collisions_(name == "Collisions" || name == "Dileptons" ||
238  name == "Photons"),
239  write_particles_(name == "Particles"),
240  write_initial_conditions_(name == "SMASH_IC"),
241  particles_only_final_(out_par.part_only_final),
242  part_extended_(out_par.part_extended),
243  coll_extended_(out_par.coll_extended),
244  ic_extended_(out_par.ic_extended) {
246  filename_unfinished_ += ".unfinished";
248  std::make_unique<TFile>(filename_unfinished_.native().c_str(), "NEW");
249  init_trees();
250 }
OutputInterface(std::string name)
Construct output interface.
OutputOnlyFinal particles_only_final_
Print only final particles in the event, no intermediate output.
Definition: rootoutput.h:227
bool write_collisions_
Option to write collisions tree.
Definition: rootoutput.h:218
const std::filesystem::path filename_
Filename of output.
Definition: rootoutput.h:134
bool write_initial_conditions_
Option to write particles tree for initial conditions.
Definition: rootoutput.h:224
const bool part_extended_
Whether extended particle output is on.
Definition: rootoutput.h:244
std::unique_ptr< TFile > root_out_file_
Pointer to root output file.
Definition: rootoutput.h:138
std::filesystem::path filename_unfinished_
Filename of output as long as simulation is still running.
Definition: rootoutput.h:136
const bool coll_extended_
Whether extended collisions output is on.
Definition: rootoutput.h:246
void init_trees()
Basic initialization routine, creating the TTree objects for particles and collisions.
Definition: rootoutput.cc:252
const bool ic_extended_
Whether extended ic output is on.
Definition: rootoutput.h:248
bool write_particles_
Option to write particles tree.
Definition: rootoutput.h:221

◆ ~RootOutput()

smash::RootOutput::~RootOutput ( )

Destructor.

RootOutput destructor.

Writes root objects (here TTrees) to file and closes it.

Definition at line 357 of file rootoutput.cc.

357  {
358  // kOverwrite option prevents from writing extra TKey objects into root file
359  root_out_file_->Write("", TObject::kOverwrite);
360  root_out_file_->Close();
361  std::filesystem::rename(filename_unfinished_, filename_);
362 }

Member Function Documentation

◆ at_eventstart()

void smash::RootOutput::at_eventstart ( const Particles particles,
const EventLabel event_label,
const EventInfo event 
)
overridevirtual

update event number and writes intermediate particles to a tree.

Parameters
[in]particlesParticles to be written to output.
[in]event_labelNumbers of event and ensemble.
[in]eventEvent info, see event_info

Reimplemented from smash::OutputInterface.

Definition at line 364 of file rootoutput.cc.

366  {
367  // save event and ensemble numbers
368  current_event_ = event_label.event_number;
369  current_ensemble_ = event_label.ensemble_number;
370 
371  modus_l_ = event.modus_length;
372  test_p_ = event.test_particles;
373  current_t_ = event.current_time;
374  E_kinetic_tot_ = event.total_kinetic_energy;
375  E_fields_tot_ = event.total_mean_field_energy;
376  E_tot_ = event.total_energy;
377 
379  output_counter_ = 0;
380  // This is to have only one output of positive impact parameter per event
381  impact_b_ = -1.0;
382  empty_event_ = false;
383  particles_to_tree(particles);
384  output_counter_++;
385  }
386 }
double current_t_
Property that is written to ROOT output.
Definition: rootoutput.h:212
int current_event_
Number of current event.
Definition: rootoutput.h:172
double E_kinetic_tot_
Property that is written to ROOT output.
Definition: rootoutput.h:213
int test_p_
Property that is written to ROOT output.
Definition: rootoutput.h:211
double modus_l_
Property that is written to ROOT output.
Definition: rootoutput.h:212
void particles_to_tree(T &particles)
Writes particles to a tree defined by treename.
Definition: rootoutput.cc:473
double impact_b_
Property that is written to ROOT output.
Definition: rootoutput.h:212
int current_ensemble_
Number of current ensemble.
Definition: rootoutput.h:174
bool empty_event_
Property that is written to ROOT output.
Definition: rootoutput.h:214
double E_fields_tot_
Property that is written to ROOT output.
Definition: rootoutput.h:213
int output_counter_
Number of output in a given event.
Definition: rootoutput.h:170
double E_tot_
Property that is written to ROOT output.
Definition: rootoutput.h:213
@ No
Print initial, intermediate and final-state particles.

◆ at_eventend()

void smash::RootOutput::at_eventend ( const Particles particles,
const EventLabel event_label,
const EventInfo event 
)
overridevirtual

update event number and impact parameter, and writes intermediate particles to a tree.

Parameters
[in]particlesParticles to be written to output.
[in]event_labelNumbers of event and ensemble.
[in]eventEvent info, see event_info

Reimplemented from smash::OutputInterface.

Definition at line 407 of file rootoutput.cc.

409  {
410  current_ensemble_ = event_label.ensemble_number;
411  modus_l_ = event.modus_length;
412  test_p_ = event.test_particles;
413  current_t_ = event.current_time;
414  E_kinetic_tot_ = event.total_kinetic_energy;
415  E_fields_tot_ = event.total_mean_field_energy;
416  E_tot_ = event.total_energy;
417 
418  impact_b_ = event.impact_parameter;
419  empty_event_ = event.empty_event;
420  if (write_particles_ &&
421  !(event.empty_event &&
423  particles_to_tree(particles);
424  }
425  /* Calculate the autosave frequency to be used. In case multiple ensembles are
426  * used this has to be at least 1, so set it to 1 if the number of ensembles
427  * is larger than the initial value of the autosave frequency. The evaluation
428  * of the actual frequency to be used has to be done only once, i.e. when the
429  * autosave_frequency_ has still its meaningless initial negative value. */
430  if (autosave_frequency_ < 0) {
431  autosave_frequency_ = 1000 / event.n_ensembles;
432  if (autosave_frequency_ == 0) {
434  }
435  }
436  /* Forced regular dump from operational memory to disk. Very demanding!
437  * If program crashes written data will NOT be lost. */
440  particles_tree_->AutoSave("SaveSelf");
441  }
442  if (write_collisions_) {
443  collisions_tree_->AutoSave("SaveSelf");
444  }
445  }
446 
448  // If the runtime is too short some particles might not yet have
449  // reached the hypersurface. Warning is printed.
450  if (particles.size() != 0 && !event.impose_kinematic_cut_for_SMASH_IC) {
452  "End time might be too small for initial conditions output. "
453  "Hypersurface has not yet been crossed by ",
454  particles.size(), " particle(s).");
455  }
456  }
457 }
TTree * collisions_tree_
TTree for collision output.
Definition: rootoutput.h:152
int autosave_frequency_
ROOT file cannot be read if it was not properly closed and finalized.
Definition: rootoutput.h:241
TTree * particles_tree_
TTree for particles output.
Definition: rootoutput.h:145
@ IfNotEmpty
Print only final-state particles, and those only if the event is not empty.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:40
static constexpr int LHyperSurfaceCrossing
Definition: binaryoutput.cc:22

◆ at_intermediate_time()

void smash::RootOutput::at_intermediate_time ( const Particles particles,
const std::unique_ptr< Clock > &  clock,
const DensityParameters dens_param,
const EventLabel event_label,
const EventInfo event 
)
overridevirtual

Writes intermediate particles to a tree defined by treename, if it is allowed (i.e., particles_only_final_ is No).

Parameters
[in]particlesParticles to be written to output.
[in]clockUnused, needed since inherited.
[in]dens_paramUnused, needed since inherited.
[in]event_labelNumbers of event and ensemble.
[in]eventEvent info, see event_info

Reimplemented from smash::OutputInterface.

Definition at line 388 of file rootoutput.cc.

392  {
393  current_ensemble_ = event_label.ensemble_number;
394  modus_l_ = event.modus_length;
395  test_p_ = event.test_particles;
396  current_t_ = event.current_time;
397  E_kinetic_tot_ = event.total_kinetic_energy;
398  E_fields_tot_ = event.total_mean_field_energy;
399  E_tot_ = event.total_energy;
400 
402  particles_to_tree(particles);
403  output_counter_++;
404  }
405 }

◆ at_interaction()

void smash::RootOutput::at_interaction ( const Action action,
const double  density 
)
overridevirtual

Writes collisions to a tree defined by treename.

Parameters
[in]actionan Action object containing incoming, outgoing particles and type of interactions.
[in]densityUnused, needed since inherited.

Reimplemented from smash::OutputInterface.

Definition at line 459 of file rootoutput.cc.

460  {
461  if (write_collisions_) {
462  collisions_to_tree(action.incoming_particles(), action.outgoing_particles(),
463  action.get_total_weight(), action.get_partial_weight());
464  }
465 
467  action.get_type() == ProcessType::HyperSurfaceCrossing) {
468  particles_to_tree(action.incoming_particles());
469  }
470 }
void collisions_to_tree(const ParticleList &incoming, const ParticleList &outgoing, const double weight, const double partial_weight)
Writes collisions to a tree defined by treename.
Definition: rootoutput.cc:537
@ HyperSurfaceCrossing
See here for a short description.

◆ particles_to_tree()

template<typename T >
void smash::RootOutput::particles_to_tree ( T &  particles)
private

Writes particles to a tree defined by treename.

Parameters
[in]particlesParticles or ParticleList to be written to output.

Definition at line 473 of file rootoutput.cc.

473  {
474  int i = 0;
475 
479  bool exceeded_buffer_message = true;
480 
481  for (const auto &p : particles) {
482  // Buffer full - flush to tree, else fill with particles
483  if (i >= max_buffer_size_) {
484  if (exceeded_buffer_message) {
485  logg[LOutput].warn()
486  << "\nThe number of particles N = " << particles.size()
487  << " exceeds the maximum buffer size B = " << max_buffer_size_
488  << ".\nceil(N/B) = "
489  << std::ceil(particles.size() /
490  static_cast<double>(max_buffer_size_))
491  << " separate ROOT Tree entries will be created at this output."
492  << "\nMaximum buffer size (max_buffer_size_) can be changed in "
493  << "rootoutput.h\n\n";
494  exceeded_buffer_message = false;
495  }
497  i = 0;
498  particles_tree_->Fill();
499  } else {
500  pdgcode_[i] = p.pdgcode().get_decimal();
501  charge_[i] = p.type().charge();
502 
503  p0_[i] = p.momentum().x0();
504  px_[i] = p.momentum().x1();
505  py_[i] = p.momentum().x2();
506  pz_[i] = p.momentum().x3();
507 
508  t_[i] = p.position().x0();
509  x_[i] = p.position().x1();
510  y_[i] = p.position().x2();
511  z_[i] = p.position().x3();
512 
513  if (part_extended_ || ic_extended_) {
514  const auto h = p.get_history();
515  formation_time_[i] = p.formation_time();
516  xsec_factor_[i] = p.xsec_scaling_factor();
517  time_last_coll_[i] = h.time_last_collision;
518  coll_per_part_[i] = h.collisions_per_particle;
519  proc_id_origin_[i] = h.id_process;
520  proc_type_origin_[i] = static_cast<int>(h.process_type);
521  pdg_mother1_[i] = h.p1.get_decimal();
522  pdg_mother2_[i] = h.p2.get_decimal();
523  baryon_number_[i] = p.type().baryon_number();
524  strangeness_[i] = p.type().strangeness();
525  }
526 
527  i++;
528  }
529  }
530  // Flush rest to tree
531  if (i > 0) {
532  npart_ = i;
533  particles_tree_->Fill();
534  }
535 }
std::vector< double > t_
Property that is written to ROOT output.
Definition: rootoutput.h:193
std::vector< double > y_
Property that is written to ROOT output.
Definition: rootoutput.h:195
std::vector< int > proc_type_origin_
Property that is written to ROOT output.
Definition: rootoutput.h:206
std::vector< double > time_last_coll_
Property that is written to ROOT output.
Definition: rootoutput.h:200
std::vector< int > coll_per_part_
Property that is written to ROOT output.
Definition: rootoutput.h:204
int tcounter_
Property that is written to ROOT output.
Definition: rootoutput.h:211
std::vector< int > baryon_number_
Property that is written to ROOT output.
Definition: rootoutput.h:209
int npart_
Property that is written to ROOT output.
Definition: rootoutput.h:211
std::vector< int > pdg_mother1_
Property that is written to ROOT output.
Definition: rootoutput.h:207
int ev_
Property that is written to ROOT output.
Definition: rootoutput.h:211
std::vector< int > charge_
Property that is written to ROOT output.
Definition: rootoutput.h:203
std::vector< double > px_
Property that is written to ROOT output.
Definition: rootoutput.h:190
std::vector< int > strangeness_
Property that is written to ROOT output.
Definition: rootoutput.h:210
std::vector< double > py_
Property that is written to ROOT output.
Definition: rootoutput.h:191
std::vector< int > proc_id_origin_
Property that is written to ROOT output.
Definition: rootoutput.h:205
std::vector< double > z_
Property that is written to ROOT output.
Definition: rootoutput.h:196
std::vector< double > formation_time_
Property that is written to ROOT output.
Definition: rootoutput.h:197
std::vector< double > x_
Property that is written to ROOT output.
Definition: rootoutput.h:194
std::vector< double > p0_
Property that is written to ROOT output.
Definition: rootoutput.h:189
static const int max_buffer_size_
Maximal buffer size.
Definition: rootoutput.h:182
std::vector< double > xsec_factor_
Property that is written to ROOT output.
Definition: rootoutput.h:199
int ens_
Property that is written to ROOT output.
Definition: rootoutput.h:211
std::vector< double > pz_
Property that is written to ROOT output.
Definition: rootoutput.h:192
std::vector< int > pdgcode_
Property that is written to ROOT output.
Definition: rootoutput.h:202
std::vector< int > pdg_mother2_
Property that is written to ROOT output.
Definition: rootoutput.h:208
constexpr int p
Proton.
static constexpr int LOutput

◆ collisions_to_tree()

void smash::RootOutput::collisions_to_tree ( const ParticleList &  incoming,
const ParticleList &  outgoing,
const double  weight,
const double  partial_weight 
)
private

Writes collisions to a tree defined by treename.

Parameters
[in]incomingIncoming particles to be written to output.
[in]outgoingOutgoing particles to be written to output.
[in]weightTotal weight of the collision.
[in]partial_weightPartial weight of the collision

Definition at line 537 of file rootoutput.cc.

540  {
543  nin_ = incoming.size();
544  nout_ = outgoing.size();
545  npart_ = nin_ + nout_;
546  wgt_ = weight;
547  par_wgt_ = partial_weight;
548 
549  int i = 0;
550 
551  /* It is assumed that nin + nout < max_buffer_size_
552  * This is true for any possible reaction for current buffer size
553  * But if one wants initial/final particles written to collisions
554  * then implementation should be updated. */
555 
556  for (const ParticleList &plist : {incoming, outgoing}) {
557  for (const auto &p : plist) {
558  pdgcode_[i] = p.pdgcode().get_decimal();
559  charge_[i] = p.type().charge();
560 
561  p0_[i] = p.momentum().x0();
562  px_[i] = p.momentum().x1();
563  py_[i] = p.momentum().x2();
564  pz_[i] = p.momentum().x3();
565 
566  t_[i] = p.position().x0();
567  x_[i] = p.position().x1();
568  y_[i] = p.position().x2();
569  z_[i] = p.position().x3();
570 
571  if (coll_extended_) {
572  const auto h = p.get_history();
573  formation_time_[i] = p.formation_time();
574  xsec_factor_[i] = p.xsec_scaling_factor();
575  time_last_coll_[i] = h.time_last_collision;
576  coll_per_part_[i] = h.collisions_per_particle;
577  proc_id_origin_[i] = h.id_process;
578  proc_type_origin_[i] = static_cast<int>(h.process_type);
579  pdg_mother1_[i] = h.p1.get_decimal();
580  pdg_mother2_[i] = h.p2.get_decimal();
581  baryon_number_[i] = p.type().baryon_number();
582  }
583 
584  i++;
585  }
586  }
587 
588  collisions_tree_->Fill();
589 }
int nin_
Property that is written to ROOT output.
Definition: rootoutput.h:211
double wgt_
Property that is written to ROOT output.
Definition: rootoutput.h:212
double par_wgt_
Property that is written to ROOT output.
Definition: rootoutput.h:212
int nout_
Property that is written to ROOT output.
Definition: rootoutput.h:211

◆ init_trees()

void smash::RootOutput::init_trees ( )
private

Basic initialization routine, creating the TTree objects for particles and collisions.

Definition at line 252 of file rootoutput.cc.

252  {
254  particles_tree_ = new TTree("particles", "particles");
255 
256  particles_tree_->Branch("ev", &ev_, "ev/I");
257  particles_tree_->Branch("ens", &ens_, "ens/I");
258  particles_tree_->Branch("tcounter", &tcounter_, "tcounter/I");
259  particles_tree_->Branch("npart", &npart_, "npart/I");
260  particles_tree_->Branch("test_p", &test_p_, "test_p/I");
261  particles_tree_->Branch("modus_l", &modus_l_, "modus_l/D");
262  particles_tree_->Branch("current_t", &current_t_, "current_t/D");
263  particles_tree_->Branch("impact_b", &impact_b_, "impact_b/D");
264  particles_tree_->Branch("empty_event", &empty_event_, "empty_event/O");
265 
266  particles_tree_->Branch("pdgcode", &pdgcode_[0], "pdgcode[npart]/I");
267  particles_tree_->Branch("charge", &charge_[0], "charge[npart]/I");
268 
269  particles_tree_->Branch("p0", &p0_[0], "p0[npart]/D");
270  particles_tree_->Branch("px", &px_[0], "px[npart]/D");
271  particles_tree_->Branch("py", &py_[0], "py[npart]/D");
272  particles_tree_->Branch("pz", &pz_[0], "pz[npart]/D");
273 
274  particles_tree_->Branch("t", &t_[0], "t[npart]/D");
275  particles_tree_->Branch("x", &x_[0], "x[npart]/D");
276  particles_tree_->Branch("y", &y_[0], "y[npart]/D");
277  particles_tree_->Branch("z", &z_[0], "z[npart]/D");
278 
279  particles_tree_->Branch("E_kinetic_tot", &E_kinetic_tot_,
280  "E_kinetic_tot/D");
281  particles_tree_->Branch("E_fields_tot", &E_fields_tot_, "E_fields_tot/D");
282  particles_tree_->Branch("E_tot", &E_tot_, "E_tot/D");
283 
284  if (part_extended_ || ic_extended_) {
285  particles_tree_->Branch("ncoll", &coll_per_part_[0], "ncoll[npart]/I");
286  particles_tree_->Branch("form_time", &formation_time_[0],
287  "form_time[npart]/D");
288  particles_tree_->Branch("xsecfac", &xsec_factor_[0], "xsecfac[npart]/D");
289  particles_tree_->Branch("proc_id_origin", &proc_id_origin_[0],
290  "proc_id_origin[npart]/I");
291  particles_tree_->Branch("proc_type_origin", &proc_type_origin_[0],
292  "proc_type_origin[npart]/I");
293  particles_tree_->Branch("time_last_coll", &time_last_coll_[0],
294  "time_last_coll[npart]/D");
295  particles_tree_->Branch("pdg_mother1", &pdg_mother1_[0],
296  "pdg_mother1[npart]/I");
297  particles_tree_->Branch("pdg_mother2", &pdg_mother2_[0],
298  "pdg_mother2[npart]/I");
299  particles_tree_->Branch("baryon_number", &baryon_number_[0],
300  "baryon_number[npart]/I");
301  particles_tree_->Branch("strangeness", &strangeness_[0],
302  "strangeness[npart]/I");
303  }
304  }
305 
306  if (write_collisions_) {
307  collisions_tree_ = new TTree("collisions", "collisions");
308 
309  collisions_tree_->Branch("nin", &nin_, "nin/I");
310  collisions_tree_->Branch("nout", &nout_, "nout/I");
311  collisions_tree_->Branch("npart", &npart_, "npart/I");
312  collisions_tree_->Branch("ev", &ev_, "ev/I");
313  collisions_tree_->Branch("ens", &ens_, "ens/I");
314  collisions_tree_->Branch("weight", &wgt_, "weight/D");
315  collisions_tree_->Branch("partial_weight", &par_wgt_, "partial_weight/D");
316 
317  collisions_tree_->Branch("pdgcode", &pdgcode_[0], "pdgcode[npart]/I");
318  collisions_tree_->Branch("charge", &charge_[0], "charge[npart]/I");
319 
320  collisions_tree_->Branch("p0", &p0_[0], "p0[npart]/D");
321  collisions_tree_->Branch("px", &px_[0], "px[npart]/D");
322  collisions_tree_->Branch("py", &py_[0], "py[npart]/D");
323  collisions_tree_->Branch("pz", &pz_[0], "pz[npart]/D");
324 
325  collisions_tree_->Branch("t", &t_[0], "t[npart]/D");
326  collisions_tree_->Branch("x", &x_[0], "x[npart]/D");
327  collisions_tree_->Branch("y", &y_[0], "y[npart]/D");
328  collisions_tree_->Branch("z", &z_[0], "z[npart]/D");
329 
330  if (coll_extended_) {
331  collisions_tree_->Branch("ncoll", &coll_per_part_[0], "ncoll[npart]/I");
332  collisions_tree_->Branch("form_time", &formation_time_[0],
333  "form_time[npart]/D");
334  collisions_tree_->Branch("xsecfac", &xsec_factor_[0], "xsecfac[npart]/D");
335  collisions_tree_->Branch("proc_id_origin", &proc_id_origin_[0],
336  "proc_id_origin[npart]/I");
337  collisions_tree_->Branch("proc_type_origin", &proc_type_origin_[0],
338  "proc_type_origin[npart]/I");
339  collisions_tree_->Branch("time_last_coll", &time_last_coll_[0],
340  "time_last_coll[npart]/D");
341  collisions_tree_->Branch("pdg_mother1", &pdg_mother1_[0],
342  "pdg_mother1[npart]/I");
343  collisions_tree_->Branch("pdg_mother2", &pdg_mother2_[0],
344  "pdg_mother2[npart]/I");
345  collisions_tree_->Branch("baryon_number", &baryon_number_[0],
346  "baryon_number[npart]/I");
347  collisions_tree_->Branch("strangeness", &strangeness_[0],
348  "strangeness[npart]/I");
349  }
350  }
351 }

Member Data Documentation

◆ filename_

const std::filesystem::path smash::RootOutput::filename_
private

Filename of output.

Definition at line 134 of file rootoutput.h.

◆ filename_unfinished_

std::filesystem::path smash::RootOutput::filename_unfinished_
private

Filename of output as long as simulation is still running.

Definition at line 136 of file rootoutput.h.

◆ root_out_file_

std::unique_ptr<TFile> smash::RootOutput::root_out_file_
private

Pointer to root output file.

Definition at line 138 of file rootoutput.h.

◆ particles_tree_

TTree* smash::RootOutput::particles_tree_
private

TTree for particles output.

TFile takes ownership of all TTrees. That's why TTree is not a unique pointer.

Definition at line 145 of file rootoutput.h.

◆ collisions_tree_

TTree* smash::RootOutput::collisions_tree_
private

TTree for collision output.

TFile takes ownership of all TTrees. That's why TTree is not a unique pointer.

Definition at line 152 of file rootoutput.h.

◆ output_counter_

int smash::RootOutput::output_counter_ = 0
private

Number of output in a given event.

Definition at line 170 of file rootoutput.h.

◆ current_event_

int smash::RootOutput::current_event_ = 0
private

Number of current event.

Definition at line 172 of file rootoutput.h.

◆ current_ensemble_

int smash::RootOutput::current_ensemble_ = 0
private

Number of current ensemble.

Definition at line 174 of file rootoutput.h.

◆ max_buffer_size_

const int smash::RootOutput::max_buffer_size_ = 500000
staticprivate

Maximal buffer size.

When the number of particles N exceeds the buffer size B, data is flushed to the ROOT file every B particles. This creates ceil(N/B) entries in the ROOT Tree at every output.

Definition at line 182 of file rootoutput.h.

◆ p0_

std::vector<double> smash::RootOutput::p0_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 189 of file rootoutput.h.

◆ px_

std::vector<double> smash::RootOutput::px_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 190 of file rootoutput.h.

◆ py_

std::vector<double> smash::RootOutput::py_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 191 of file rootoutput.h.

◆ pz_

std::vector<double> smash::RootOutput::pz_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 192 of file rootoutput.h.

◆ t_

std::vector<double> smash::RootOutput::t_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 193 of file rootoutput.h.

◆ x_

std::vector<double> smash::RootOutput::x_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 194 of file rootoutput.h.

◆ y_

std::vector<double> smash::RootOutput::y_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 195 of file rootoutput.h.

◆ z_

std::vector<double> smash::RootOutput::z_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 196 of file rootoutput.h.

◆ formation_time_

std::vector<double> smash::RootOutput::formation_time_
private
Initial value:
=
std::vector<double>(max_buffer_size_, 0.0)

Property that is written to ROOT output.

Definition at line 197 of file rootoutput.h.

◆ xsec_factor_

std::vector<double> smash::RootOutput::xsec_factor_ = std::vector<double>(max_buffer_size_, 0.0)
private

Property that is written to ROOT output.

Definition at line 199 of file rootoutput.h.

◆ time_last_coll_

std::vector<double> smash::RootOutput::time_last_coll_
private
Initial value:
=
std::vector<double>(max_buffer_size_, 0.0)

Property that is written to ROOT output.

Definition at line 200 of file rootoutput.h.

◆ pdgcode_

std::vector<int> smash::RootOutput::pdgcode_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 202 of file rootoutput.h.

◆ charge_

std::vector<int> smash::RootOutput::charge_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 203 of file rootoutput.h.

◆ coll_per_part_

std::vector<int> smash::RootOutput::coll_per_part_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 204 of file rootoutput.h.

◆ proc_id_origin_

std::vector<int> smash::RootOutput::proc_id_origin_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 205 of file rootoutput.h.

◆ proc_type_origin_

std::vector<int> smash::RootOutput::proc_type_origin_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 206 of file rootoutput.h.

◆ pdg_mother1_

std::vector<int> smash::RootOutput::pdg_mother1_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 207 of file rootoutput.h.

◆ pdg_mother2_

std::vector<int> smash::RootOutput::pdg_mother2_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 208 of file rootoutput.h.

◆ baryon_number_

std::vector<int> smash::RootOutput::baryon_number_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 209 of file rootoutput.h.

◆ strangeness_

std::vector<int> smash::RootOutput::strangeness_ = std::vector<int>(max_buffer_size_, 0)
private

Property that is written to ROOT output.

Definition at line 210 of file rootoutput.h.

◆ npart_

int smash::RootOutput::npart_
private

Property that is written to ROOT output.

Definition at line 211 of file rootoutput.h.

◆ tcounter_

int smash::RootOutput::tcounter_
private

Property that is written to ROOT output.

Definition at line 211 of file rootoutput.h.

◆ ev_

int smash::RootOutput::ev_
private

Property that is written to ROOT output.

Definition at line 211 of file rootoutput.h.

◆ ens_

int smash::RootOutput::ens_
private

Property that is written to ROOT output.

Definition at line 211 of file rootoutput.h.

◆ nin_

int smash::RootOutput::nin_
private

Property that is written to ROOT output.

Definition at line 211 of file rootoutput.h.

◆ nout_

int smash::RootOutput::nout_
private

Property that is written to ROOT output.

Definition at line 211 of file rootoutput.h.

◆ test_p_

int smash::RootOutput::test_p_
private

Property that is written to ROOT output.

Definition at line 211 of file rootoutput.h.

◆ wgt_

double smash::RootOutput::wgt_
private

Property that is written to ROOT output.

Definition at line 212 of file rootoutput.h.

◆ par_wgt_

double smash::RootOutput::par_wgt_
private

Property that is written to ROOT output.

Definition at line 212 of file rootoutput.h.

◆ impact_b_

double smash::RootOutput::impact_b_
private

Property that is written to ROOT output.

Definition at line 212 of file rootoutput.h.

◆ modus_l_

double smash::RootOutput::modus_l_
private

Property that is written to ROOT output.

Definition at line 212 of file rootoutput.h.

◆ current_t_

double smash::RootOutput::current_t_
private

Property that is written to ROOT output.

Definition at line 212 of file rootoutput.h.

◆ E_kinetic_tot_

double smash::RootOutput::E_kinetic_tot_
private

Property that is written to ROOT output.

Definition at line 213 of file rootoutput.h.

◆ E_fields_tot_

double smash::RootOutput::E_fields_tot_
private

Property that is written to ROOT output.

Definition at line 213 of file rootoutput.h.

◆ E_tot_

double smash::RootOutput::E_tot_
private

Property that is written to ROOT output.

Definition at line 213 of file rootoutput.h.

◆ empty_event_

bool smash::RootOutput::empty_event_
private

Property that is written to ROOT output.

Definition at line 214 of file rootoutput.h.

◆ write_collisions_

bool smash::RootOutput::write_collisions_
private

Option to write collisions tree.

Definition at line 218 of file rootoutput.h.

◆ write_particles_

bool smash::RootOutput::write_particles_
private

Option to write particles tree.

Definition at line 221 of file rootoutput.h.

◆ write_initial_conditions_

bool smash::RootOutput::write_initial_conditions_
private

Option to write particles tree for initial conditions.

Definition at line 224 of file rootoutput.h.

◆ particles_only_final_

OutputOnlyFinal smash::RootOutput::particles_only_final_
private

Print only final particles in the event, no intermediate output.

Definition at line 227 of file rootoutput.h.

◆ autosave_frequency_

int smash::RootOutput::autosave_frequency_ = -1
private

ROOT file cannot be read if it was not properly closed and finalized.

It can happen that SMASH simulation crashed and ROOT file was not closed. To save results of simulation in such case, "AutoSave" is applied every N events. If multiple ensembles are used, N is divided by the number of ensembles per event. This makes sense especially in case of a large number of ensembles and, at the same time, it ensures that all ensembles belonging to the same event are saved. The autosave_frequency_ sets this N (at the moment N=1000 hard-coded). Note that "AutoSave" operation is very time-consuming, so the autosave frequency is always a compromise between safety and speed.

Definition at line 241 of file rootoutput.h.

◆ part_extended_

const bool smash::RootOutput::part_extended_
private

Whether extended particle output is on.

Definition at line 244 of file rootoutput.h.

◆ coll_extended_

const bool smash::RootOutput::coll_extended_
private

Whether extended collisions output is on.

Definition at line 246 of file rootoutput.h.

◆ ic_extended_

const bool smash::RootOutput::ic_extended_
private

Whether extended ic output is on.

Definition at line 248 of file rootoutput.h.


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