#include "ReactionSystem.h" #include "KinematicsExceptions.h" #include "LegendrePoly.h" namespace Mask { ReactionSystem::ReactionSystem() : m_beamDist(0,0), m_theta1Range(0,0), m_phi1Range(0,0), m_exDist(0,0), generator(nullptr), target_set_flag(false), gen_set_flag(false), rxnLayer(0), m_sys_equation("") { } ReactionSystem::ReactionSystem(std::vector& z, std::vector& a) : m_beamDist(0,0), m_theta1Range(0,0), m_phi1Range(0,0), m_exDist(0,0), generator(nullptr), target_set_flag(false), gen_set_flag(false), rxnLayer(0), m_sys_equation("") { SetNuclei(z, a); } ReactionSystem::~ReactionSystem() { } bool ReactionSystem::SetNuclei(std::vector&z, std::vector& a) { if(z.size() != a.size() || z.size() < 3) { return false; } step1.SetNuclei(z[0], a[0], z[1], a[1], z[2], a[2]); SetSystemEquation(); return true; } void ReactionSystem::SetRandomGenerator(TRandom3* gen) { generator = gen; decay1dist.AttachRandomNumberGenerator(gen); decay2dist.AttachRandomNumberGenerator(gen); gen_set_flag = true; } void ReactionSystem::AddTargetLayer(std::vector& zt, std::vector& at, std::vector& stoich, double thickness) { target.AddLayer(zt, at, stoich, thickness); } void ReactionSystem::LinkTarget() { step1.SetLayeredTarget(&target); rxnLayer = target.FindLayerContaining(step1.GetTarget().GetZ(), step1.GetTarget().GetA()); if(rxnLayer != -1) { step1.SetRxnLayer(rxnLayer); target_set_flag = true; } else { throw ReactionLayerException(); } } void ReactionSystem::SetSystemEquation() { m_sys_equation = step1.GetTarget().GetIsotopicSymbol(); m_sys_equation += "("; m_sys_equation += step1.GetProjectile().GetIsotopicSymbol(); m_sys_equation += ", "; m_sys_equation += step1.GetEjectile().GetIsotopicSymbol(); m_sys_equation += ")"; m_sys_equation += step1.GetResidual().GetIsotopicSymbol(); } void ReactionSystem::RunSystem() { if(!gen_set_flag) return; //Link up the target if it hasn't been done yet if(!target_set_flag) { LinkTarget(); } if(step1.IsDecay()) { double decaycostheta = decay1dist.GetRandomCosTheta(); if(decaycostheta == -10.0) { step1.ResetEjectile(); step1.ResetResidual(); return; } double rxnTheta = std::acos(decay1dist.GetRandomCosTheta()); double rxnPhi = generator->Uniform(0, 2.0*M_PI); step1.SetPolarRxnAngle(rxnTheta); step1.SetAzimRxnAngle(rxnPhi); step1.TurnOnResidualEloss(); step1.Calculate(); } else { //Sample parameters double bke = generator->Gaus(m_beamDist.first, m_beamDist.second); double rxnTheta = acos(generator->Uniform(cos(m_theta1Range.first), cos(m_theta1Range.second))); double rxnPhi = generator->Uniform(m_phi1Range.first, m_phi1Range.second); double residEx = generator->Gaus(m_exDist.first, m_exDist.second); step1.SetBeamKE(bke); step1.SetPolarRxnAngle(rxnTheta); step1.SetAzimRxnAngle(rxnPhi); step1.SetExcitation(residEx); step1.TurnOnResidualEloss(); step1.Calculate(); } } };