/* 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 #include #include #include #include #include #include #include "float.h" #include "TLorentzVector.h" #include "TRandom3.h" #include "gtest/gtest.h" #include "Recon/Global/PIDVarB.hh" TEST(PIDVarBTestSetUp, TestSetUpAndTearDown) { MAUS::recon::global::PIDVarB *testPIDVarB = NULL; ASSERT_NO_THROW(testPIDVarB = new MAUS::recon::global::PIDVarB("test", "test")); std::string testfile = testPIDVarB->Get_filename(); std::string testdir = testPIDVarB->Get_directory(); ASSERT_NO_THROW(delete testPIDVarB); EXPECT_EQ(gSystem->Unlink(testfile.c_str()), 0); // Unlink dir does not seem to work on some systems // suspect NFS mounts or stale handles // force system removal // std::string rmdirCmd = "rm -fr "; // rmdirCmd += testdir.c_str(); // EXPECT_EQ(system(rmdirCmd.c_str()), 0); } class PIDVarBTest : public ::testing::Test { virtual void SetUp() { MAUS::recon::global::PIDVarB testPIDVarB("test", "test"); testfile = testPIDVarB.Get_filename(); testdir = testPIDVarB.Get_directory(); TRandom3 r; for (int i = 0; i < 1000; i++) { MAUS::DataStructure::Global::Track* testTrack = new MAUS::DataStructure::Global::Track(); MAUS::DataStructure::Global::TrackPoint* tp0 = new MAUS::DataStructure::Global::TrackPoint(); MAUS::DataStructure::Global::TrackPoint* tp1 = new MAUS::DataStructure::Global::TrackPoint(); tp0->set_detector(MAUS::DataStructure::Global::kTOF0); tp1->set_detector(MAUS::DataStructure::Global::kTOF1); MAUS::DataStructure::Global::TrackPoint* tpTracker = new MAUS::DataStructure::Global::TrackPoint(); tpTracker->set_detector(MAUS::DataStructure::Global::kTracker0_1); double x0 = 0.0; double y0 = 0.0; double z0 = 0.0; double t0 = r.Gaus(15, 2); TLorentzVector pos0(x0, y0, z0, t0); double x1 = 0.0; double y1 = 0.0; double z1 = 0.0; double t1 = r.Gaus(45, 2); TLorentzVector pos1(x1, y1, z1, t1); double px = 0.0; double py = 0.0; double pz = 200.0; double E = 226.0; TLorentzVector tpTrackerMom(px, py, pz, E); tp0->set_position(pos0); tp1->set_position(pos1); tpTracker->set_momentum(tpTrackerMom); tp0->set_mapper_name("MapCppGlobalTrackMatching-Through"); tp1->set_mapper_name("MapCppGlobalTrackMatching-Through"); tpTracker->set_mapper_name("MapCppGlobalTrackMatching-Through"); testTrack->AddTrackPoint(tp0); testTrack->AddTrackPoint(tp1); testTrack->AddTrackPoint(tpTracker); testTrack->set_mapper_name("MapCppGlobalTrackMatching-Through"); testTracks.push_back(testTrack); } } virtual void TearDown() { gSystem->Unlink(testfile.c_str()); gSystem->Unlink(testdir.c_str()); } public: bool fileExists(std::string filename) { TFile f(filename.c_str(), "READ"); return !f.IsZombie(); } bool IsFiniteNumber(double x) { return (x <= DBL_MAX && x >= -DBL_MAX); } std::string testfile; std::string testdir; TFile *file; TH2F *hist; std::string histname; std::vector testTracks; }; TEST_F(PIDVarBTest, CreateFileConstructor) { ASSERT_TRUE(fileExists(testfile)); } TEST_F(PIDVarBTest, ReadFileConstructor) { file = new TFile(testfile.c_str(), "READ"); ASSERT_TRUE(file); ASSERT_FALSE(file->IsZombie()); ASSERT_NO_THROW(MAUS::recon::global::PIDVarB testPIDVarB(file, "test", 50, 350, 20, 40)); ASSERT_ANY_THROW(MAUS::recon::global::PIDVarB testPIDVarB(NULL, "test", 50, 350, 20, 40)); ASSERT_ANY_THROW(MAUS::recon::global::PIDVarB testPIDVarB(file, "sasquatch", 50, 350, 20, 40)); } /* N.B. if either FillHist or LogL are failing, check the values of min and max * bins in PIDVarB.hh, as if the testTracks fall outside of this range FillHist * and LogL will fail. */ TEST_F(PIDVarBTest, FillHist) { MAUS::recon::global::PIDVarB testPIDVarB("test", "test"); for (int i = 0; i < 1000; i++) { testPIDVarB.Fill_Hist(testTracks[i]); } testfile = testPIDVarB.Get_filename(); testdir = testPIDVarB.Get_directory(); // check histogram exists hist = testPIDVarB.Get_hist(); ASSERT_TRUE(hist); // check number of entries ASSERT_EQ(1000, hist->GetEntries()); } TEST_F(PIDVarBTest, LogL) { // Constructor called within parentheses so that destructor will be // called when it goes out of scope { MAUS::recon::global::PIDVarB writetestPIDVarB("test", "test"); for (int i = 0; i < 1000; i++) { writetestPIDVarB.Fill_Hist(testTracks[i]); } testfile = writetestPIDVarB.Get_filename(); testdir = writetestPIDVarB.Get_directory(); } MAUS::DataStructure::Global::Track* checkTrack = new MAUS::DataStructure::Global::Track(); MAUS::DataStructure::Global::TrackPoint* ctp0 = new MAUS::DataStructure::Global::TrackPoint(); MAUS::DataStructure::Global::TrackPoint* ctp1 = new MAUS::DataStructure::Global::TrackPoint(); MAUS::DataStructure::Global::TrackPoint* ctpTracker = new MAUS::DataStructure::Global::TrackPoint(); ctp0->set_detector(MAUS::DataStructure::Global::kTOF0); ctp1->set_detector(MAUS::DataStructure::Global::kTOF1); ctpTracker->set_detector(MAUS::DataStructure::Global::kTracker0_1); double x0 = 0.0; double y0 = 0.0; double z0 = 0.0; double t0 = 15.0; TLorentzVector cpos0(x0, y0, z0, t0); double x1 = 0.0; double y1 = 0.0; double z1 = 0.0; double t1 = 45.0; TLorentzVector cpos1(x1, y1, z1, t1); double px = 0.0; double py = 0.0; double pz = 200.0; double E = 226.0; TLorentzVector ctpTrackerMom(px, py, pz, E); ctp0->set_position(cpos0); ctp1->set_position(cpos1); ctpTracker->set_momentum(ctpTrackerMom); ctp0->set_mapper_name("MapCppGlobalTrackMatching-Through"); ctp1->set_mapper_name("MapCppGlobalTrackMatching-Through"); ctpTracker->set_mapper_name("MapCppGlobalTrackMatching-Through"); checkTrack->AddTrackPoint(ctp0); checkTrack->AddTrackPoint(ctp1); checkTrack->AddTrackPoint(ctpTracker); checkTrack->set_mapper_name("MapCppGlobalTrackMatching-Through"); file = new TFile(testfile.c_str(), "READ"); ASSERT_TRUE(file); ASSERT_FALSE(file->IsZombie()); ASSERT_NO_THROW(MAUS::recon::global::PIDVarB readtestPIDVarB(file, "test", 50, 350, 20, 40)); MAUS::recon::global::PIDVarB readtestPIDVarB(file, "test", 50, 350, 20, 40); hist = readtestPIDVarB.Get_hist(); ASSERT_TRUE(hist); // check number of entries in histogram // NB as destructor was called above, the number of entries in the histogram // will be increased by the number of bins (inc over and underflow) as in // PIDVarB the behaviour to add one event across all bins is turned on. ASSERT_EQ((1000 + hist->GetSize()), hist->GetEntries()); double prob = readtestPIDVarB.logL(checkTrack); ASSERT_LE(prob, 0); ASSERT_TRUE(IsFiniteNumber(prob)); }