File: TestVecGeomPolycone.cpp

package info (click to toggle)
vecgeom 1.2.8%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 24,016 kB
  • sloc: cpp: 88,803; ansic: 6,888; python: 1,035; sh: 582; sql: 538; makefile: 23
file content (139 lines) | stat: -rw-r--r-- 6,227 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * TestVecGeomPolycone.cpp
 *
 *  Created on: Dec 8, 2014
 *      Author: swenzel
 */

// a file to test compilation of features during development

//.. ensure asserts are compiled in
#undef NDEBUG
#include "VecGeom/base/FpeEnable.h"

#include "VecGeom/base/Vector3D.h"
#include "VecGeom/volumes/Polycone.h"
#include "VecGeom/volumes/Tube.h"
#include "VecGeom/volumes/Cone.h"
#include "VecGeom/volumes/LogicalVolume.h"
#include "VecGeom/volumes/PlacedVolume.h"
#include "ApproxEqual.h"
#include "VecGeom/management/GeoManager.h"

using Real_v = vecgeom::VectorBackend::Real_v;

#include <iostream>

using namespace vecgeom;

bool testingvecgeom = false;

typedef Vector3D<Precision> Vec3D_t;

template <class Polycone_t, class Vec_t = vecgeom::Vector3D<vecgeom::Precision>>

bool TestPolycone()
{
  return 0;
}

