Jpp  19.1.0-rc.1
the software that should make you happy
JCylinder3D.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 #include <vector>
4 
5 #include "TRandom3.h"
6 
7 #include "JGeometry3D/JAxis3D.hh"
10 
11 #include "Jeep/JPrint.hh"
12 #include "Jeep/JParser.hh"
13 #include "Jeep/JMessage.hh"
14 
15 
16 /**
17  * \file
18  *
19  * Example program to test intersection of straight line with cylinder.
20  * \author mdejong
21  */
22 int main(int argc, char**argv)
23 {
24  using namespace std;
25 
26  int numberOfEvents;
27  double precision;
28  UInt_t seed;
29  int debug;
30 
31  try {
32 
33  JParser<> zap("Example program to test intersection of straight line with cylinder.");
34 
35  zap['n'] = make_field(numberOfEvents) = 1000;
36  zap['e'] = make_field(precision) = 1.0e-12;
37  zap['S'] = make_field(seed) = 0;
38  zap['d'] = make_field(debug) = 3;
39 
40  zap(argc, argv);
41  }
42  catch(const exception &error) {
43  FATAL(error.what() << endl);
44  }
45 
46  gRandom->SetSeed(seed);
47 
48 
49  using namespace JPP;
50 
51  const JCylinder3D cylinder(JCircle2D(JVector2D(0.0,0.0), 2.0), -1.0, +1.0);
52 
53 
54  int number_of_errors = 0;
55  int number_of_events = 0;
56 
57  for (int i = 0; i != numberOfEvents; ++i) {
58 
59  STATUS(setw(4) << i << '\r'); DEBUG(endl);
60 
61  const double x = gRandom->Uniform(-1.0, +1.0);
62  const double y = gRandom->Uniform(-1.0, +1.0);
63  const double z = gRandom->Uniform(-1.0, +1.0);
64 
65  double dx;
66  double dy;
67  double dz;
68 
69  gRandom->Sphere(dx, dy, dz, 1.0);
70 
71  JAxis3D axis(JVector3D(x, y, z), JVersor3D(dx, dy, dz));
72 
73  JCylinder3D::intersection_type intersection = cylinder.getIntersection(axis);
74 
75  const pair<double, bool> path[] = {
76  make_pair(intersection.first - 1*precision, false),
77  make_pair(2*precision, true),
78  make_pair(intersection.second - intersection.first - 2*precision, true),
79  make_pair(2*precision, false)
80  };
81 
82  ++number_of_events;
83 
84  bool ok = true;
85 
86  const int N = sizeof(path)/sizeof(path[0]);
87 
88  JVector3D pos[N];
89 
90  for (int i = 0; i != N; ++i) {
91 
92  axis.move(path[i].first);
93 
94  if ((getDistance(cylinder, axis.getPosition()) < 1e-3*precision) != path[i].second) {
95  ok = false;
96  }
97 
98  pos[i] = axis.getPosition();
99  }
100 
101  if (!ok) {
102 
103  for (int i = 0; i != N; ++i) {
104  cout << endl << "point[" << noshowpos << setw(1) << i << "] = "
105  << showpos << FIXED(9,5) << pos[i].getX() << ' '
106  << showpos << FIXED(9,5) << pos[i].getY() << ' '
107  << showpos << FIXED(9,5) << pos[i].getZ() << ' '
108  << SCIENTIFIC(12,3) << cylinder.getDistance(pos[i]) << ' '
109  << (cylinder.getDistance(pos[i]) < 1e-3*precision ? "in" : "out") << endl;
110  }
111  }
112 
113  if (!ok) {
114  ++number_of_errors;
115  }
116  }
117  STATUS(endl);
118 
119  NOTICE("Number of errors: " << number_of_errors << " out of " << number_of_events << " events." << endl);
120 
121  ASSERT(number_of_events > 0);
122  ASSERT(number_of_errors == 0);
123 
124  return 0;
125 }
int main(int argc, char **argv)
Definition: JCylinder3D.cc:22
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define STATUS(A)
Definition: JMessage.hh:63
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
#define NOTICE(A)
Definition: JMessage.hh:64
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
I/O formatting auxiliaries.
Data structure for circle in two dimensions.
Definition: JCircle2D.hh:35
Data structure for vector in two dimensions.
Definition: JVector2D.hh:34
Axis object.
Definition: JAxis3D.hh:41
void move(const double step)
Move vertex along this axis.
Definition: JAxis3D.hh:134
Cylinder object.
Definition: JCylinder3D.hh:41
intersection_type getIntersection(const JAxis3D &axis) const
Get intersection points of axis with cylinder.
Definition: JCylinder3D.hh:277
double getDistance(const JVector3D &pos) const
Get distance between cylinder wall and given position.
Definition: JCylinder3D.hh:222
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
Data structure for vector in three dimensions.
Definition: JVector3D.hh:36
double getY() const
Get y position.
Definition: JVector3D.hh:104
double getZ() const
Get z position.
Definition: JVector3D.hh:115
double getX() const
Get x position.
Definition: JVector3D.hh:94
Data structure for normalised vector in three dimensions.
Definition: JVersor3D.hh:28
Utility class to parse command line options.
Definition: JParser.hh:1714
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JSTDTypes.hh:14
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:448
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:488