Version: SMASH-2.0
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_SMASH_PROCESSBRANCH_H_
8 #define SRC_INCLUDE_SMASH_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  TwoToThree = 4,
37  Decay = 5,
39  Wall = 6,
44  Thermalization = 7,
51  Bremsstrahlung = 9,
55 
86  StringHard = 46,
87 
92  FailedString = 47
93 };
94 
100 
106 std::ostream &operator<<(std::ostream &os, ProcessType process_type);
107 
135  public:
138 
143  explicit ProcessBranch(double w) : branch_weight_(w) {}
144 
146  ProcessBranch(const ProcessBranch &) = delete;
147 
152  virtual ~ProcessBranch() = default;
153 
160  inline void set_weight(double process_weight);
161 
163  virtual ProcessType get_type() const = 0;
164 
166  virtual const ParticleTypePtrList &particle_types() const = 0;
167 
172  ParticleList particle_list() const;
173 
175  inline double weight() const;
176 
181  double threshold() const;
182 
184  virtual unsigned int particle_number() const = 0;
185 
186  protected:
190  mutable double threshold_ = -1.;
191 };
192 
193 inline void ProcessBranch::set_weight(double process_weight) {
194  branch_weight_ = process_weight;
195 }
196 
198 inline double ProcessBranch::weight() const { return branch_weight_; }
199 
206 template <typename Branch>
207 inline double total_weight(const ProcessBranchList<Branch> &l) {
208  double sum = 0.;
209  for (const auto &p : l) {
210  sum += p->weight();
211  }
212  return sum;
213 }
214 
222  public:
228  CollisionBranch(double w, ProcessType p_type)
229  : ProcessBranch(w), process_type_(p_type) {}
236  CollisionBranch(const ParticleType &type, double w, ProcessType p_type)
237  : ProcessBranch(w), process_type_(p_type) {
238  particle_types_.reserve(1);
239  particle_types_.push_back(&type);
240  }
248  CollisionBranch(const ParticleType &type_a, const ParticleType &type_b,
249  double w, ProcessType p_type)
250  : ProcessBranch(w), process_type_(p_type) {
251  particle_types_.reserve(2);
252  particle_types_.push_back(&type_a);
253  particle_types_.push_back(&type_b);
254  }
255 
264  CollisionBranch(const ParticleType &type_a, const ParticleType &type_b,
265  const ParticleType &type_c, double w, ProcessType p_type)
266  : ProcessBranch(w), process_type_(p_type) {
267  particle_types_.reserve(3);
268  particle_types_.push_back(&type_a);
269  particle_types_.push_back(&type_b);
270  particle_types_.push_back(&type_c);
271  }
272 
279  CollisionBranch(ParticleTypePtrList new_types, double w, ProcessType p_type)
280  : ProcessBranch(w),
281  particle_types_(std::move(new_types)),
282  process_type_(p_type) {}
286  particle_types_(std::move(rhs.particle_types_)),
288  const ParticleTypePtrList &particle_types() const override {
289  return particle_types_;
290  }
296  inline void set_type(ProcessType p_type) { process_type_ = p_type; }
298  inline ProcessType get_type() const override { return process_type_; }
300  unsigned int particle_number() const override {
301  return particle_types_.size();
302  }
303 
304  private:
306  ParticleTypePtrList particle_types_;
307 
313 };
314 
320 std::ostream &operator<<(std::ostream &os, const CollisionBranch &cbranch);
321 
329 class DecayBranch : public ProcessBranch {
330  public:
336  DecayBranch(const DecayType &t, double w) : ProcessBranch(w), type_(t) {}
339  : ProcessBranch(rhs.branch_weight_), type_(rhs.type_) {}
341  inline int angular_momentum() const { return type_.angular_momentum(); }
342  const ParticleTypePtrList &particle_types() const override {
343  return type_.particle_types();
344  }
345  unsigned int particle_number() const override {
346  return type_.particle_number();
347  }
349  inline const DecayType &type() const { return type_; }
351  inline ProcessType get_type() const override { return ProcessType::Decay; }
352 
353  private:
355  const DecayType &type_;
356 };
357 
358 } // namespace smash
359 
360 #endif // SRC_INCLUDE_SMASH_PROCESSBRANCH_H_
smash::DecayBranch::type
const DecayType & type() const
Definition: processbranch.h:349
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:300
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:228
smash::ProcessType::MultiParticleThreeToTwo
smash::ProcessType::Decay
resonance decay
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:518
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:279
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:355
smash::DecayBranch::get_type
ProcessType get_type() const override
Definition: processbranch.h:351
smash::ProcessType::StringSoftSingleDiffractiveXB
single diffractive AB->XB.
smash::DecayBranch
Definition: processbranch.h:329
forwarddeclarations.h
smash::DecayBranch::particle_types
const ParticleTypePtrList & particle_types() const override
Definition: processbranch.h:342
smash::DecayBranch::angular_momentum
int angular_momentum() const
Definition: processbranch.h:341
smash::ProcessType::Thermalization
forced thermalization, many particles are replaced by a thermalized ensemble
smash::ProcessType::MultiParticleThreeMesonsToOne
multi particle scattering
smash::ProcessBranch::threshold
double threshold() const
Definition: processbranch.cc:35
smash::ProcessType::Wall
box wall crossing
smash::ProcessType::FailedString
Soft String NNbar annihilation process can fail by lack of energy.
smash::ProcessBranch::ProcessBranch
ProcessBranch(double w)
Create a ProcessBranch with with weight but without final states.
Definition: processbranch.h:143
smash::ProcessBranch::threshold_
double threshold_
Threshold of the branch.
Definition: processbranch.h:190
smash::ProcessBranch::particle_number
virtual unsigned int particle_number() const =0
smash::CollisionBranch::get_type
ProcessType get_type() const override
Definition: processbranch.h:298
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:312
decaytype.h
smash::CollisionBranch::CollisionBranch
CollisionBranch(CollisionBranch &&rhs)
The move constructor efficiently moves the particle-type list member.
Definition: processbranch.h:284
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:336
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:248
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:137
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:296
smash::CollisionBranch::particle_types
const ParticleTypePtrList & particle_types() const override
Definition: processbranch.h:288
smash::ProcessBranch::total_weight
double total_weight(const ProcessBranchList< Branch > &l)
Definition: processbranch.h:207
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:345
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:264
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::ProcessBranch
Definition: processbranch.h:134
smash::ProcessBranch::set_weight
void set_weight(double process_weight)
Set the weight of the branch.
Definition: processbranch.h:193
smash::DecayBranch::DecayBranch
DecayBranch(DecayBranch &&rhs)
The move constructor efficiently moves the particle-type list member.
Definition: processbranch.h:338
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:236
smash::ProcessBranch::branch_weight_
double branch_weight_
Weight of the branch, typically a cross section or a branching ratio.
Definition: processbranch.h:188
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:306
smash::ProcessBranch::weight
double weight() const
Definition: processbranch.h:198
smash::CollisionBranch
Definition: processbranch.h:221
smash::ProcessType
ProcessType
Process Types are used to identify the type of the process.
Definition: processbranch.h:25
smash::ProcessType::TwoToThree
2->3 scattering