int main()
{
  int Nz = 4;
  // a few cones
  Precision rmin[] = {0.1, 0.0, 0.0, 0.4};
  Precision rmax[] = {1., 2., 2., 1.5};
  Precision z[]    = {-1, -0.5, 0.5, 2};

  auto poly1 = GeoManager::MakeInstance<UnplacedPolycone>(0.,      /* initial phi starting angle */
                                                          kTwoPi,  /* total phi angle */
                                                          Nz,      /* number corners in r,z space */
                                                          z, rmin, /* r coordinate of these corners */
                                                          rmax);

  // poly1.Print();

  // let's make external separate cones representing the sections
  SUnplacedCone<ConeTypes::UniversalCone> section0(rmin[0], rmax[0], rmin[1], rmax[1], (z[1] - z[0]) / 2., 0, kTwoPi);
  SUnplacedCone<ConeTypes::UniversalCone> section1(rmin[1], rmax[1], rmin[2], rmax[2], (z[2] - z[1]) / 2., 0, kTwoPi);
  SUnplacedCone<ConeTypes::UniversalCone> section2(rmin[2], rmax[2], rmin[3], rmax[3], (z[3] - z[2]) / 2., 0, kTwoPi);

  assert(poly1->GetNz() == 4);
  assert(poly1->GetNSections() == 3);
  assert(poly1->GetSectionIndex(-0.8) == 0);
  assert(poly1->GetSectionIndex(0.51) == 2);
  assert(poly1->GetSectionIndex(0.) == 1);
  assert(poly1->GetSectionIndex(-2.) == -1);
  assert(poly1->GetSectionIndex(3.) == -2);
  assert(poly1->GetStartPhi() == 0.);
  assert((std::fabs(poly1->GetDeltaPhi() - kTwoPi)) < 1e-10);

  assert(poly1->GetStruct().fZs[0] == z[0]);
  assert(poly1->GetStruct().fZs[poly1->GetNSections()] == z[Nz - 1]);
  assert(poly1->Capacity() > 0);
  assert(std::fabs(poly1->Capacity() - (section0.Capacity() + section1.Capacity() + section2.Capacity())) < 1e-6);

  // test bounding box
  Vector3D<Precision> minExtent, maxExtent;
  Vector3D<Precision> minBBox, maxBBox;
  poly1->Extent(minExtent, maxExtent);
  poly1->GetBBox(minBBox, maxBBox);
  assert(ApproxEqual<Precision>(minExtent, minBBox));
  assert(ApproxEqual<Precision>(maxExtent, maxBBox));

  // create a place version
  VPlacedVolume const *placedpoly1 = (new LogicalVolume("poly1", poly1))->Place(new Transformation3D());

  // test contains/inside
  assert(placedpoly1->Contains(Vec3D_t(0., 0., 0.)) == true);
  assert(placedpoly1->Contains(Vec3D_t(0., 0., -2.)) == false);
  assert(placedpoly1->Contains(Vec3D_t(0., 0., -0.8)) == false);
  assert(placedpoly1->Contains(Vec3D_t(0., 0., -1.8)) == false);
  assert(placedpoly1->Contains(Vec3D_t(0., 0., 10)) == false);
  assert(placedpoly1->Contains(Vec3D_t(0., 0., 1.8)) == false);

  // test DistanceToIn
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToIn(Vec3D_t(0., 0., -3.), Vec3D_t(0., 0., 1.)), 2.5));
  assert(placedpoly1->DistanceToIn(Vec3D_t(0., 0., -2.), Vec3D_t(0., 0., -1.)) == vecgeom::kInfLength);
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToIn(Vec3D_t(0., 0., 3), Vec3D_t(0., 0., -1.)), 2.5));
  assert(placedpoly1->DistanceToIn(Vec3D_t(0., 0., 3), Vec3D_t(0., 0., 1.)) == vecgeom::kInfLength);
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToIn(Vec3D_t(3., 0., 0), Vec3D_t(-1., 0., 0.)), 1.));
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToIn(Vec3D_t(0., 0., 1.9999999), Vec3D_t(1., 0., 0.)), 0.4));

  {
    // test vector interface
    using Vec3D_v = vecgeom::Vector3D<Real_v>;
    Vec3D_v p(Real_v(0.), Real_v(0.), Real_v(-3)), d(Real_v(0.), Real_v(0.), Real_v(1.));
    const auto dist = placedpoly1->DistanceToInVec(p, d);
    for (size_t lane = 0; lane < vecCore::VectorSize<Real_v>(); ++lane) {
      assert(ApproxEqual<Precision>(vecCore::LaneAt(dist, lane), 2.5));
    }
  }

  // test SafetyToIn
  // assert( placedpoly1-> SafetyToIn( Vec3D_t(0.,0.,-3.)) == 2. );
  // assert( placedpoly1-> SafetyToIn( Vec3D_t(0.5,0.,-1.)) == 0. );
  // assert( placedpoly1-> SafetyToIn( Vec3D_t(0.,0.,3) ) == 1 );
  // assert( placedpoly1-> SafetyToIn( Vec3D_t(2.,0.,0.1) ) == 0 );
  // assert( placedpoly1-> SafetyToIn( Vec3D_t(3.,0.,0) ) == 1. );
  // std::cout << "test SIN " << placedpoly1->SafetyToIn(Vec3D_t(8., 0., 0.)) << std::endl;
  // test SafetyToOut
  // std::cout << "test SOUT " << placedpoly1->SafetyToOut(Vec3D_t(0., 0., 0.)) << std::endl;
  // assert( placedpoly1-> SafetyToOut( Vec3D_t(0.,0.,0.)) == 0.5 );
  //  assert( placedpoly1-> SafetyToOut( Vec3D_t(0.,0.,0.5)) == 0. );
  //  assert( placedpoly1-> SafetyToOut( Vec3D_t(1.9,0.,0) ) == 0.1 );
  // assert( placedpoly1-> SafetyToOut( Vec3D_t(0.2,0.,-1) ) == 0. );
  //  assert( placedpoly1-> SafetyToOut( Vec3D_t(1.4,0.,2) ) == 0. );

  // test DistanceToOut
  // [see VECGEOM-414] assert(ApproxEqual<Precision>(placedpoly1->DistanceToOut(Vec3D_t(0., 0., 0.), Vec3D_t(0.,
  // 0., 1.)), 0.5));
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToOut(Vec3D_t(0., 0., 0.), Vec3D_t(0., 0., -1.)), 0.5));
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToOut(Vec3D_t(2., 0., 0.), Vec3D_t(1., 0., 0.)), 0.));
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToOut(Vec3D_t(2., 0., 0.), Vec3D_t(-1., 0., 0.)), 4.));
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToOut(Vec3D_t(1., 0., 2), Vec3D_t(0., 0., 1.)), 0.));
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToOut(Vec3D_t(0.5, 0., -1), Vec3D_t(0., 0., -1.)), 0.));
  assert(ApproxEqual<Precision>(placedpoly1->DistanceToOut(Vec3D_t(0.5, 0., -1), Vec3D_t(0., 0., 1.)), 3.));
  std::cout << "VecGeomPolycone tests passed.\n";
  return 0;
}