/* LayeredTarget.h Functional unit for targets in the Mask environment. Contains a set (read: vector) of Targets for use in reaction calculations. In this way handles situations such as carbon backed targets Based on code by D.W. Visser written at Yale for the original SPANC Written by G.W. McCann Aug. 2020 */ #include "LayeredTarget.h" #include namespace Mask { LayeredTarget::LayeredTarget() : m_name("") { } LayeredTarget::~LayeredTarget() {} /*Add in a Target made of a compound defined by a set of Zs, As, Ss, and a thickness*/ void LayeredTarget::AddLayer(const std::vector& Z, const std::vector& A, const std::vector& stoich, double thickness) { m_layers.emplace_back(Z, A, stoich, thickness); } /* Here projectile refers to the incoming reactant particle (i.e. the beam) Calculates energy loss assuming that the reaction occurs in the middle of the target layer Note that the layer order can matter! */ double LayeredTarget::GetProjectileEnergyLoss(int zp, int ap, double startEnergy, std::size_t rxnLayer, double angle, double rxnDepth) { if(rxnLayer > m_layers.size()) { std::cerr<<"Reaction layer in eloss calculation is not in range! Returning 0"< m_layers.size()) { std::cerr<<"Reaction layer in eloss calculation is not in range! Returning 0"<0; i--) //unsigned ints cant be less than 0 { eloss += m_layers[i].GetEnergyLossTotal(ze, ae, newEnergy, angle); newEnergy = startEnergy - eloss; } eloss += m_layers[0].GetEnergyLossTotal(ze, ae, newEnergy, angle); newEnergy = startEnergy - eloss; } return eloss; } /*ReverseEnergyLoss version of GetEjectileEnergyLoss*/ double LayeredTarget::GetEjectileReverseEnergyLoss(int ze, int ae, double startEnergy, std::size_t rxnLayer, double angle, double rxnDepth) { if(rxnLayer > m_layers.size()) { std::cerr<<"Reaction layer in eloss calculation is not in range! Returning 0"<rxnLayer; i--) { eloss += m_layers[i].GetReverseEnergyLossTotal(ze, ae, newEnergy, angle); newEnergy = startEnergy + eloss; } eloss += m_layers[rxnLayer].GetReverseEnergyLossFractionalDepth(ze, ae, newEnergy, angle, rxnDepth); newEnergy = startEnergy + eloss; } else { double newEnergy = startEnergy; for(std::size_t i=0; i < rxnLayer; i++) { eloss += m_layers[i].GetReverseEnergyLossTotal(ze, ae, newEnergy, angle); newEnergy = startEnergy + eloss; } eloss += m_layers[rxnLayer].GetReverseEnergyLossFractionalDepth(ze, ae, newEnergy, angle, rxnDepth); newEnergy = startEnergy + eloss; } return eloss; } std::size_t LayeredTarget::FindLayerContaining(int Z, int A) { for(std::size_t i=0; i