/* 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 "gtest/gtest.h"
#include "TMatrixD.h"
#include "src/common_cpp/Recon/SciFi/LeastSquaresFitter.hh"
#include "src/common_cpp/Recon/SciFi/SimpleLine.hh"
#include "src/common_cpp/DataStructure/SciFiSpacePoint.hh"
namespace MAUS {
class LeastSquaresFitterTest : public ::testing::Test {
protected:
LeastSquaresFitterTest() {}
virtual ~LeastSquaresFitterTest() {}
virtual void SetUp() {}
virtual void TearDown() {}
};
TEST_F(LeastSquaresFitterTest, test_circle_fit) {
// Set up spacepoints from an MC helical track
SciFiSpacePoint *sp1 = new SciFiSpacePoint();
SciFiSpacePoint *sp2 = new SciFiSpacePoint();
SciFiSpacePoint *sp3 = new SciFiSpacePoint();
SciFiSpacePoint *sp4 = new SciFiSpacePoint();
SciFiSpacePoint *sp5 = new SciFiSpacePoint();
sp1->set_station(1);
sp2->set_station(2);
sp3->set_station(3);
sp4->set_station(4);
sp5->set_station(5);
ThreeVector pos(14.1978, 9.05992, 0.6523);
sp1->set_position(pos);
pos.set(-7.97067, 10.3542, 200.652);
sp2->set_position(pos);
pos.set(-11.4578, -16.3941, 450.652);
sp3->set_position(pos);
pos.set(19.9267, -12.0799, 750.652);
sp4->set_position(pos);
pos.set(-5.47983, 12.9427, 1100.65);
sp5->set_position(pos);
std::vector spnts;
spnts.push_back(sp5);
spnts.push_back(sp2);
spnts.push_back(sp3);
spnts.push_back(sp1);
spnts.push_back(sp4);
SimpleCircle circle;
TMatrixD cov;
bool good_radius = LeastSquaresFitter::circle_fit(0.3844, 0.4298, 150.0, spnts, circle, cov);
double epsilon = 0.01;
ASSERT_TRUE(good_radius);
EXPECT_NEAR(circle.get_x0(), 2.56, epsilon);
EXPECT_NEAR(circle.get_y0(), -4.62, epsilon);
EXPECT_NEAR(circle.get_R(), 18.56, epsilon);
EXPECT_NEAR(circle.get_chisq(), 0.0994, epsilon);
}
TEST_F(LeastSquaresFitterTest, test_linear_fit) {
// Test with a simple line, c = 2, m = 1, with three points, small errors
std::vector x, y, y_err;
x.push_back(1);
x.push_back(2);
x.push_back(3);
y.push_back(3);
y.push_back(4);
y.push_back(5);
y_err.push_back(0.05);
y_err.push_back(0.05);
y_err.push_back(0.05);
SimpleLine line;
TMatrixD cov;
LeastSquaresFitter::linear_fit(x, y, y_err, line, cov);
double epsilon = 0.00001;
EXPECT_NEAR(2.0, line.get_c(), epsilon);
EXPECT_NEAR(1.0, line.get_m(), epsilon);
}
} // ~namespace MAUS