56#include <gtest/gtest.h>
84 double time = 0.0,
double charge = -1.0e-17,
double mass = 0.51099895) {
88 class LossDataSinkTest :
public ::testing::Test {
90 static void SetUpTestSuite() {
92 char** argv =
nullptr;
93 ippl::initialize(argc, argv);
96 static void TearDownTestSuite() { ippl::finalize(); }
98 void SetUp()
override {
106 bool oldComputePercentiles_m =
false;
109 TEST_F(LossDataSinkTest, AddParticleRejectsTurnInformationAfterPlainParticle) {
112 sink.
addParticle(makeParticle(1, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0)));
116 makeParticle(2, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0)),
117 std::make_pair(3,
static_cast<short>(4))),
121 TEST_F(LossDataSinkTest, AddParticleRejectsPlainParticleAfterTurnInformation) {
125 makeParticle(1, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0)),
126 std::make_pair(3,
static_cast<short>(4)));
130 makeParticle(2, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0))),
134 TEST_F(LossDataSinkTest, ComputeStatisticsSingleParticle) {
140 sink.
addParticle(makeParticle(1, r, p, 5.0, -2.0e-17, 0.51099895));
144 ASSERT_EQ(stats.size(), 1u);
150 EXPECT_DOUBLE_EQ(stat.
rmean_m(0), 1.0);
151 EXPECT_DOUBLE_EQ(stat.
rmean_m(1), -2.0);
152 EXPECT_DOUBLE_EQ(stat.
rmean_m(2), 3.0);
154 EXPECT_DOUBLE_EQ(stat.
pmean_m(0), 0.1);
155 EXPECT_DOUBLE_EQ(stat.
pmean_m(1), -0.2);
156 EXPECT_DOUBLE_EQ(stat.
pmean_m(2), 4.0);
158 EXPECT_DOUBLE_EQ(stat.
rrms_m(0), 0.0);
159 EXPECT_DOUBLE_EQ(stat.
rrms_m(1), 0.0);
160 EXPECT_DOUBLE_EQ(stat.
rrms_m(2), 0.0);
162 EXPECT_DOUBLE_EQ(stat.
prms_m(0), 0.0);
163 EXPECT_DOUBLE_EQ(stat.
prms_m(1), 0.0);
164 EXPECT_DOUBLE_EQ(stat.
prms_m(2), 0.0);
166 EXPECT_DOUBLE_EQ(stat.
tmean_m, 5.0);
167 EXPECT_DOUBLE_EQ(stat.
trms_m, 0.0);
173 TEST_F(LossDataSinkTest, MaxRUsesMaximumAbsoluteExtent) {
176 sink.
addParticle(makeParticle(1, makeVector(-2.0, 5.0, -7.0), makeVector(0.0, 0.0, 1.0)));
178 sink.
addParticle(makeParticle(2, makeVector(1.0, -6.0, 4.0), makeVector(0.0, 0.0, 1.0)));
182 ASSERT_EQ(stats.size(), 1u);
186 EXPECT_DOUBLE_EQ(stat.
rmin_m(0), -2.0);
187 EXPECT_DOUBLE_EQ(stat.
rmax_m(0), 1.0);
188 EXPECT_DOUBLE_EQ(stat.
maxR_m(0), 2.0);
190 EXPECT_DOUBLE_EQ(stat.
rmin_m(1), -6.0);
191 EXPECT_DOUBLE_EQ(stat.
rmax_m(1), 5.0);
192 EXPECT_DOUBLE_EQ(stat.
maxR_m(1), 6.0);
194 EXPECT_DOUBLE_EQ(stat.
rmin_m(2), -7.0);
195 EXPECT_DOUBLE_EQ(stat.
rmax_m(2), 4.0);
196 EXPECT_DOUBLE_EQ(stat.
maxR_m(2), 7.0);
199 TEST_F(LossDataSinkTest, MeanAndRmsTimeAreComputedCorrectly) {
203 makeParticle(1, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0), 1.0));
206 makeParticle(2, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0), 3.0));
210 ASSERT_EQ(stats.size(), 1u);
214 EXPECT_DOUBLE_EQ(stat.
tmean_m, 2.0);
215 EXPECT_DOUBLE_EQ(stat.
trms_m, 1.0);
218 TEST_F(LossDataSinkTest, StdKineticEnergyIsStableForIdenticalParticles) {
224 constexpr std::size_t numParticles = 10000;
226 for (std::size_t i = 0; i < numParticles; ++i) {
227 sink.
addParticle(makeParticle(i, r, p, 1.0, -1.5e-17, 0.51099895));
232 ASSERT_EQ(stats.size(), 1u);
236 EXPECT_EQ(stat.
nTotal_m, numParticles);
241 TEST_F(LossDataSinkTest, SplitSetsClearsPreviousStateForSingleSet) {
247 makeParticle(1, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0), 1.0));
254 TEST_F(LossDataSinkTest, SplitSetsCreatesMonotonicBoundaries) {
258 makeParticle(1, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0), 0.0));
261 makeParticle(2, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0), 1.0));
264 makeParticle(3, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0), 10.0));
267 makeParticle(4, makeVector(0.0, 0.0, 0.0), makeVector(0.0, 0.0, 1.0), 11.0));
282 TEST_F(LossDataSinkTest, KineticEnergyUsesParticleMass) {
285 const auto r = makeVector(0.0, 0.0, 0.0);
286 const auto p = makeVector(0.0, 0.0, 13.87990113);
288 sink.
addParticle(makeParticle(1, r, p, 1.0, -1.0e-17, 0.51099895));
291 ASSERT_EQ(stats.size(), 1u);
296 EXPECT_NEAR(stat.
totalMass_m, 0.51099895, 1.0e-12);
ippl::Vector< T, Dim > Vector_t
TEST_F(MonitorTest, GetType)
std::set< SetStatistics > computeStatistics(unsigned int numSets)
void addParticle(const OpalParticle &, const std::optional< std::pair< int, short int > > &turnBunchNumPair=std::nullopt)
void splitSets(unsigned int numSets)
std::vector< OpalParticle > particles_m
std::vector< unsigned long > startSet_m
double stdKineticEnergy_m
Vector_t< double, 3 > maxR_m
Vector_t< double, 3 > rrms_m
Vector_t< double, 3 > rmax_m
Vector_t< double, 3 > prms_m
double meanKineticEnergy_m
Vector_t< double, 3 > pmean_m
Vector_t< double, 3 > rmin_m
Vector_t< double, 3 > rmean_m