File indexing completed on 2024-04-06 12:15:30
0001 #include "Geometry/TrackerNumberingBuilder/interface/trackerStablePhiSort.h"
0002 #include "FakeCPP.h"
0003
0004 #include <cmath>
0005 #include <ctime>
0006 #include <vector>
0007 #include <algorithm>
0008 #include <random>
0009 #include <iostream>
0010
0011 namespace {
0012
0013 struct XY {
0014 XY(double ix=0.,double iy=0.):x(ix),y(iy){}
0015 double x;
0016 double y;
0017 };
0018 bool operator==(XY const & a, XY const & b) {
0019 return a.x==b.x&&a.y==b.y;
0020 }
0021
0022 double getPhi(XY const & xy) {
0023 static const double pi2 = 2.*M_PI;
0024 return xy.y >= 0 ? std::atan2(xy.y,xy.x) : pi2-std::atan2(-xy.y,xy.x);
0025 }
0026
0027 template<typename V>
0028 void printPhi(V const & v ) {
0029 for(auto const& x : v) std::cout << getPhi(x) << " ";
0030 std::cout << std::endl;
0031 }
0032
0033 }
0034
0035 int main()
0036 {
0037 cppUnit::Dump a;
0038
0039 using Collection = std::vector<std::vector<XY>>;
0040
0041 Collection original;
0042 Collection shuffled;
0043 Collection sorted;
0044
0045 auto fromRP = [](double phi){ return XY(2.*std::cos(phi), 2.*std::sin(phi)); };
0046
0047
0048 {
0049
0050 std::vector<double> phis {0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3., 3.1, 4.2, 5.2, 6.25, getPhi(XY(1.E5,-1.))};
0051 original.emplace_back(phis.size());
0052 std::transform(phis.begin(),phis.end(),original.back().begin(),fromRP);
0053 }
0054 {
0055
0056 std::vector<double> phis {getPhi(XY(1.E10,-1.)), 0.000001, 0.5, 1.0, 1.5, 2.0, 2.5, 3., 3.1, 4.2, 5.2, 6.25, };
0057 original.emplace_back(phis.size());
0058 std::transform(phis.begin(),phis.end(),original.back().begin(),fromRP);
0059 }
0060
0061 {
0062
0063 std::vector<double> phis {0.0, 0.5, 3., 5.2, 6.25};
0064 original.emplace_back(phis.size());
0065 std::transform(phis.begin(),phis.end(),original.back().begin(),fromRP);
0066 }
0067 {
0068
0069 std::vector<double> phis {-0.1683, -0.0561, +0.0000, +0.0561, +0.1683};
0070 original.emplace_back(phis.size());
0071 std::transform(phis.begin(),phis.end(),original.back().begin(),fromRP);
0072 }
0073
0074
0075 for(auto const& v : original) printPhi(v);
0076
0077
0078 shuffled.resize(original.size());
0079 sorted.resize(original.size());
0080 std::copy(original.begin(),original.end(),shuffled.begin());
0081 auto rng = std::default_random_engine {};
0082 for(auto& v : shuffled) std::shuffle(v.begin(), v.end(), rng);
0083
0084 std::copy(shuffled.begin(),shuffled.end(),sorted.begin());
0085
0086 CPPUNIT_ASSERT(original!=sorted);
0087
0088 double before = std::clock();
0089 for(auto& v : sorted) trackerStablePhiSort(v.begin(), v.end(), getPhi);
0090
0091 double after = std::clock();
0092 std::cout << "elapsed " << (after-before)*0.01 << std::endl;
0093
0094 CPPUNIT_ASSERT(original==sorted);
0095
0096 for(auto const& v : sorted) printPhi(v);
0097 std::cout << std::endl;
0098
0099 return 0;
0100 }