File indexing completed on 2026-08-06 09:25:33
0001 #ifndef NINJA_RAMBO_HH
0002 #define NINJA_RAMBO_HH
0003
0004 #include <ninja/types.hh>
0005 #include <ninja/momentum.hh>
0006
0007 namespace ninja {
0008
0009 namespace detail {
0010 class RandomGenerator;
0011 RandomGenerator * newRandomGenerator();
0012 void deleteRandomGenerator(RandomGenerator * gen);
0013 }
0014
0015
0016 class Rambo {
0017
0018 public:
0019 enum {SUCCESS, NEWTON_METHOD_FAILED=1};
0020
0021 public:
0022
0023 Rambo()
0024 : m_(0), rnd_(detail::newRandomGenerator()), s_(0), n_(0), flag_(0) {}
0025
0026 Rambo(Real energy, unsigned n, const Real masses[] = 0)
0027 : m_(masses), rnd_(detail::newRandomGenerator()),
0028 s_(energy), n_(n), flag_(SUCCESS)
0029 {}
0030
0031 ~Rambo()
0032 {
0033 detail::deleteRandomGenerator(rnd_);
0034 }
0035
0036 Rambo & setNParticles(unsigned n)
0037 {
0038 n_ = n;
0039 return *this;
0040 }
0041
0042 Rambo & setEnergy(Real energy)
0043 {
0044 s_ = energy;
0045 return *this;
0046 }
0047
0048
0049 Rambo & setMasses(const Real * masses)
0050 {
0051 m_ = masses;
0052 return *this;
0053 }
0054
0055 Rambo & setSeed(int seed);
0056
0057 int getMomenta(RealMomentum vecs[], Real * weight = 0);
0058
0059 private:
0060
0061 void getIncomingMomenta_(RealMomentum vecs[]);
0062 Real rambo0_(RealMomentum u[], RealMomentum vecs[]);
0063 Real newton_(RealMomentum vecs[]);
0064
0065 private:
0066 const Real * m_;
0067 detail::RandomGenerator * rnd_;
0068 Real s_;
0069 int n_, flag_;
0070 };
0071
0072 }
0073
0074 #endif