43 : bbMin_m(3, -
std::numeric_limits<double>::
max()/10.),
44 bbMax_m(3,
std::numeric_limits<double>::
max()/10.),
45 polarBBMin_m(3, 0), polarBBMax_m(3, 0) {
56 double x = std::sqrt(position[0]*position[0]+position[2]*position[2]);
57 double z = std::atan2(position[2], position[0]);
63 double x = +value[0]*std::cos(position[2])
64 +value[2]*std::sin(position[2]);
65 double z = +value[2]*std::cos(position[2])
66 -value[0]*std::sin(position[2]);
72 double x = position[0]*std::cos(position[2]);
73 double z = position[0]*std::sin(position[2]);
79 double x = +value[0]*std::cos(position[2])
80 -value[2]*std::sin(position[2]);
81 double z = +value[2]*std::cos(position[2])
82 +value[0]*std::sin(position[2]);
88 (
double bbMinR,
double bbMinY,
double bbMinPhi,
89 double bbMaxR,
double bbMaxY,
double bbMaxPhi,
90 double bbTolR,
double bbTolY,
double bbTolPhi) {
91 if (bbMinR > bbMaxR) {
93 "SectorField::SetPolarBoundingBox",
94 "Bounding box minimum radius was greater than maximum radius"));
98 "SectorField::SetPolarBoundingBox",
99 "Bounding box radius must be positive"
102 if (bbMinY > bbMaxY) {
104 "SectorField::SetPolarBoundingBox",
105 "Bounding box minimum y was greater than maximum y"
108 if (bbMinPhi > bbMaxPhi) {
110 "SectorField::SetPolarBoundingBox",
111 "Bounding box minimum angle was greater than maximum angle"
114 if (bbMinPhi < -2.*Physics::pi || bbMinPhi > 2.*
Physics::pi ||
115 bbMaxPhi < -2.*Physics::pi || bbMaxPhi > 2.*
Physics::pi) {
117 "SectorField::SetPolarBoundingBox",
118 "Bounding box angles must be in range -2*Physics::pi < phi < 2*Physics::pi"
131 std::vector< std::vector<double> > corner_coords(
132 getCorners(bbMinR, bbMinPhi, bbMaxR, bbMaxPhi));
134 *std::min_element(corner_coords[0].
begin(), corner_coords[0].
end());
136 *std::max_element(corner_coords[0].
begin(), corner_coords[0].
end());
140 *std::min_element(corner_coords[1].
begin(), corner_coords[1].
end());
142 *std::max_element(corner_coords[1].
begin(), corner_coords[1].
end());
164 (
double bbMinR,
double bbMinPhi,
double bbMaxR,
double bbMaxPhi) {
165 std::vector< std::vector<double> > corner_coords(2);
166 corner_coords[0] = std::vector<double>(4);
167 corner_coords[1] = std::vector<double>(4);
169 double corner_0[3] = {bbMinR, 0., bbMinPhi};
170 double corner_1[3] = {bbMinR, 0., bbMaxPhi};
171 double corner_2[3] = {bbMaxR, 0., bbMaxPhi};
172 double corner_3[3] = {bbMaxR, 0., bbMinPhi};
178 corner_coords[0][0] = corner_0[0];
179 corner_coords[0][1] = corner_1[0];
180 corner_coords[0][2] = corner_2[0];
181 corner_coords[0][3] = corner_3[0];
182 corner_coords[1][0] = corner_0[2];
183 corner_coords[1][1] = corner_1[2];
184 corner_coords[1][2] = corner_2[2];
185 corner_coords[1][3] = corner_3[2];
186 return corner_coords;
199 double &rBegin,
double &rEnd)
const {
207 double &yIni,
double &yFinal,
208 double &zIni,
double &zFinal)
const {
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
PartBunchBase< T, Dim >::ConstIterator begin(PartBunchBase< T, Dim > const &bunch)
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
constexpr double two_pi
The value of.
constexpr double pi
The value of.
std::vector< double > bbMin_m
std::vector< std::vector< double > > getCorners(double bbMinR, double bbMinPhi, double bbMaxR, double bbMaxPhi)
std::vector< double > polarBBMin_m
void getFieldDimensions(double &zBegin, double &zEnd, double &rBegin, double &rEnd) const
virtual std::vector< double > getPolarBoundingBoxMin() const
static void convertToCartesian(double *position)
std::vector< double > polarBBMax_m
std::vector< double > bbMax_m
SectorField(const std::string &file_name)
virtual std::vector< double > getPolarBoundingBoxMax() const
static void convertToPolar(double *position)
void setPolarBoundingBox(double bbMinR, double bbMinY, double bbMinPhi, double bbMaxR, double bbMaxY, double bbMaxPhi, double bbTolR, double bbTolY, double bbTolPhi)