Version: SMASH-1.8
processbranch.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2020
3  * SMASH Team
4  *
5  * GNU General Public License (GPLv3 or later)
6  */
7 #ifndef SRC_INCLUDE_PROCESSBRANCH_H_
8 #define SRC_INCLUDE_PROCESSBRANCH_H_
9 
10 #include <iostream>
11 #include <memory>
12 #include <utility>
13 #include <vector>
14 
15 #include "decaytype.h"
16 #include "forwarddeclarations.h"
17 #include "particletype.h"
18 
19 namespace smash {
20 
25 enum class ProcessType {
27  None = 0,
29  Elastic = 1,
31  TwoToOne = 2,
33  TwoToTwo = 3,
35  Decay = 5,
37  Wall = 6,
42  Thermalization = 7,
49  Bremsstrahlung = 9,
80  StringHard = 46
81 };
82 
88 
94 std::ostream &operator<<(std::ostream &os, ProcessType process_type);
95 
123  public:
126 
131  explicit ProcessBranch(double w) : branch_weight_(w) {}
132 
134  ProcessBranch(const ProcessBranch &) = delete;
135 
140  virtual ~ProcessBranch() = default;
141 
148  inline void set_weight(double process_weight);
149 
151  virtual ProcessType get_type() const = 0;
152 
154  virtual const ParticleTypePtrList &particle_types() const = 0;
155 
160  ParticleList particle_list() const;
161 
163  inline double weight() const;
164 
169  double threshold() const;
170 
172  virtual unsigned int particle_number() const = 0;
173 
174  protected:
178  mutable double threshold_ = -1.;
179 };
180 
181 inline void ProcessBranch::set_weight(double process_weight) {
182  branch_weight_ = process_weight;
183 }
184 
186 inline double ProcessBranch::weight() const { return branch_weight_; }
187 
194 template <typename Branch>
195 inline double total_weight(const ProcessBranchList<Branch> &l) {
196  double sum = 0.;
197  for (const auto &p : l) {
198  sum += p->weight();
199  }
200  return sum;
201 }
202 
210  public:
216  CollisionBranch(double w, ProcessType p_type)
217  : ProcessBranch(w), process_type_(p_type) {}
224  CollisionBranch(const ParticleType &type, double w, ProcessType p_type)
225  : ProcessBranch(w), process_type_(p_type) {
226  particle_types_.reserve(1);
227  particle_types_.push_back(&type);
228  }
236  CollisionBranch(const ParticleType &type_a, const ParticleType &type_b,
237  double w, ProcessType p_type)
238  : ProcessBranch(w), process_type_(p_type) {
239  particle_types_.reserve(2);
240  particle_types_.push_back(&type_a);
241  particle_types_.push_back(&type_b);
242  }
243 
252  CollisionBranch(const ParticleType &type_a, const ParticleType &type_b,
253  const ParticleType &type_c, double w, ProcessType p_type)
254  : ProcessBranch(w), process_type_(p_type) {
255  particle_types_.reserve(3);
256  particle_types_.push_back(&type_a);
257  particle_types_.push_back(&type_b);
258  particle_types_.push_back(&type_c);
259  }
260 
267  CollisionBranch(ParticleTypePtrList new_types, double w, ProcessType p_type)
268  : ProcessBranch(w),
269  particle_types_(std::move(new_types)),
270  process_type_(p_type) {}
274  particle_types_(std::move(rhs.particle_types_)),
276  const ParticleTypePtrList &particle_types() const override {
277  return particle_types_;
278  }
284  inline void set_type(ProcessType p_type) { process_type_ = p_type; }
286  inline ProcessType get_type() const override { return process_type_; }
288  unsigned int particle_number() const override {
289  return particle_types_.size();
290  }
291 
292  private:
300  ParticleTypePtrList particle_types_;
306 };
307 
313 std::ostream &operator<<(std::ostream &os, const CollisionBranch &cbranch);
314 
322 class DecayBranch : public ProcessBranch {
323  public:
329  DecayBranch(const DecayType &t, double w) : ProcessBranch(w), type_(t) {}
332  : ProcessBranch(rhs.branch_weight_), type_(rhs.type_) {}
334  inline int angular_momentum() const { return type_.angular_momentum(); }
335  const ParticleTypePtrList &particle_types() const override {
336  return type_.particle_types();
337  }
338  unsigned int particle_number() const override {
339  return type_.particle_number();
340  }
342  inline const DecayType &type() const { return type_; }
344  inline ProcessType get_type() const override { return ProcessType::Decay; }
345 
346  private:
348  const DecayType &type_;
349 };
350 
351 } // namespace smash
352 
353 #endif // SRC_INCLUDE_PROCESSBRANCH_H_
smash::DecayBranch::type
const DecayType & type() const
Definition: processbranch.h:342
smash
Definition: action.h:24
smash::ProcessBranch::particle_list
ParticleList particle_list() const
Definition: processbranch.cc:26
smash::CollisionBranch::particle_number
unsigned int particle_number() const override
Definition: processbranch.h:288
smash::DecayType::particle_number
virtual unsigned int particle_number() const =0
smash::ProcessBranch::~ProcessBranch
virtual ~ProcessBranch()=default
Virtual Destructor.
smash::ProcessType::StringHard
hard string process involving 2->2 QCD process by PYTHIA.
smash::DecayType
DecayType is the abstract base class for all decay types.
Definition: decaytype.h:23
smash::CollisionBranch::CollisionBranch
CollisionBranch(double w, ProcessType p_type)
Construct collision branch with empty final state.
Definition: processbranch.h:216
smash::ProcessType::Decay
resonance decays
smash::ProcessType::StringSoftDoubleDiffractive
double diffractive. Two strings are formed, one from A and one from B.
smash::ProcessType::StringSoftNonDiffractive
non-diffractive. Two strings are formed both have ends in A and B.
smash::is_string_soft_process
bool is_string_soft_process(ProcessType p)
Check if a given process type is a soft string excitation.
Definition: processbranch.cc:18
smash::operator<<
std::ostream & operator<<(std::ostream &out, const ActionPtr &action)
Definition: action.h:463
smash::CollisionBranch::CollisionBranch
CollisionBranch(ParticleTypePtrList new_types, double w, ProcessType p_type)
Construct collision branch with a list of particles in final state.
Definition: processbranch.h:267
smash::DecayType::angular_momentum
int angular_momentum() const
Definition: decaytype.h:61
smash::ProcessType::TwoToTwo
2->2 inelastic scattering
smash::ProcessBranch::get_type
virtual ProcessType get_type() const =0
smash::DecayBranch::type_
const DecayType & type_
Decay type (including final-state particles and angular momentum)
Definition: processbranch.h:348
smash::DecayBranch::get_type
ProcessType get_type() const override
Definition: processbranch.h:344
smash::ProcessType::StringSoftSingleDiffractiveXB
single diffractive AB->XB.
smash::DecayBranch
Definition: processbranch.h:322
forwarddeclarations.h
smash::DecayBranch::particle_types
const ParticleTypePtrList & particle_types() const override
Definition: processbranch.h:335
smash::DecayBranch::angular_momentum
int angular_momentum() const
Definition: processbranch.h:334
smash::ProcessType::Thermalization
forced thermalization, many particles are replaced by a thermalized ensemble
smash::ProcessBranch::threshold
double threshold() const
Definition: processbranch.cc:35
smash::ProcessType::Wall
box wall crossing
smash::ProcessBranch::ProcessBranch
ProcessBranch(double w)
Create a ProcessBranch with with weight but without final states.
Definition: processbranch.h:131
smash::ProcessBranch::threshold_
double threshold_
Threshold of the branch.
Definition: processbranch.h:178
smash::ProcessBranch::particle_number
virtual unsigned int particle_number() const =0
smash::CollisionBranch::get_type
ProcessType get_type() const override
Definition: processbranch.h:286
smash::ParticleType
Definition: particletype.h:97
particletype.h
smash::CollisionBranch::process_type_
ProcessType process_type_
Process type are used to distinguish different types of processes, e.g.
Definition: processbranch.h:305
decaytype.h
smash::CollisionBranch::CollisionBranch
CollisionBranch(CollisionBranch &&rhs)
The move constructor efficiently moves the particle-type list member.
Definition: processbranch.h:272
smash::ProcessType::Bremsstrahlung
bremsstrahlung process: a + b -> a + b + photon
smash::DecayBranch::DecayBranch
DecayBranch(const DecayType &t, double w)
Construct decay branch.
Definition: processbranch.h:329
smash::ProcessType::StringSoftSingleDiffractiveAX
(41-45) soft string excitations.
smash::CollisionBranch::CollisionBranch
CollisionBranch(const ParticleType &type_a, const ParticleType &type_b, double w, ProcessType p_type)
Construct collision branch with 2 particles in final state.
Definition: processbranch.h:236
smash::ProcessBranch::particle_types
virtual const ParticleTypePtrList & particle_types() const =0
smash::ProcessBranch::ProcessBranch
ProcessBranch()
Create a ProcessBranch without final states and weight.
Definition: processbranch.h:125
smash::ProcessType::StringSoftAnnihilation
a special case of baryon-antibaryon annihilation.
smash::CollisionBranch::set_type
void set_type(ProcessType p_type)
Set the process type.
Definition: processbranch.h:284
smash::CollisionBranch::particle_types
const ParticleTypePtrList & particle_types() const override
Definition: processbranch.h:276
smash::ProcessBranch::total_weight
double total_weight(const ProcessBranchList< Branch > &l)
Definition: processbranch.h:195
smash::ProcessType::Elastic
elastic scattering: particles remain the same, only momenta change
smash::DecayBranch::particle_number
unsigned int particle_number() const override
Definition: processbranch.h:338
smash::ProcessType::HyperSurfaceCrossing
Hypersurface crossing Particles are removed from the evolution and printed to a separate output to se...
smash::DensityType::None
smash::CollisionBranch::CollisionBranch
CollisionBranch(const ParticleType &type_a, const ParticleType &type_b, const ParticleType &type_c, double w, ProcessType p_type)
Construct collision branch with 3 particles in final state.
Definition: processbranch.h:252
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::ProcessBranch
Definition: processbranch.h:122
smash::ProcessBranch::set_weight
void set_weight(double process_weight)
Set the weight of the branch.
Definition: processbranch.h:181
smash::DecayBranch::DecayBranch
DecayBranch(DecayBranch &&rhs)
The move constructor efficiently moves the particle-type list member.
Definition: processbranch.h:331
smash::ProcessType::TwoToOne
resonance formation (2->1)
smash::CollisionBranch::CollisionBranch
CollisionBranch(const ParticleType &type, double w, ProcessType p_type)
Construct collision branch with 1 particle in final state.
Definition: processbranch.h:224
smash::ProcessBranch::branch_weight_
double branch_weight_
Weight of the branch, typically a cross section or a branching ratio.
Definition: processbranch.h:176
smash::DecayType::particle_types
const ParticleTypePtrList & particle_types() const
Definition: decaytype.h:59
smash::CollisionBranch::particle_types_
ParticleTypePtrList particle_types_
List of particles appearing in this process outcome.
Definition: processbranch.h:300
smash::ProcessBranch::weight
double weight() const
Definition: processbranch.h:186
smash::CollisionBranch
Definition: processbranch.h:209
smash::ProcessType
ProcessType
Process Types are used to identify the type of the process.
Definition: processbranch.h:25