Version: SMASH-3.0
binaryoutput.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2020,2022
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #include "smash/binaryoutput.h"
11 
12 #include <filesystem>
13 #include <string>
14 
15 #include "smash/action.h"
16 #include "smash/clock.h"
17 #include "smash/config.h"
18 
19 namespace smash {
20 
21 static constexpr int LHyperSurfaceCrossing = LogArea::HyperSurfaceCrossing::id;
22 
135 BinaryOutputBase::BinaryOutputBase(const std::filesystem::path &path,
136  const std::string &mode,
137  const std::string &name,
138  bool extended_format)
139  : OutputInterface(name), file_{path, mode}, extended_(extended_format) {
140  std::fwrite("SMSH", 4, 1, file_.get()); // magic number
141  write(format_version_); // file format version number
142  std::uint16_t format_variant = static_cast<uint16_t>(extended_);
143  write(format_variant);
144  write(SMASH_VERSION);
145 }
146 
147 // write functions:
148 void BinaryOutputBase::write(const char c) {
149  std::fwrite(&c, sizeof(char), 1, file_.get());
150 }
151 
152 void BinaryOutputBase::write(const std::string &s) {
153  const auto size = smash::numeric_cast<uint32_t>(s.size());
154  std::fwrite(&size, sizeof(std::uint32_t), 1, file_.get());
155  std::fwrite(s.c_str(), s.size(), 1, file_.get());
156 }
157 
158 void BinaryOutputBase::write(const double x) {
159  std::fwrite(&x, sizeof(x), 1, file_.get());
160 }
161 
163  std::fwrite(v.begin(), sizeof(*v.begin()), 4, file_.get());
164 }
165 
166 void BinaryOutputBase::write(const Particles &particles) {
167  for (const auto &p : particles) {
169  }
170 }
171 
172 void BinaryOutputBase::write(const ParticleList &particles) {
173  for (const auto &p : particles) {
175  }
176 }
177 
179  write(p.position());
180  double mass = p.effective_mass();
181  std::fwrite(&mass, sizeof(mass), 1, file_.get());
182  write(p.momentum());
183  write(p.pdgcode().get_decimal());
184  write(p.id());
185  write(p.type().charge());
186  if (extended_) {
187  const auto history = p.get_history();
188  write(history.collisions_per_particle);
189  write(p.formation_time());
190  write(p.xsec_scaling_factor());
191  write(history.id_process);
192  write(static_cast<int32_t>(history.process_type));
193  write(history.time_last_collision);
194  write(history.p1.get_decimal());
195  write(history.p2.get_decimal());
196  write(p.type().baryon_number());
197  }
198 }
199 
201  const std::filesystem::path &path, std::string name,
202  const OutputParameters &out_par)
204  path / ((name == "Collisions" ? "collisions_binary" : name) + ".bin"),
205  "wb", name, out_par.get_coll_extended(name)),
206  print_start_end_(out_par.coll_printstartend) {}
207 
209  const int, const EventInfo &) {
210  const char pchar = 'p';
211  if (print_start_end_) {
212  std::fwrite(&pchar, sizeof(char), 1, file_.get());
213  write(particles.size());
214  write(particles);
215  }
216 }
217 
219  const int32_t event_number,
220  const EventInfo &event) {
221  const char pchar = 'p';
222  if (print_start_end_) {
223  std::fwrite(&pchar, sizeof(char), 1, file_.get());
224  write(particles.size());
225  write(particles);
226  }
227 
228  // Event end line
229  const char fchar = 'f';
230  std::fwrite(&fchar, sizeof(char), 1, file_.get());
231  write(event_number);
232  write(event.impact_parameter);
233  const char empty = event.empty_event;
234  write(empty);
235 
236  // Flush to disk
237  std::fflush(file_.get());
238 }
239 
241  const double density) {
242  const char ichar = 'i';
243  std::fwrite(&ichar, sizeof(char), 1, file_.get());
244  write(action.incoming_particles().size());
245  write(action.outgoing_particles().size());
246  std::fwrite(&density, sizeof(double), 1, file_.get());
247  const double weight = action.get_total_weight();
248  std::fwrite(&weight, sizeof(double), 1, file_.get());
249  const double partial_weight = action.get_partial_weight();
250  std::fwrite(&partial_weight, sizeof(double), 1, file_.get());
251  const auto type = static_cast<uint32_t>(action.get_type());
252  std::fwrite(&type, sizeof(uint32_t), 1, file_.get());
253  write(action.incoming_particles());
254  write(action.outgoing_particles());
255 }
256 
257 BinaryOutputParticles::BinaryOutputParticles(const std::filesystem::path &path,
258  std::string name,
259  const OutputParameters &out_par)
260  : BinaryOutputBase(path / "particles_binary.bin", "wb", name,
261  out_par.part_extended),
262  only_final_(out_par.part_only_final) {}
263 
264 void BinaryOutputParticles::at_eventstart(const Particles &particles, const int,
265  const EventInfo &) {
266  const char pchar = 'p';
268  std::fwrite(&pchar, sizeof(char), 1, file_.get());
269  write(particles.size());
270  write(particles);
271  }
272 }
273 
275  const int event_number,
276  const EventInfo &event) {
277  const char pchar = 'p';
279  std::fwrite(&pchar, sizeof(char), 1, file_.get());
280  write(particles.size());
281  write(particles);
282  }
283 
284  // Event end line
285  const char fchar = 'f';
286  std::fwrite(&fchar, sizeof(char), 1, file_.get());
287  write(event_number);
288  write(event.impact_parameter);
289  const char empty = event.empty_event;
290  write(empty);
291 
292  // Flush to disk
293  std::fflush(file_.get());
294 }
295 
297  const std::unique_ptr<Clock> &,
298  const DensityParameters &,
299  const EventInfo &) {
300  const char pchar = 'p';
302  std::fwrite(&pchar, sizeof(char), 1, file_.get());
303  write(particles.size());
304  write(particles);
305  }
306 }
307 
309  const std::filesystem::path &path, std::string name,
310  const OutputParameters &out_par)
311  : BinaryOutputBase(path / "SMASH_IC.bin", "wb", name, out_par.ic_extended) {
312 }
313 
315  const EventInfo &) {}
316 
318  const int event_number,
319  const EventInfo &event) {
320  // Event end line
321  const char fchar = 'f';
322  std::fwrite(&fchar, sizeof(char), 1, file_.get());
323  write(event_number);
324  write(event.impact_parameter);
325  const char empty = event.empty_event;
326  write(empty);
327 
328  // Flush to disk
329  std::fflush(file_.get());
330 
331  // If the runtime is too short some particles might not yet have
332  // reached the hypersurface. Warning is printed.
333  if (particles.size() != 0 && !event.impose_kinematic_cut_for_SMASH_IC) {
335  "End time might be too small for initial conditions output. "
336  "Hypersurface has not yet been crossed by ",
337  particles.size(), " particle(s).");
338  }
339 }
340 
342  const double) {
344  const char pchar = 'p';
345  std::fwrite(&pchar, sizeof(char), 1, file_.get());
346  write(action.incoming_particles().size());
347  write(action.incoming_particles());
348  }
349 }
350 } // namespace smash
Action is the base class for a generic process that takes a number of incoming particles and transfor...
Definition: action.h:35
virtual ProcessType get_type() const
Get the process type.
Definition: action.h:131
virtual double get_total_weight() const =0
Return the total weight value, which is mainly used for the weight output entry.
const ParticleList & incoming_particles() const
Get the list of particles that go into the action.
Definition: action.cc:58
virtual double get_partial_weight() const =0
Return the specific weight for the chosen outgoing channel, which is mainly used for the partial weig...
const ParticleList & outgoing_particles() const
Get the list of particles that resulted from the action.
Definition: action.h:247
Base class for SMASH binary output.
Definition: binaryoutput.h:28
BinaryOutputBase(const std::filesystem::path &path, const std::string &mode, const std::string &name, bool extended_format)
Create binary output base.
bool extended_
Option for extended output.
Definition: binaryoutput.h:121
void write(const char c)
Write byte to binary output.
void write_particledata(const ParticleData &p)
Write particle data to binary output.
const uint16_t format_version_
Binary file format version number.
Definition: binaryoutput.h:119
RenamingFilePtr file_
Binary particles output file path.
Definition: binaryoutput.h:115
void at_interaction(const Action &action, const double density) override
Writes an interaction block, including information about the incoming and outgoing particles,...
void at_eventstart(const Particles &particles, const int event_number, const EventInfo &event) override
Writes the initial particle information list of an event to the binary output.
bool print_start_end_
Write initial and final particles additonally to collisions?
Definition: binaryoutput.h:178
void at_eventend(const Particles &particles, const int32_t event_number, const EventInfo &event) override
Writes the final particle information list of an event to the binary output.
BinaryOutputCollisions(const std::filesystem::path &path, std::string name, const OutputParameters &out_par)
Create binary particle output.
void at_eventstart(const Particles &, const int, const EventInfo &) override
Writes the initial particle information of an event to the binary output.
void at_interaction(const Action &action, const double) override
Writes particles that are removed when crossing the hypersurface to the output.
void at_eventend(const Particles &particles, const int event_number, const EventInfo &event) override
Writes the final particle information of an event to the binary output.
BinaryOutputInitialConditions(const std::filesystem::path &path, std::string name, const OutputParameters &out_par)
Create binary initial conditions particle output.
void at_eventstart(const Particles &particles, const int event_number, const EventInfo &event) override
Writes the initial particle information of an event to the binary output.
OutputOnlyFinal only_final_
Whether final- or initial-state particles should be written.
Definition: binaryoutput.h:240
void at_intermediate_time(const Particles &particles, const std::unique_ptr< Clock > &clock, const DensityParameters &dens_param, const EventInfo &event) override
Writes particles at each time interval; fixed by option OUTPUT_INTERVAL.
BinaryOutputParticles(const std::filesystem::path &path, std::string name, const OutputParameters &out_par)
Create binary particle output.
void at_eventend(const Particles &particles, const int event_number, const EventInfo &event) override
Writes the final particle information of an event to the binary output.
A class to pre-calculate and store parameters relevant for density calculation.
Definition: density.h:108
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:33
iterator begin()
Definition: fourvector.h:291
Abstraction of generic output.
ParticleData contains the dynamic information of a certain particle.
Definition: particledata.h:58
The Particles class abstracts the storage and manipulation of particles.
Definition: particles.h:33
size_t size() const
Definition: particles.h:87
FILE * get()
Get the underlying FILE* pointer.
Definition: file.cc:27
@ IfNotEmpty
Print only final-state particles, and those only if the event is not empty.
@ No
Print initial, intermediate and final-state particles.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
constexpr int p
Proton.
Definition: action.h:24
static constexpr int LHyperSurfaceCrossing
Definition: binaryoutput.cc:21
@ HyperSurfaceCrossing
See here for a short description.
Structure to contain custom data for output.
bool empty_event
True if no collisions happened.
bool impose_kinematic_cut_for_SMASH_IC
Whether or not kinematic cuts are employed for SMASH IC.
double impact_parameter
Impact parameter for collider modus, otherwise dummy.
Helper structure for Experiment to hold output options and parameters.