diff --git a/tests/modules/testTracking.cpp b/tests/modules/testTracking.cpp index fb398e795668ecb87c230ed03a047fad17af9049..15d2aad258b9e5a552c3a0320706b25fcb75b8e0 100644 --- a/tests/modules/testTracking.cpp +++ b/tests/modules/testTracking.cpp @@ -113,13 +113,25 @@ TEMPLATE_TEST_CASE("Tracking", "tracking", tracking_leapfrog_curved::Tracking, TestType tracking; Point const center(cs, {0_m, 0_m, 0_m}); auto target = setup::Environment::createNode<Sphere>(center, radius); + // every particle should hit target_2 + // it is very close to injection and not so small auto target_2 = setup::Environment::createNode<Sphere>( Point(cs, {-radius * 3 / 4, 0_m, 0_m}), radius * 0.2); + // only neutral particles hit_target_neutral + // this is far from injection and really small auto target_neutral = setup::Environment::createNode<Sphere>( Point(cs, {radius / 2, 0_m, 0_m}), radius * 0.1); + // target to be overlapped entirely by target_2 + auto target_2_behind = setup::Environment::createNode<Sphere>( + Point(cs, {-radius * 3 / 4, 0_m, 0_m}), radius * 0.1); + + // target to be overlapped partly by target_2 + auto target_2_partly_behind = setup::Environment::createNode<Sphere>( + Point(cs, {-radius * 3 / 4 + radius * 0.1, 0_m, 0_m}), radius * 0.2); + using MyHomogeneousModel = MediumPropertyModel< UniformMagneticField<HomogeneousMedium<setup::EnvironmentInterface>>>; @@ -133,12 +145,24 @@ TEMPLATE_TEST_CASE("Tracking", "tracking", tracking_leapfrog_curved::Tracking, target_2->setModelProperties<MyHomogeneousModel>( Medium::AirDry1Atm, magneticfield, 1_g / (1_m * 1_m * 1_m), NuclearComposition(std::vector<Code>{Code::Oxygen}, std::vector<float>{1.})); + target_2_behind->setModelProperties<MyHomogeneousModel>( + Medium::AirDry1Atm, magneticfield, 1_g / (1_m * 1_m * 1_m), + NuclearComposition(std::vector<Code>{Code::Oxygen}, std::vector<float>{1.})); + target_2_partly_behind->setModelProperties<MyHomogeneousModel>( + Medium::AirDry1Atm, magneticfield, 1_g / (1_m * 1_m * 1_m), + NuclearComposition(std::vector<Code>{Code::Oxygen}, std::vector<float>{1.})); auto* targetPtr = target.get(); auto* targetPtr_2 = target_2.get(); auto* targetPtr_neutral = target_neutral.get(); + auto* targetPtr_2_behind = target_2_behind.get(); + auto* targetPtr_2_partly_behind = target_2_partly_behind.get(); + target_2_behind->excludeOverlapWith(target_2); + target_2_partly_behind->excludeOverlapWith(target_2); worldPtr->addChild(std::move(target)); targetPtr->addChild(std::move(target_2)); targetPtr->addChild(std::move(target_neutral)); + targetPtr->addChild(std::move(target_2_behind)); + targetPtr->addChild(std::move(target_2_partly_behind)); auto [stack, viewPtr] = setup::testing::setup_stack(PID, 0, 0, P0, targetPtr, cs); { [[maybe_unused]] auto& viewPtr_dum = viewPtr; } @@ -167,9 +191,13 @@ TEMPLATE_TEST_CASE("Tracking", "tracking", tracking_leapfrog_curved::Tracking, // move forward, until we leave target volume bool hit_neutral = false; bool hit_2nd = false; + bool hit_2nd_behind = false; + [[maybe_unused]] bool hit_2nd_partly_behind = false; while (nextVol != worldPtr) { if (nextVol == targetPtr_neutral) hit_neutral = true; if (nextVol == targetPtr_2) hit_2nd = true; + if (nextVol == targetPtr_2_behind) hit_2nd_behind = true; + if (nextVol == targetPtr_2_partly_behind) hit_2nd_partly_behind = true; const auto [traj2, nextVol2] = tracking.getTrack(particle); nextVol = nextVol2; particle.setNode(nextVol); @@ -181,6 +209,10 @@ TEMPLATE_TEST_CASE("Tracking", "tracking", tracking_leapfrog_curved::Tracking, particle.getVelocity().getNorm(), traj2.getLength(1), traj2.getLength(1) / particle.getVelocity().getNorm()); } + CHECK_FALSE(hit_2nd_behind); // this can never happen + // the next line is maybe an actual BUG: this should be investigated and eventually + // fixed: + // CHECK(hit_2nd == hit_2nd_partly_behind); // if one is hit, the other also must be CHECK(nextVol == worldPtr); CHECK(hit_2nd == true); CHECK(hit_neutral == (deflect == 0 ? true : false));