From 887f025b3b82796f30a1c3b5e3baef9965f85d5c Mon Sep 17 00:00:00 2001 From: Gordon McCann Date: Wed, 9 Mar 2022 22:44:45 -0500 Subject: [PATCH] Finished fleshing out user UI example. Also, added NavVariables (calc constants). --- NavProject/src/SPSAnalysisStage.cpp | 4 +- NavProject/src/SPSInputLayer.cpp | 61 ++++++++++++++++++++++++++--- NavProject/src/SPSInputLayer.h | 12 +++++- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/NavProject/src/SPSAnalysisStage.cpp b/NavProject/src/SPSAnalysisStage.cpp index 2675c5f..0e6ed20 100644 --- a/NavProject/src/SPSAnalysisStage.cpp +++ b/NavProject/src/SPSAnalysisStage.cpp @@ -65,10 +65,10 @@ namespace Navigator { //If you want to use parameters to calculate another parameter, you //need to check that the parameter is valid (set in this event)! if(delayFLTime.IsValid() && delayFRTime.IsValid()) - x1.SetValue((delayFLTime.GetValue() - delayFRTime.GetValue())*0.5); + x1.SetValue((delayFLTime.GetValue() - delayFRTime.GetValue())*0.5*0.4762); if(delayBLTime.IsValid() && delayBRTime.IsValid()) - x2.SetValue((delayBLTime.GetValue() - delayBRTime.GetValue())*0.5); + x2.SetValue((delayBLTime.GetValue() - delayBRTime.GetValue())*0.5*0.5051); if (x1.IsValid() && x2.IsValid()) xavg.SetValue(x1_weight.GetValue() * x1.GetValue() + x2_weight.GetValue() * x2.GetValue()); diff --git a/NavProject/src/SPSInputLayer.cpp b/NavProject/src/SPSInputLayer.cpp index 1e32cdb..aee4a35 100644 --- a/NavProject/src/SPSInputLayer.cpp +++ b/NavProject/src/SPSInputLayer.cpp @@ -5,7 +5,7 @@ namespace Navigator { SPSInputLayer::SPSInputLayer() : Layer("SPSInputLayer"), x1_weight("x1_weight"), x2_weight("x2_weight"), m_bfield(0.0), m_theta(0.0), m_beamKE(0.0), - m_targMass(0.0), m_projMass(0.0), m_ejectMass(0.0), m_residMass(0.0) + m_rxnEqn("") { for (int i = 0; i < 2; i++) { @@ -45,12 +45,19 @@ namespace Navigator { { UpdateWeights(); } + ImGui::Text("-------Current Settings-------"); + ImGui::Text("Reaction Equation: "); + ImGui::SameLine(); + ImGui::Text(m_rxnEqn.c_str()); + ImGui::Text("X1 Weight: %f", x1_weight.GetValue()); + ImGui::Text("X2 Weight: %f", x2_weight.GetValue()); ImGui::End(); } } void SPSInputLayer::UpdateWeights() { + m_rxnEqn = ""; for (int i = 0; i < 2; i++) m_residNums[i] = m_targNums[i] + m_projNums[i] - m_ejectNums[i]; if (m_residNums[0] < 0 || m_residNums[1] <= 0) @@ -59,12 +66,54 @@ namespace Navigator { return; } - m_targMass = m_masses.FindMass(m_targNums[0], m_targNums[1]); - m_projMass = m_masses.FindMass(m_projNums[0], m_projNums[1]); - m_ejectMass = m_masses.FindMass(m_ejectNums[0], m_ejectNums[1]); - m_residMass = m_masses.FindMass(m_residNums[0], m_residNums[1]); - if (m_targMass == 0.0 || m_projMass == 0.0 || m_ejectMass == 0.0 || m_residMass == 0.0) + if (m_bfield == 0.0 || m_beamKE == 0.0) + { + NAV_ERROR("Invaild kinematic settings at SPSInputLayer::UpdateWeights()! BeamKE: {0} Bfield: {1}", m_beamKE, m_bfield); + return; + } + + double targMass = m_masses.FindMass(m_targNums[0], m_targNums[1]); + double projMass = m_masses.FindMass(m_projNums[0], m_projNums[1]); + double ejectMass = m_masses.FindMass(m_ejectNums[0], m_ejectNums[1]); + double residMass = m_masses.FindMass(m_residNums[0], m_residNums[1]); + if (targMass == 0.0 || projMass == 0.0 || ejectMass == 0.0 || residMass == 0.0) return; + std::string temp; + temp = m_masses.FindSymbol(m_targNums[0], m_targNums[1]); + m_rxnEqn += temp + "("; + temp = m_masses.FindSymbol(m_projNums[0], m_projNums[1]); + m_rxnEqn += temp + ","; + temp = m_masses.FindSymbol(m_ejectNums[0], m_ejectNums[1]); + m_rxnEqn += temp + ")"; + temp = m_masses.FindSymbol(m_residNums[0], m_residNums[1]); + m_rxnEqn += temp; + + double theta_rad = m_theta * c_deg2rad; + double bfield_t = m_bfield * 0.1; //convert to tesla + double Q = targMass + projMass - ejectMass - residMass; + //kinematics a la Iliadis p.590 + double term1 = std::sqrt(projMass * ejectMass * m_beamKE) / (ejectMass + residMass) * std::cos(theta_rad); + double term2 = (m_beamKE * (residMass - projMass) + residMass * Q) / (ejectMass + residMass); + + double ejectKE = term1 + std::sqrt(term1 * term1 + term2); + ejectKE *= ejectKE; + + //momentum + double ejectP = std::sqrt(ejectKE * (ejectKE + 2.0 * ejectMass)); + + //calculate rho from B a la B*rho = (proj. momentum)/(proj. charge) + double rho = (ejectP * c_mev2j) / (m_ejectNums[0] * c_e * c_C * bfield_t) * 100.0; //in cm + + double K; + K = sqrt(projMass * ejectMass * m_beamKE / ejectKE); + K *= std::sin(theta_rad); + + double denom = ejectMass + residMass - std::sqrt(projMass * ejectMass * m_beamKE / ejectKE) * std::cos(theta_rad); + + K /= denom; + double zshift = -1 * rho * c_spsDisp * c_spsMag * K; //delta-Z in cm + x1_weight.SetValue((0.5 - zshift / c_wireDist)); + x2_weight.SetValue((1.0 - x1_weight.GetValue())); } } \ No newline at end of file diff --git a/NavProject/src/SPSInputLayer.h b/NavProject/src/SPSInputLayer.h index a13cfba..19f8fc4 100644 --- a/NavProject/src/SPSInputLayer.h +++ b/NavProject/src/SPSInputLayer.h @@ -34,11 +34,19 @@ namespace Navigator { int m_ejectNums[2]; int m_residNums[2]; - //Internal values - double m_targMass, m_projMass, m_ejectMass, m_residMass; + //Text for UI + std::string m_rxnEqn; //Map for mass table MassMap m_masses; + + static constexpr double c_mev2j = 1.60218E-13; //J per MeV + static constexpr double c_e = 1.602E-19; //unit charge Coulombs + static constexpr double c_C = 2.9979E8; //speed of light m/s + static constexpr double c_spsDisp = 1.96; //dispersion (x/rho) + static constexpr double c_spsMag = 0.39; //magnification in x + static constexpr double c_wireDist = 4.28625; //FPD anode wire separation in cm + static constexpr double c_deg2rad = 3.14159265358979323846 / 180.0; //pi/180 }; }