Project
Loading...
Searching...
No Matches
Positions.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#define BOOST_TEST_MODULE Test MID geometry transformer
16#define BOOST_TEST_DYN_LINK
17
18#include <boost/test/unit_test.hpp>
19
20// #include "boost/format.hpp"
21// #include <boost/test/data/monomorphic.hpp>
22// #include <boost/test/data/monomorphic/generators/xrange.hpp>
23#include <boost/test/data/test_case.hpp>
24#include <fstream>
25#include <iostream>
26#include <rapidjson/filereadstream.h>
27#include <rapidjson/document.h>
29
30template <typename StreamType>
31class InputDocument
32{
33 public:
35 : mFile(fopen(filename, "r")),
36 mReadBuffer(new char[65536]),
37 mStream(mFile, mReadBuffer, sizeof(mReadBuffer)),
38 mDocument()
39 {
40 mDocument.ParseStream(mStream);
41 }
42
43 rapidjson::Document& document() { return mDocument; }
44
46 {
47 delete[] mReadBuffer;
48 fclose(mFile);
49 }
50
51 private:
52 FILE* mFile;
53 char* mReadBuffer;
54 StreamType mStream;
55 rapidjson::Document mDocument;
56};
57
59namespace bdata = boost::unit_test::data;
60
61BOOST_AUTO_TEST_SUITE(o2_mid_simulation)
62
63bool areEqual(double a, double b)
64{
65 return std::fabs(b - a) < 1E-4; // 1E-4 cm = 1 micron
66}
67
68bool areEqual(std::array<double, 3>& p1, std::array<double, 3>& p2)
69{
70 for (int idim = 0; idim < 3; ++idim) {
71 if (!areEqual(p1[idim], p2[idim])) {
72 return false;
73 }
74 }
75 return true;
76}
77
78int testOnePosition(const o2::mid::GeometryTransformer& geoTrans, rapidjson::Value& tp)
79{
80 auto deId = tp["deId"].GetInt();
81 auto localPoint = tp["local"].GetArray();
82 auto inGlobalPoint = tp["global"].GetArray();
83 std::array<double, 3> inGlob = {inGlobalPoint[0].GetDouble(), inGlobalPoint[1].GetDouble(), inGlobalPoint[2].GetDouble()};
84 auto outGlobalPoint = geoTrans.localToGlobal(deId, localPoint[0].GetDouble(), localPoint[1].GetDouble());
85 std::array<double, 3> outGlob = {outGlobalPoint.x(), outGlobalPoint.y(), outGlobalPoint.z()};
86 if (!areEqual(inGlob, outGlob)) {
87 std::cout << "got different positions for deId " << deId << " : got (" << inGlob[0] << ", " << inGlob[1] << ", " << inGlob[2] << ") expected (" << outGlob[0] << ", " << outGlob[1] << ", " << outGlob[2] << ")\n";
88 return 1;
89 }
90 return 0;
91}
92
93std::string getTestPosFilename()
94{
95 std::string path = "test_random_pos.json";
96 auto& ts = boost::unit_test::framework::master_test_suite();
97 auto nargs = ts.argc;
98 if (nargs >= 2) {
99 std::string opt{"--testpos"};
100 for (auto iarg = 0; iarg < nargs - 1; iarg++) {
101 if (opt == ts.argv[iarg]) {
102 path = ts.argv[iarg + 1];
103 break;
104 }
105 }
106 }
107 return path;
108}
109
110bool fileExists(const char* filename)
111{
112 std::ifstream file(filename);
113 return file.good();
114}
115
117{
118 std::string filepath = getTestPosFilename();
119
120 if (!fileExists(filepath.c_str())) {
121 BOOST_TEST(false, "No test file found. Do it with: test_MIDpositions -- --testpos <testFilename>");
122 return;
123 }
124 InputWrapper data(filepath.c_str());
125
126 rapidjson::Value& test_positions = data.document()["testpositions"];
127
128 BOOST_TEST(test_positions.Size() > 0);
129
130 int notok{0};
131
133
134 for (auto& tp : test_positions.GetArray()) {
135 notok += testOnePosition(geoTrans, tp);
136 }
137 BOOST_TEST(notok == 0);
138}
139
140BOOST_AUTO_TEST_SUITE_END()
Geometry transformer for MID.
constexpr int p2()
constexpr int p1()
constexpr to accelerate the coordinates changing
std::string getTestPosFilename()
Definition Positions.cxx:93
bool fileExists(const char *filename)
bool areEqual(double a, double b)
Definition Positions.cxx:63
BOOST_AUTO_TEST_CASE(TestPositions)
int testOnePosition(const o2::mid::GeometryTransformer &geoTrans, rapidjson::Value &tp)
Definition Positions.cxx:78
InputDocument(const char *filename)
Definition Positions.cxx:34
virtual ~InputDocument()
Definition Positions.cxx:45
rapidjson::Document & document()
Definition Positions.cxx:43
math_utils::Point3D< T > localToGlobal(int deId, const math_utils::Point3D< T > &position) const
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLboolean * data
Definition glcorearb.h:298
GLsizei const GLchar *const * path
Definition glcorearb.h:3591
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GeometryTransformer createDefaultTransformer()
std::string filename()
BOOST_TEST(digits==digitsD, boost::test_tools::per_element())