/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #include #include "gtest/gtest.h" #include "src/common_cpp/Recon/Global/TrackMatching.hh" #include "src/legacy/BeamTools/BTFieldConstructor.hh" #include "src/common_cpp/Globals/GlobalsManager.hh" #include "src/common_cpp/Utils/Globals.hh" #include "src/common_cpp/Simulation/MAUSGeant4Manager.hh" #include "src/common_cpp/Simulation/DetectorConstruction.hh" #include "src/common_cpp/Recon/Global/GlobalTools.hh" namespace MAUS { namespace recon { namespace global { class TrackMatchingTest : public ::testing::Test { protected: TrackMatchingTest() {} virtual ~TrackMatchingTest() {} virtual void SetUp() { _global_event = new GlobalEvent; _matching_tolerances["TOF0"] = std::make_pair(2.0, 0.0); _matching_tolerances["TOF1"] = std::make_pair(40.0, 40.0); _matching_tolerances["TOF2"] = std::make_pair(40.0, 40.0); _matching_tolerances["KL"] = std::make_pair(10000, 32.0); _matching_tolerances["EMR"] = std::make_pair(40.0, 40.0); _matching_tolerances["TOF12dT"] = std::make_pair(27.0, 54.0); _matching_tolerances["TKD"] = std::make_pair(20.0, 20.0); _no_check_settings = std::make_pair(false, false); _residuals = false; } virtual void TearDown() {} public: void BuildGlobalEvent(); void run_one(bool propagate_x, bool propagate_p, bool tof12, recon::global::TrackMatching::through_track_algorithm, recon::global::TrackMatching::geometry_algorithm algo); GlobalEvent* _global_event; recon::global::TrackMatching* _track_matching; std::map > _matching_tolerances; std::pair _no_check_settings; bool _residuals; }; void TrackMatchingTest::BuildGlobalEvent() { delete _global_event; _global_event = new GlobalEvent; TLorentzVector tof0_pos(0.0, 0.0, 100.0, 0.0); TLorentzVector tof1_pos(30.0, 0.0, 7902.0, 31.0); TLorentzVector tracker0_pos(-1.11, -20.74, 8537.0, 33.0); TLorentzVector tracker0_mom(-5.3091, 16.5831, 164.164, 196.002); TLorentzVector tracker1_pos(13.88, 3.38, 14452.0, 57.0); TLorentzVector tracker1_mom(16.3777, 3.10231, 157.157, 190.105); TLorentzVector tof2_pos(0.0, -30.0, 15260.0, 60.0); TLorentzVector kl_pos(0.0, 0.0, 15383.0, 61.0); TLorentzVector emr_pos(0.0, -13.0, 16100.0, 64.0); TLorentzVector emr_pos_error(2.0, 2.0, 5.0, 10.0); // Add Spacepoints for TOFs and KL to global event DataStructure::Global::SpacePoint* tof0_sp = new DataStructure::Global::SpacePoint(); tof0_sp->set_position(tof0_pos); tof0_sp->set_detector(DataStructure::Global::kTOF0); _global_event->add_space_point(tof0_sp); DataStructure::Global::SpacePoint* tof1_sp = new DataStructure::Global::SpacePoint(); tof1_sp->set_position(tof1_pos); tof1_sp->set_detector(DataStructure::Global::kTOF1); _global_event->add_space_point(tof1_sp); DataStructure::Global::SpacePoint* tof2_sp = new DataStructure::Global::SpacePoint(); tof2_sp->set_position(tof2_pos); tof2_sp->set_detector(DataStructure::Global::kTOF2); _global_event->add_space_point(tof2_sp); DataStructure::Global::SpacePoint* kl_sp = new DataStructure::Global::SpacePoint(); kl_sp->set_position(kl_pos); kl_sp->set_detector(DataStructure::Global::kCalorimeter); _global_event->add_space_point(kl_sp); // For Tracker and EMR make trackpoints and tracks DataStructure::Global::Track* tracker0_track = new DataStructure::Global::Track(); DataStructure::Global::SpacePoint* sp = new DataStructure::Global::SpacePoint(); sp->set_position(tracker0_pos); DataStructure::Global::TrackPoint* tracker0_tp = new DataStructure::Global::TrackPoint(sp); tracker0_tp->set_momentum(tracker0_mom); tracker0_tp->set_detector(DataStructure::Global::kTracker0); tracker0_track->AddTrackPoint(tracker0_tp); tracker0_tp = new DataStructure::Global::TrackPoint(sp); tracker0_tp->set_momentum(tracker0_mom); tracker0_tp->set_detector(DataStructure::Global::kTracker0_1); tracker0_track->AddTrackPoint(tracker0_tp); _global_event->add_track_recursive(tracker0_track); DataStructure::Global::Track* tracker1_track = new DataStructure::Global::Track(); sp->set_position(tracker1_pos); DataStructure::Global::TrackPoint* tracker1_tp = new DataStructure::Global::TrackPoint(sp); tracker1_tp->set_momentum(tracker1_mom); tracker1_tp->set_detector(DataStructure::Global::kTracker1); tracker1_track->AddTrackPoint(tracker1_tp); tracker1_tp = new DataStructure::Global::TrackPoint(sp); tracker1_tp->set_momentum(tracker1_mom); tracker1_tp->set_detector(DataStructure::Global::kTracker1_1); tracker1_track->AddTrackPoint(tracker1_tp); _global_event->add_track_recursive(tracker1_track); sp->set_position(emr_pos); sp->set_position_error(emr_pos_error); DataStructure::Global::TrackPoint* emr_tp = new DataStructure::Global::TrackPoint(sp); emr_tp->set_detector(DataStructure::Global::kEMR); DataStructure::Global::Track* emr_track = new DataStructure::Global::Track(); emr_track->AddTrackPoint(emr_tp); emr_track->set_emr_range_primary(20.0); _global_event->add_track_recursive(emr_track); } TEST_F(TrackMatchingTest, USTrack_DSTrack_throughTrackTOF01) { BuildGlobalEvent(); _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); Simulation::DetectorConstruction* dc = Globals::GetInstance()->GetGeant4Manager()->GetGeometry(); std::string mod_path = std::string(getenv("MAUS_ROOT_DIR"))+ "/tests/cpp_unit/Recon/Global/TestGeometries/"; MiceModule geometry(mod_path+"SimpleBeamline.dat"); dc->SetMiceModules(geometry); _track_matching->USTrack(); _track_matching->DSTrack(); _track_matching->throughTrack(); std::vector us_chains = _global_event->GetUSPrimaryChains(); std::vector ds_chains = _global_event->GetDSPrimaryChains(); std::vector through_chains = _global_event->GetThroughPrimaryChains(); EXPECT_EQ(us_chains.size(), 1); EXPECT_EQ(ds_chains.size(), 1); EXPECT_EQ(through_chains.size(), 1); if (us_chains.size() == 1 and ds_chains.size() == 1 and through_chains.size() == 1) { DataStructure::Global::PrimaryChain* us_chain = us_chains.at(0); DataStructure::Global::PrimaryChain* ds_chain = ds_chains.at(0); DataStructure::Global::PrimaryChain* through_chain = through_chains.at(0); EXPECT_EQ(through_chain->GetUSDaughter(), us_chain); EXPECT_EQ(through_chain->GetDSDaughter(), ds_chain); EXPECT_EQ(us_chain->GetMatchedTrack( DataStructure::Global::kMuPlus)->GetTrackPoints().size(), 4); EXPECT_EQ(ds_chain->GetMatchedTrack( DataStructure::Global::kMuPlus)->GetTrackPoints().size(), 5); EXPECT_EQ(through_chain->GetMatchedTrack( DataStructure::Global::kMuPlus)->GetTrackPoints().size(), 9); EXPECT_FLOAT_EQ(ds_chain->GetMatchedTrack( DataStructure::Global::kMuPlus)->get_emr_range_primary(), 20.0); EXPECT_FLOAT_EQ(through_chain->GetMatchedTrack( DataStructure::Global::kMuPlus)->get_emr_range_primary(), 20.0); } delete _global_event; } TEST_F(TrackMatchingTest, GetDetectorTrackArray) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); DataStructure::Global::Track tracker0_track1; tracker0_track1.SetDetector(DataStructure::Global::kTracker0); tracker0_track1.set_mapper_name("Tracker0"); _global_event->add_track(&tracker0_track1); DataStructure::Global::Track tracker0_track2; tracker0_track2.SetDetector(DataStructure::Global::kTracker0); tracker0_track2.set_mapper_name("Tracker0"); _global_event->add_track(&tracker0_track2); DataStructure::Global::Track tracker1_track; tracker1_track.SetDetector(DataStructure::Global::kTracker1); tracker1_track.set_mapper_name("Tracker1"); _global_event->add_track(&tracker1_track); DataStructure::Global::Track emr_primary_track; emr_primary_track.SetDetector(DataStructure::Global::kEMR); emr_primary_track.set_mapper_name("EMR Primary"); emr_primary_track.set_emr_range_primary(10.0); _global_event->add_track(&emr_primary_track); DataStructure::Global::Track emr_secondary_track; emr_secondary_track.SetDetector(DataStructure::Global::kEMR); emr_secondary_track.set_mapper_name("EMR Secondary"); emr_secondary_track.set_emr_range_secondary(10.0); _global_event->add_track(&emr_secondary_track); DataStructure::Global::TrackPArray* tracker0_array = _track_matching->GetDetectorTrackArray( DataStructure::Global::kTracker0); EXPECT_EQ(tracker0_array->size(), 2); if (tracker0_array->size() > 1) { EXPECT_EQ(tracker0_array->at(0)->get_mapper_name(), "Tracker0"); EXPECT_EQ(tracker0_array->at(0)->get_mapper_name(), "Tracker0"); } DataStructure::Global::TrackPArray* tracker1_array = _track_matching->GetDetectorTrackArray( DataStructure::Global::kTracker1); EXPECT_EQ(tracker1_array->size(), 1); if (tracker1_array->size() > 0) { EXPECT_EQ(tracker1_array->at(0)->get_mapper_name(), "Tracker1"); } DataStructure::Global::TrackPArray* emr_array = _track_matching->GetDetectorTrackArray( DataStructure::Global::kEMR); EXPECT_EQ(emr_array->size(), 1); if (emr_array->size() > 0) { EXPECT_EQ(emr_array->at(0)->get_mapper_name(), "EMR Primary"); } } void TrackMatchingTest::run_one(bool propagate_x, bool propagate_p, bool tof12, recon::global::TrackMatching::through_track_algorithm through, recon::global::TrackMatching::geometry_algorithm algo) { double x = 5.0; if (propagate_x) { x = 20.0; } double p = 5.0; if (propagate_p) { p = 20.0; } _matching_tolerances["TKD"] = std::make_pair(x, p); if (tof12) { _matching_tolerances["TOF12dT"] = std::make_pair(27.0, 54.0); } else { _matching_tolerances["TOF12dT"] = std::make_pair(0.0, 1.0); } BuildGlobalEvent(); _track_matching = new TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals, true, algo, std::vector(), through); _track_matching->USTrack(); _track_matching->DSTrack(); _track_matching->throughTrack(); } TEST_F(TrackMatchingTest, ThroughMatchPropagate) { using recon::global::TrackMatching; Simulation::DetectorConstruction* dc = Globals::GetInstance()->GetGeant4Manager()->GetGeometry(); std::string mod_path = std::string(getenv("MAUS_ROOT_DIR"))+ "/tests/cpp_unit/Recon/Global/TestGeometries/"; MiceModule geometry(mod_path+"SimpleBeamline.dat"); dc->SetMiceModules(geometry); // axial lookup run_one(true, true, false, TrackMatching::kPropagate, TrackMatching::kAxialLookup); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 1); // classic g4 lookup run_one(true, true, false, TrackMatching::kPropagate, TrackMatching::kClassicG4); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 1); // track out of tolerance (p) run_one(true, false, true, TrackMatching::kPropagate, TrackMatching::kAxialLookup); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 0); // track out of tolerance (x) run_one(false, true, true, TrackMatching::kPropagate, TrackMatching::kAxialLookup); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 0); // propagate and TOF12 (should make a through chain even though propagate fails) run_one(false, false, true, TrackMatching::kTOF12, TrackMatching::kAxialLookup); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 1); // propagate and TOF12 (should make a through chain even though tof12 fails) run_one(true, true, false, TrackMatching::kPropagateAndTOF12, TrackMatching::kAxialLookup); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 1); // propagate requiring TOF12 (should make a through chain even though propagate fails) run_one(false, false, true, TrackMatching::kPropagateRequiringTOF12, TrackMatching::kAxialLookup); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 1); // propagate requiring TOF12 (should fail a through chain as TOF12 fails) run_one(true, true, false, TrackMatching::kPropagateRequiringTOF12, TrackMatching::kAxialLookup); ASSERT_EQ(_global_event->GetThroughPrimaryChains().size(), 0); } TEST_F(TrackMatchingTest, VirtualPlanes) { using recon::global::TrackMatching; BuildGlobalEvent(); _track_matching = new TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals, true, TrackMatching::kClassicG4, std::vector(1, 10000.), TrackMatching::kPropagate); Simulation::DetectorConstruction* dc = Globals::GetInstance()->GetGeant4Manager()->GetGeometry(); std::string mod_path = std::string(getenv("MAUS_ROOT_DIR"))+ "/tests/cpp_unit/Recon/Global/TestGeometries/"; MiceModule geometry(mod_path+"SimpleBeamline.dat"); dc->SetMiceModules(geometry); _track_matching->USTrack(); _track_matching->DSTrack(); _track_matching->throughTrack(); std::vector through_chains = _global_event->GetThroughPrimaryChains(); ASSERT_EQ(through_chains.size(), 1); DataStructure::Global::Track* track = through_chains.at(0)->GetMatchedTrack (DataStructure::Global::kMuPlus); ASSERT_EQ(track->GetTrackPoints(DataStructure::Global::kVirtual).size(), 1); const DataStructure::Global::TrackPoint* tp = track->GetTrackPoints(DataStructure::Global::kVirtual).at(0); EXPECT_NEAR(tp->get_position().Z(), 10000., 1.); } TEST_F(TrackMatchingTest, GetDetectorSpacePoints) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); DataStructure::Global::DetectorPoint tof0 = DataStructure::Global::kTOF0; DataStructure::Global::DetectorPoint tof1 = DataStructure::Global::kTOF1; DataStructure::Global::DetectorPoint tof2 = DataStructure::Global::kTOF2; DataStructure::Global::DetectorPoint kl = DataStructure::Global::kCalorimeter; DataStructure::Global::SpacePoint tof0_sp1; TLorentzVector position(0.0, 0.0, 100.0, 0.0); tof0_sp1.set_position(position); tof0_sp1.set_detector(tof0); DataStructure::Global::SpacePoint tof0_sp2; tof0_sp2.set_position(position); tof0_sp2.set_detector(tof0); DataStructure::Global::SpacePoint tof1_sp; position.SetZ(300.0); tof1_sp.set_position(position); tof1_sp.set_detector(tof1); DataStructure::Global::SpacePoint tof2_sp; position.SetZ(800.0); tof2_sp.set_position(position); tof2_sp.set_detector(tof2); DataStructure::Global::SpacePoint kl_sp; position.SetZ(900.0); kl_sp.set_position(position); kl_sp.set_detector(kl); _global_event->add_space_point(&tof0_sp1); _global_event->add_space_point(&tof0_sp2); _global_event->add_space_point(&tof1_sp); _global_event->add_space_point(&tof2_sp); _global_event->add_space_point(&kl_sp); std::vector tof0_sps; std::vector tof1_sps; std::vector tof2_sps; std::vector kl_sps; tof0_sps = _track_matching->GetDetectorSpacePoints(tof0); tof1_sps = _track_matching->GetDetectorSpacePoints(tof1); tof2_sps = _track_matching->GetDetectorSpacePoints(tof2); kl_sps = _track_matching->GetDetectorSpacePoints(kl); EXPECT_EQ(tof0_sps.size(), 2); EXPECT_EQ(tof1_sps.size(), 1); EXPECT_EQ(tof2_sps.size(), 1); EXPECT_EQ(kl_sps.size(), 1); if (tof0_sps.size() > 1) { EXPECT_EQ(tof0_sps[0]->get_detector(), tof0); EXPECT_EQ(tof0_sps[1]->get_detector(), tof0); } if (tof1_sps.size() > 0) { EXPECT_EQ(tof1_sps[0]->get_detector(), tof1); } if (tof2_sps.size() > 0) { EXPECT_EQ(tof2_sps[0]->get_detector(), tof2); } if (kl_sps.size() > 0) { EXPECT_EQ(kl_sps[0]->get_detector(), kl); } } TEST_F(TrackMatchingTest, PIDHypotheses) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); std::vector pids = _track_matching->PIDHypotheses(0, "kMuPlus"); EXPECT_EQ(pids.size(), 1); if (pids.size() > 0) { EXPECT_EQ(pids[0], DataStructure::Global::kMuPlus); } pids = _track_matching->PIDHypotheses(1, "kPiMinus"); EXPECT_EQ(pids.size(), 1); if (pids.size() > 0) { EXPECT_EQ(pids[0], DataStructure::Global::kPiMinus); } pids = _track_matching->PIDHypotheses(-1, "all"); EXPECT_EQ(pids.size(), 3); if (pids.size() > 2) { EXPECT_EQ(pids[0], DataStructure::Global::kEMinus); EXPECT_EQ(pids[1], DataStructure::Global::kMuMinus); EXPECT_EQ(pids[2], DataStructure::Global::kPiMinus); } pids = _track_matching->PIDHypotheses(0, "all"); EXPECT_EQ(pids.size(), 6); if (pids.size() > 5) { EXPECT_EQ(pids[0], DataStructure::Global::kEPlus); EXPECT_EQ(pids[1], DataStructure::Global::kMuPlus); EXPECT_EQ(pids[2], DataStructure::Global::kPiPlus); EXPECT_EQ(pids[3], DataStructure::Global::kEMinus); EXPECT_EQ(pids[4], DataStructure::Global::kMuMinus); EXPECT_EQ(pids[5], DataStructure::Global::kPiMinus); } } TEST_F(TrackMatchingTest, MatchTrackPoint) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); Simulation::DetectorConstruction* dc = Globals::GetInstance()->GetGeant4Manager()->GetGeometry(); std::string mod_path = std::string(getenv("MAUS_ROOT_DIR"))+ "/tests/cpp_unit/Recon/Global/TestGeometries/"; MiceModule geometry(mod_path+"PropagationTest.dat"); dc->SetMiceModules(geometry); DataStructure::Global::SpacePoint tof1_sp1; TLorentzVector tof1_position(30.0, 0.0, 100.0, 0.0); tof1_sp1.set_position(tof1_position); tof1_sp1.set_detector(DataStructure::Global::kTOF1); _global_event->add_space_point(&tof1_sp1); DataStructure::Global::SpacePoint tof1_sp2; tof1_position.SetY(60.0); tof1_sp2.set_position(tof1_position); tof1_sp2.set_detector(DataStructure::Global::kTOF1); _global_event->add_space_point(&tof1_sp2); DataStructure::Global::SpacePoint tof2_sp; TLorentzVector tof2_position(0.0, -30.0, 9000.0, 0.0); tof2_sp.set_position(tof2_position); tof2_sp.set_detector(DataStructure::Global::kTOF2); _global_event->add_space_point(&tof2_sp); std::vector TOF1_sp = _track_matching->GetDetectorSpacePoints( DataStructure::Global::kTOF1); std::vector TOF2_sp = _track_matching->GetDetectorSpacePoints( DataStructure::Global::kTOF2); TLorentzVector start_position(0.0, 0.0, 4000.0, 0.0); TLorentzVector start_momentum(10.0, 10.0, 150.0, 0.0); DataStructure::Global::PID pid = DataStructure::Global::kMuPlus; BTFieldConstructor* field = Globals::GetMCFieldConstructor(); DataStructure::Global::Track hypothesis_track; _track_matching->MatchTrackPoint(start_position, start_momentum, TOF1_sp, pid, field, "TOF1", &hypothesis_track); _track_matching->MatchTrackPoint(start_position, start_momentum, TOF2_sp, pid, field, "TOF2", &hypothesis_track); std::vector track_points = hypothesis_track.GetTrackPoints(); std::vector tof1_tps = hypothesis_track.GetTrackPoints(DataStructure::Global::kTOF1); std::vector tof2_tps = hypothesis_track.GetTrackPoints(DataStructure::Global::kTOF2); EXPECT_EQ(track_points.size(), 2); EXPECT_EQ(tof1_tps.size(), 1); EXPECT_EQ(tof2_tps.size(), 1); if (tof1_tps.size() > 0) { EXPECT_FLOAT_EQ(tof1_tps.at(0)->get_position().Y(), 0.0); } } TEST_F(TrackMatchingTest, MatchTOF0) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); Simulation::DetectorConstruction* dc = Globals::GetInstance()->GetGeant4Manager()->GetGeometry(); std::string mod_path = std::string(getenv("MAUS_ROOT_DIR"))+ "/tests/cpp_unit/Recon/Global/TestGeometries/"; MiceModule geometry(mod_path+"SimpleBeamline.dat"); dc->SetMiceModules(geometry); DataStructure::Global::SpacePoint tof0_sp1; TLorentzVector tof0_position(0.0, 0.0, 100.0, 0.0); tof0_sp1.set_position(tof0_position); tof0_sp1.set_detector(DataStructure::Global::kTOF0); _global_event->add_space_point(&tof0_sp1); DataStructure::Global::SpacePoint tof0_sp2; tof0_position.SetT(5.0); tof0_sp2.set_position(tof0_position); tof0_sp2.set_detector(DataStructure::Global::kTOF0); _global_event->add_space_point(&tof0_sp2); std::vector TOF0_sp = _track_matching->GetDetectorSpacePoints(DataStructure::Global::kTOF0); TLorentzVector position(0.0, 0.0, 8537.0, 41.0); TLorentzVector momentum(10.0, 10.0, 150.0, 0.0); DataStructure::Global::PID pid = DataStructure::Global::kMuPlus; BTFieldConstructor* field = Globals::GetMCFieldConstructor(); DataStructure::Global::Track hypothesis_track; _track_matching->MatchTOF0(position, momentum, 7902.0, 35.0, TOF0_sp, pid, field, &hypothesis_track); std::vector track_points = hypothesis_track.GetTrackPoints(); EXPECT_EQ(track_points.size(), 1); if (track_points.size() > 0) { EXPECT_FLOAT_EQ(track_points.at(0)->get_position().T(), 5.0); } } TEST_F(TrackMatchingTest, MatchEMRTrack) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); Simulation::DetectorConstruction* dc = Globals::GetInstance()->GetGeant4Manager()->GetGeometry(); std::string mod_path = std::string(getenv("MAUS_ROOT_DIR"))+ "/tests/cpp_unit/Recon/Global/TestGeometries/"; MiceModule geometry(mod_path+"PropagationTest.dat"); dc->SetMiceModules(geometry); DataStructure::Global::SpacePoint sp; TLorentzVector position(30.0, -45.0, 4000.0, 0.0); TLorentzVector position_error(10.0, 10.0, 10.0, 10.0); sp.set_position(position); sp.set_position_error(position_error); DataStructure::Global::TrackPoint emr_tp1(&sp); emr_tp1.set_detector(DataStructure::Global::kEMR); position.SetX(-30.0); sp.set_position(position); DataStructure::Global::TrackPoint emr_tp2(&sp); emr_tp2.set_detector(DataStructure::Global::kEMR); DataStructure::Global::Track emr_track1; emr_track1.AddTrackPoint(&emr_tp1); DataStructure::Global::Track emr_track2; emr_track2.AddTrackPoint(&emr_tp2); _global_event->add_track_recursive(&emr_track1); _global_event->add_track_recursive(&emr_track2); DataStructure::Global::TrackPArray* emr_track_array = _track_matching->GetDetectorTrackArray(DataStructure::Global::kEMR); TLorentzVector start_position(0.0, 0.0, 500.0, 0.0); TLorentzVector start_momentum(20.0, 20.0, 150.0, 0.0); DataStructure::Global::PID pid = DataStructure::Global::kMuPlus; BTFieldConstructor* field = Globals::GetMCFieldConstructor(); DataStructure::Global::Track hypothesis_track; _track_matching->MatchEMRTrack(start_position, start_momentum, emr_track_array, pid, field, &hypothesis_track); std::vector track_points = hypothesis_track.GetTrackPoints(); EXPECT_EQ(track_points.size(), 1); if (track_points.size() > 0) { EXPECT_FLOAT_EQ(track_points.at(0)->get_position().X(), 30.0); } } TEST_F(TrackMatchingTest, AddTrackerTrackPoints) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); double mass = 105.65837; std::string mapper_name = "AddTrackPointsTest"; DataStructure::Global::Track tracker_track; DataStructure::Global::Track target_track; DataStructure::Global::SpacePoint sp; double z_positions[] = {150.0, 200.0, 300.0}; TLorentzVector position(0.0, 0.0, z_positions[0], 0.0); TLorentzVector momentum(0.0, 0.0, 150.0, 0.0); sp.set_position(position); DataStructure::Global::TrackPoint tp1(&sp); tp1.set_momentum(momentum); position.SetZ(z_positions[2]); sp.set_position(position); DataStructure::Global::TrackPoint tp2(&sp); tp2.set_momentum(momentum); position.SetZ(z_positions[1]); sp.set_position(position); DataStructure::Global::TrackPoint tp3(&sp); tp3.set_momentum(momentum); tracker_track.AddTrackPoint(&tp1); tracker_track.AddTrackPoint(&tp2); tracker_track.AddTrackPoint(&tp3); _track_matching->AddTrackerTrackPoints(&tracker_track, mapper_name, mass, &target_track); std::vector track_points = target_track.GetTrackPoints(); EXPECT_EQ(track_points.size(), 3); for (size_t i = 0; i < track_points.size(); i++) { EXPECT_NEAR(track_points[i]->get_position().Z(), z_positions[i], 0.001); EXPECT_NEAR(track_points[i]->get_momentum().E(), ::sqrt(mass*mass + 150.0*150.0), 0.001); EXPECT_EQ(track_points[i]->get_mapper_name(), "AddTrackPointsTest"); } } TEST_F(TrackMatchingTest, TOFTimeFromTrackPoints) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); std::vector track_points; DataStructure::Global::SpacePoint sp; TLorentzVector position(0.0, 0.0, 0.0, 10.0); sp.set_position(position); DataStructure::Global::TrackPoint tp1(&sp); tp1.set_detector(DataStructure::Global::kTOF1); position.SetT(15.7); sp.set_position(position); DataStructure::Global::TrackPoint tp2(&sp); tp2.set_detector(DataStructure::Global::kTOF2); // rather than fiddling around with casting we just use the internal track // mechanics DataStructure::Global::Track track; track.AddTrackPoint(&tp1); track.AddTrackPoint(&tp2); track_points = track.GetTrackPoints(); double TOF_time; TOF_time = _track_matching->TOFTimeFromTrackPoints(track_points, DataStructure::Global::kTOF1); EXPECT_FLOAT_EQ(TOF_time, 10.0); TOF_time = _track_matching->TOFTimeFromTrackPoints(track_points, DataStructure::Global::kTOF2); EXPECT_FLOAT_EQ(TOF_time, 15.7); } TEST_F(TrackMatchingTest, AddIfConsistent) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); TLorentzVector position(0.0, 0.0, 0.0, 0.0); DataStructure::Global::SpacePoint tof0_sp0; tof0_sp0.set_position(position); DataStructure::Global::SpacePoint tof1_sp0; tof1_sp0.set_position(position); DataStructure::Global::SpacePoint tof1_sp1; position.SetX(60.0); position.SetT(0.4); tof1_sp1.set_position(position); DataStructure::Global::SpacePoint tof1_sp2; position.SetT(0.6); tof1_sp2.set_position(position); DataStructure::Global::SpacePoint kl_sp0; kl_sp0.set_position(position); kl_sp0.set_detector(DataStructure::Global::kCalorimeter); DataStructure::Global::SpacePoint kl_sp1; position.SetY(45.0); kl_sp1.set_position(position); kl_sp1.set_detector(DataStructure::Global::kCalorimeter); std::vector tof0_sps; std::vector tof1_sps; std::vector kl_sps; tof0_sps.push_back(&tof0_sp0); tof1_sps.push_back(&tof1_sp0); tof1_sps.push_back(&tof1_sp1); tof1_sps.push_back(&tof1_sp2); kl_sps.push_back(&kl_sp0); kl_sps.push_back(&kl_sp1); DataStructure::Global::Track tof0_track; DataStructure::Global::Track tof1_track; DataStructure::Global::Track kl_track; _track_matching->AddIfConsistent(tof0_sps, &tof0_track); _track_matching->AddIfConsistent(tof1_sps, &tof1_track); _track_matching->AddIfConsistent(kl_sps, &kl_track); EXPECT_EQ(tof0_track.GetTrackPoints().size(), 1); EXPECT_EQ(tof1_track.GetTrackPoints().size(), 0); EXPECT_EQ(kl_track.GetTrackPoints().size(), 2); } TEST_F(TrackMatchingTest, CheckChainMultiplicity) { _track_matching = new recon::global::TrackMatching(_global_event, "TrackMatchingTest", "kMuPlus", 1, _matching_tolerances, 10.0, _no_check_settings, _residuals); DataStructure::Global::PrimaryChain chain_us0("TrackMatchingTest", DataStructure::Global::kUS); DataStructure::Global::PrimaryChain chain_us1("TrackMatchingTest", DataStructure::Global::kUS); DataStructure::Global::PrimaryChain chain_us2("TrackMatchingTest", DataStructure::Global::kUS); DataStructure::Global::PrimaryChain chain_ds0("TrackMatchingTest", DataStructure::Global::kDS); DataStructure::Global::PrimaryChain chain_ds1("TrackMatchingTest", DataStructure::Global::kDS); DataStructure::Global::PrimaryChain chain_ds2("TrackMatchingTest", DataStructure::Global::kDS); DataStructure::Global::PrimaryChain chain_through0( "TrackMatchingTest", DataStructure::Global::kThrough); DataStructure::Global::PrimaryChain chain_through1( "TrackMatchingTest", DataStructure::Global::kThrough); DataStructure::Global::PrimaryChain chain_through2( "TrackMatchingTest", DataStructure::Global::kThrough); DataStructure::Global::PrimaryChain chain_through3( "TrackMatchingTest", DataStructure::Global::kThrough); chain_through0.SetUSDaughter(&chain_us0); chain_through0.SetDSDaughter(&chain_ds0); chain_through1.SetUSDaughter(&chain_us2); chain_through1.SetDSDaughter(&chain_ds1); chain_through2.SetUSDaughter(&chain_us1); chain_through2.SetDSDaughter(&chain_ds2); chain_through3.SetUSDaughter(&chain_us2); chain_through3.SetDSDaughter(&chain_ds2); _global_event->add_primary_chain(&chain_us0); _global_event->add_primary_chain(&chain_us1); _global_event->add_primary_chain(&chain_us2); _global_event->add_primary_chain(&chain_ds0); _global_event->add_primary_chain(&chain_ds1); _global_event->add_primary_chain(&chain_ds2); _global_event->add_primary_chain(&chain_through0); _global_event->add_primary_chain(&chain_through1); _global_event->add_primary_chain(&chain_through2); _global_event->add_primary_chain(&chain_through3); _track_matching->CheckChainMultiplicity(); EXPECT_EQ(chain_through0.get_multiplicity(), DataStructure::Global::kUnique); EXPECT_EQ(chain_through1.get_multiplicity(), DataStructure::Global::kMultipleUS); EXPECT_EQ(chain_through2.get_multiplicity(), DataStructure::Global::kMultipleDS); EXPECT_EQ(chain_through3.get_multiplicity(), DataStructure::Global::kMultipleBoth); } } } } // ~namespace MAUS