Namespaces | Classes | Typedefs | Functions | Variables
geo::vect Namespace Reference

Utilities to manipulate geometry vectors.The utilities include generic vector interface facilities allowing to use different vector types via templates. More...

Namespaces

 details
 
 dump
 Utilities to print vector types.
 
 extra
 Convenience utilities not directly related to vectors.
 

Classes

class  CoordConstIterator
 Constant iterator to vector coordinates. More...
 
class  MiddlePointAccumulatorDim
 Helper class to compute the middle point in a point set. More...
 

Typedefs

template<typename Vector >
using coordinate_t = details::VectorScalar_t< Vector >
 Type of coordinate of the specified vector type. More...
 
template<typename Vector >
using CoordReader_t = decltype(details::makeCoordReader(&Vector::X))
 Type of a coordinate reader for a vector type. More...
 
template<typename Vector >
using CoordManager_t = decltype(details::makeCoordManager(&Vector::X,&Vector::SetX))
 Type of a coordinate manager for a vector type. More...
 
using MiddlePointAccumulator = MiddlePointAccumulatorDim< 3U >
 Middle-point accumulator for vectors of dimension 3. More...
 

Functions

template<typename Vector , typename Coords >
constexpr Vector makeFromCoords (Coords &&coords)
 Creates a Vector object with coordinates from coords. More...
 
template<typename Vector >
constexpr auto coordManager (unsigned int n)
 Returns an object that can be bound to a vector to manage one of its coordinates. More...
 
template<typename Vector >
constexpr auto coordManager (unsigned int n, Vector &v)
 Returns an object that can be bound to a vector to manage one of its coordinates. More...
 
template<typename Vector >
constexpr auto bindCoord (Vector const &v, CoordReader_t< Vector > helper)
 Binds the specified constant vector to the coordinate reader. More...
 
template<typename Vector >
auto bindCoord (Vector &v, CoordManager_t< Vector > helper) -> details::BoundCoordManager< CoordManager_t< Vector >, Vector >
 Binds the specified vector to the coordinate manager. More...
 
template<typename Vector >
auto Xcoord (Vector &v)
 Returns an object to manage the coordinate X of the vector v. More...
 
template<typename Vector >
auto Ycoord (Vector &v)
 Returns an object to manage the coordinate Y of the vector v. More...
 
template<typename Vector >
auto Zcoord (Vector &v)
 Returns an object to manage the coordinate Z of the vector v. More...
 
template<typename Vector >
auto Tcoord (Vector &v)
 Returns an object to manage the coordinate T of the vector v. More...
 
template<typename Vector >
auto coord (Vector &v, unsigned int n) noexcept
 Returns an object to manage the coordinate n of a vector. More...
 
template<typename Vector >
constexpr auto bindCoordManagers (Vector &v)
 
template<typename Vector >
constexpr auto bindCoordReaders (Vector const &v)
 
template<typename Dest , typename Source >
Dest convertTo (Source const &v)
 Returns a vector of type Dest with the same content as a Src. More...
 
template<typename Dest , typename Source >
std::vector< Dest > convertCollTo (std::vector< Source > const &coll)
 Returns a vector of type Dest with the same content as a Src. More...
 
template<typename Vector , typename Pred >
Vector transformCoords (Vector const &v, Pred &&pred)
 Returns a new vector applying a predicate to each component. More...
 
template<>
auto norm (geo::Vector_t const &v)
 
template<>
auto mag2< TVector2 > (TVector2 const &v)
 
template<typename Vector , typename Coords >
unsigned int fillCoords (Coords &dest, Vector const &src)
 Fills a coordinate array with the coordinates of a vector. More...
 
template<typename Vector >
CoordConstIterator< Vectoroperator+ (typename CoordConstIterator< Vector >::difference_type n, CoordConstIterator< Vector > const &v)
 
template<typename Vector >
auto vector_cbegin (Vector const &v)
 Returns a const-iterator pointing to the first coordinate of v. More...
 
template<typename Vector >
auto vector_cend (Vector const &v)
 Returns a const-iterator pointing after the last coordinate of v. More...
 
template<typename Vector >
auto iterateCoords (Vector const &v)
 Returns an object for ranged-for iteration on coordinates. More...
 
Vector coordinate access abstraction

This group of utilities provides a common interface for tasks involving geometry vectors, which may have different interface. An example of that is the access of coordinates by an index: it is supported (and "slow") in TVector3 for read/write access, while in GenVector it is not supported (and given that the internal representation might be not cartesian, it's not surprising). We provide utilities which fill the gaps, relying on some looser requirements.

Coordinate managers

A "coordinate manager" is an object handling a specific coordinate out of a specific vector type; i.e., a coordinate manager object will manage for its entire lifetime the same coordinate, e.g. x or z. A coordinate manager can be:

  • bound to a vector object: that manager handles exclusively its managed coordinate for that vector object;
  • unbound: such a manager can handle the managed coordinate of any vector, which can be passed as an argument; or the unbound manager can be used to create a bound one.

Two types of managers are available:

  • reader, accesses the coordinate but can't modify it
  • manager, requires to be bound to a mutable vector and can assign and modify the coordinate via selected operations

Note that a coordinate is never returned as a reference, either mutable or constant.

Handling a coordinate of a vector object: bound managers

A bound coordinate manager can be created directly:

geo::Point_t p { 1.0, 2.0, 3.0 };
std::cout << p << " has x=" << px() << std::endl;
px += 5.0;
std::cout << p << " has now x=" << px() << std::endl;

will return something along the line of

(1,2,3) has x=1
(6,2,3) has now x=6

Functions Xcoord(), Ycoord(), Zcoord() and Tcoord() (in namespace geo::vect) are available for the supporting vector types.

If access by numeric index is necessary, coord() can be used instead:

geo::Vector_t const v { 1.0, 2.0, 3.0 };
for (unsigned c = 0; c < 3; ++c) {
auto vc = geo::vect::coord(v, c);
std::cout << v << "[" << c << "]=" << vc() << std::endl;
}

(note that for this example we have implicitly obtained a coordinate reader instead of a full coordinate manager because v is constant). This will print:

v[0]=1
v[1]=2
v[2]=3

If there are more vectors to access the same coordinate of, it's better to use unbound managers (see below).

Handling a coordinate for any vector object

Unbound coordinate managers (and readers) can't operate directly on vectors but they need to be bound to one. Binding produces a new bound manager, leaving the unbound manager untouched. Binding is done with geo::vect::bindCoord(). For example:

geo::Point_t A { 1.0, 2.0, 3.0 };
auto Ax = geo::vect::bindCoord(A, YcoordManager<geo::Point_t>);
std::cout << A << " has y=" << Ax << std::endl;

should produce an output like

(1,2,3) has y=2

In the example, YcoordManager is a template coordinate manager. There are managers available for X, Y, Z and T coordinates, and each one can deal only with a specific vector type; also, specifying a non-constant vector type will deliver a full manager, which can't operate on constant vectors. The unbound coordinate managers are not as useful, but a possible use is for loops on coordinates from multiple vectors:

geo::Point_t A { 1.0, 2.0, 3.0 }, geo::Point_t B {5.0, 7.0, 9.0 };
for (unsigned c = 0; c < 3; ++c) {
auto coordMan = geo::vect::coordManager(c);
auto Ac = geo::vect::bindCoord(A, coordMan);
auto Bc = geo::vect::bindCoord(B, coordMan);
std::cout << (Bc() - Ac() * 2.0) << std::endl;
} // for

which will emit

3
3
3

This is marginally faster than the same code with geo::vect::bindCoord() call replaced by geo::vect::coord(). More convenient still, if the coordinates are treated all just the same and c is not needed (as above):

geo::Point_t A { 1.0, 2.0, 3.0 }, geo::Point_t B {5.0, 7.0, 9.0 };
for (auto coordMan: geo::vect::coordManagers<geo::Point_t const>()) {
auto Ac = geo::vect::bindCoord(A, coordMan);
auto Bc = geo::vect::bindCoord(B, coordMan);
std::cout << (Bc() - Ac() * 2.0) << std::endl;
} // for

Conversion between vector types

A convenience function convertTo() is provided to convert a vector into another of a different type (for example, from TVector3 to geo::Vector_t).

Vector requirements

So far, the requirements for this set of utilities are the following. The vector type must support:

  • a cartesian coordinate constructor: Vector v { 1.0, 2.0, 3.0 };
  • accessor methods named after the name of the coordinate, acting on constant vectors, taking no arguments, and returning a copy of the coordinate value, e.g. double X() const
  • coordinate assignment methods named SetC, where C is the name of each coordinate, after the name of the coordinate, with a single argument; the return type is not prescribed; e.g. void SetY(double)
  • the coordinate names must be X and Y for 2D vectors, plus Z for 3D vectors and T for 4D vectors (metric is irrelevant here)
template<typename Vector >
constexpr unsigned int dimension ()
 Returns the dimension of the specified vector type. More...
 
template<typename Vector >
constexpr unsigned int dimension (Vector &&)
 
template<typename Vector >
constexpr std::array< std::size_t, geo::vect::dimension< Vector >)> indices ()
 Returns a sequence of indices valid for a vector of the specified type. More...
 
template<typename Vector >
constexpr auto indices (Vector const &) -> decltype(indices< Vector >())
 
template<typename Vector >
constexpr auto coordManagers ()
 Returns an array with all coordinate managers for a type of vector. More...
 
template<typename Vector >
constexpr auto coordManagers (Vector &&)
 
template<typename Vector >
constexpr auto coordReaders ()
 Returns an array with all coordinate readers for a type of vector. More...
 
template<typename Vector >
constexpr auto coordReaders (Vector &&)
 
Functions for common vector operations.

This group of template functions are meant to be used with vectors in a generic way. The default implementation is for TVector3. Specializations can be easily written for other vector types.

In addition, two "standard" representations for vectors and points are provided.

Note
The representations for vector and point objects are currently the same; this prevents relying on overload resolution to decide which function to use. For example, defining two functions with signature: will not compile since these two are exactly the same. A solution might be to derive two different classes from the common one:
struct Vector_t: public VectorBase_t { using VectorBase_t::VectorBase_t; };
struct Point_t: public VectorBase_t { using VectorBase_t::VectorBase_t; };
This will likely have consequences though (for example, the sum of two Vector_t or Point_t will become a VectorBase_t).
template<typename Vector , typename Scalar >
Vector rounded01 (Vector const &v, Scalar tol)
 Returns a vector with all components rounded if close to 0, -1 or +1. More...
 
template<typename Vector , typename Scalar >
void round01 (Vector &v, Scalar tol)
 Returns a vector with all components rounded if close to 0, -1 or +1. More...
 
template<typename Vector >
bool isfinite (Vector const &v)
 Returns whether all components of the vector are finite. More...
 
template<typename Vector >
Vector normalize (Vector const &v)
 Returns a vector parallel to v and with norm 1. More...
 
template<typename Vector >
Vector cross (Vector const &a, Vector const &b)
 Return cross product of two vectors. More...
 
template<typename Vector >
constexpr auto dot (Vector const &a, Vector const &b)
 Return cross product of two vectors. More...
 
template<typename Vector >
auto mag2 (Vector const &v)
 Return norm of the specified vector. More...
 
template<typename Vector >
auto norm (Vector const &v)
 Return norm of the specified vector. More...
 
template<typename Vector >
auto mixedProduct (Vector const &a, Vector const &b, Vector const &c)
 
template<typename Vector , typename Scalar >
Vector rounded0 (Vector const &v, Scalar tol)
 Returns a vector with all components rounded if close to 0. More...
 
template<typename Vector , typename Scalar >
void round0 (Vector &v, Scalar tol)
 Returns a vector with all components rounded if close to 0. More...
 
Middle point functions
template<typename Point , typename BeginIter , typename EndIter >
Point middlePointAs (BeginIter begin, EndIter end)
 Returns the middle of the specified points. More...
 
template<typename BeginIter , typename EndIter >
geo::Point_t middlePoint (BeginIter begin, EndIter end)
 Returns the middle of the specified points. More...
 
template<typename Point >
Point middlePoint (std::initializer_list< Point > points)
 Returns the middle of the specified points. More...
 
Support for GArSoft geometry vectors
template<typename Point >
::geo::Point_t toPoint (Point const &p)
 Convert the specified point into a geo::Point_t. More...
 
template<typename Vector >
::geo::Vector_t toVector (Vector const &v)
 Convert the specified vector into a geo::Vector_t. More...
 
template<typename Point >
std::vector< geo::Point_tconvertCollToPoint (std::vector< Point > const &coll)
 
template<typename Vector >
std::vector< geo::Vector_tconvertCollToVector (std::vector< Vector > const &coll)
 
template<typename Coords >
GENVECTOR_CONSTEXPR::geo::Point_t makePointFromCoords (Coords &&coords)
 Creates a geo::Point_t from its coordinates (see makeFromCoords()). More...
 
template<typename Coords >
GENVECTOR_CONSTEXPR::geo::Vector_t makeVectorFromCoords (Coords &&coords)
 Creates a geo::Vector_t from its coordinates (see makeFromCoords()). More...
 
TVector3 conversions
template<typename Vector >
TVector3 toTVector3 (Vector const &v)
 Converts a vector into a TVector3. More...
 

Variables

template<typename Vector >
static constexpr auto XcoordManager = details::makeCoordManager(&Vector::X, &Vector::SetX)
 Object that can be bound to a vector to manage its X coordinate. More...
 
template<typename Vector >
static constexpr auto XcoordManager< Vector const > = details::makeCoordReader(&Vector::X)
 Object that can be bound to a vector to access its X coordinate. More...
 
template<typename Vector >
static constexpr auto const YcoordManager = details::makeCoordManager(&Vector::Y, &Vector::SetY)
 
template<typename Vector >
static constexpr auto YcoordManager< Vector const > = details::makeCoordReader(&Vector::Y)
 
template<typename Vector >
static constexpr auto ZcoordManager = details::makeCoordManager(&Vector::Z, &Vector::SetZ)
 
template<typename Vector >
static constexpr auto ZcoordManager< Vector const > = details::makeCoordReader(&Vector::Z)
 
template<typename Vector >
static constexpr auto TcoordManager = details::makeCoordManager(&Vector::T, &Vector::SetT)
 
template<typename Vector >
static constexpr auto TcoordManager< Vector const > = details::makeCoordReader(&Vector::T)
 
template<typename Vector >
static constexpr auto XcoordManager = details::makeCoordManager(&Vector::X, &Vector::SetX)
 Object that can be bound to a vector to manage its X coordinate. More...
 
template<typename Vector >
static constexpr auto XcoordManager< Vector const > = details::makeCoordReader(&Vector::X)
 Object that can be bound to a vector to access its X coordinate. More...
 
template<typename Vector >
static constexpr auto const YcoordManager = details::makeCoordManager(&Vector::Y, &Vector::SetY)
 
template<typename Vector >
static constexpr auto YcoordManager< Vector const > = details::makeCoordReader(&Vector::Y)
 
template<typename Vector >
static constexpr auto ZcoordManager = details::makeCoordManager(&Vector::Z, &Vector::SetZ)
 
template<typename Vector >
static constexpr auto ZcoordManager< Vector const > = details::makeCoordReader(&Vector::Z)
 
template<typename Vector >
static constexpr auto TcoordManager = details::makeCoordManager(&Vector::T, &Vector::SetT)
 
template<typename Vector >
static constexpr auto TcoordManager< Vector const > = details::makeCoordReader(&Vector::T)
 

Detailed Description

Utilities to manipulate geometry vectors.

The utilities include generic vector interface facilities allowing to use different vector types via templates.

Typedef Documentation

template<typename Vector >
using geo::vect::coordinate_t = typedef details::VectorScalar_t<Vector>

Type of coordinate of the specified vector type.

Definition at line 584 of file geo_vectors_utils.h.

template<typename Vector >
using geo::vect::CoordManager_t = typedef decltype (details::makeCoordManager(&Vector::X, &Vector::SetX))

Type of a coordinate manager for a vector type.

Definition at line 617 of file geo_vectors_utils.h.

template<typename Vector >
using geo::vect::CoordReader_t = typedef decltype(details::makeCoordReader(&Vector::X))

Type of a coordinate reader for a vector type.

Definition at line 612 of file geo_vectors_utils.h.

typedef MiddlePointAccumulatorDim< 3U > geo::vect::MiddlePointAccumulator

Middle-point accumulator for vectors of dimension 3.

Definition at line 1179 of file geo_vectors_utils.h.

Function Documentation

template<typename Vector >
constexpr auto geo::vect::bindCoord ( Vector const &  v,
CoordReader_t< Vector helper 
)

Binds the specified constant vector to the coordinate reader.

Definition at line 784 of file geo_vectors_utils.h.

785  {
786  return details::BoundCoordGetter<CoordReader_t<Vector>, Vector const>
787  (v, helper);
788  }
template<typename Vector >
auto geo::vect::bindCoord ( Vector v,
CoordManager_t< Vector helper 
) -> details::BoundCoordManager<CoordManager_t<Vector>, Vector>

Binds the specified vector to the coordinate manager.

Definition at line 792 of file geo_vectors_utils.h.

794  { return { v, helper }; }
template<typename Vector >
constexpr auto geo::vect::bindCoordManagers ( Vector v)

Returns an array with all coordinate managers bound to the specified vector.

Definition at line 1714 of file geo_vectors_utils.h.

1714  {
1715  return details::BindCoordManagersImpl<Vector, dimension<Vector>()>::bind(v);
1716 } // geo::vect::bindCoordManagers()
template<typename Vector >
constexpr auto geo::vect::bindCoordReaders ( Vector const &  v)

Returns an array with all coordinate readers bound to the specified vector.

Definition at line 1720 of file geo_vectors_utils.h.

1720  {
1721  using ConstVector = std::add_const_t<std::remove_reference_t<Vector>>;
1722  return details::BindCoordManagersImpl<ConstVector, dimension<ConstVector>()>
1723  ::bind(v);
1724 } // geo::vect::bindCoordReaders()
template<typename Dest , typename Source >
std::vector< Dest > geo::vect::convertCollTo ( std::vector< Source > const &  coll)

Returns a vector of type Dest with the same content as a Src.

Template Parameters
Desttarget vector type
Sourcetype of the vector to be converted from
Parameters
collthe collection of vectors to be converted from
Returns
a collection of vectors with the same content as coll, but of type Dest
See also
convertTo()

This version applies convertTo() to all the elements of the specified collection, returning a collection of the same template type (std::vector).

For the requirements, see convertTo().

Definition at line 1735 of file geo_vectors_utils.h.

1735  {
1736 
1737  std::vector<Dest> dest;
1738  dest.reserve(coll.size());
1739  std::transform(coll.begin(), coll.end(), std::back_inserter(dest),
1740  geo::vect::convertTo<Dest, Source>);
1741  return dest;
1742 
1743 } // geo::vect::convertCollTo()
template<typename Point >
std::vector< geo::Point_t > geo::vect::convertCollToPoint ( std::vector< Point > const &  coll)

Convert the specified collection of points into a collection of geo::Point_t.

Definition at line 1293 of file geo_vectors_utils.h.

1294  { return convertCollTo<geo::Point_t>(coll); }
template<typename Vector >
std::vector< geo::Vector_t > geo::vect::convertCollToVector ( std::vector< Vector > const &  coll)

Convert the specified collection of vectors into a collection of geo::Vector_t.

Definition at line 1300 of file geo_vectors_utils.h.

1301  { return convertCollTo<geo::Vector_t>(coll); }
template<typename Dest , typename Source >
Dest geo::vect::convertTo ( Source const &  v)

Returns a vector of type Dest with the same content as a Src.

Template Parameters
Desttarget vector type
Sourcetype of the vector to be converted from
Parameters
vthe vector to be converted from
Returns
a vector with the same content as v, but of type Dest

For this to work, both Src and Dest types must satisfy the requirements of Xcoord(), Ycoord(), Zcoord() etc.

Definition at line 1729 of file geo_vectors_utils.h.

def convert(inputfile, outputfile="wire-cell-garfield-fine-response.json.bz2", average=False, shaped=False)
Definition: garfield.py:262
template<typename Vector >
auto geo::vect::coord ( Vector v,
unsigned int  n 
)
noexcept

Returns an object to manage the coordinate n of a vector.

Template Parameters
Vectorthe type of vector to be managed
Parameters
vthe vector to be managed
nthe coordinate index: 0 for X, 1 for Y and 2 for Z
Returns
an object to manage the coordinate n of a vector
See also
Xcoord(), Ycoord(), Zcoord()

Result is undefined for any value of n other than 0, 1 and 2. See Xcoord(), Ycoord() and Zcoord() for Vector type requirements.

Definition at line 1682 of file geo_vectors_utils.h.

1682  {
1683  return vect::bindCoord<Vector>(v, coordManager<Vector>(n));
1684 }
std::void_t< T > n
template<typename Vector >
constexpr auto geo::vect::coordManager ( unsigned int  n)

Returns an object that can be bound to a vector to manage one of its coordinates.

Template Parameters
Vectortype of vector to get a manager for (constantness matters)
Parameters
nindex of the coordinate (0: X, 1: Y, 2: Z, 3: T)
Returns
a coordinate manager, undefined if index is invalid

Index n is assumed to be smaller than the dimension of the vector. The manager returned for a mutable vector exposes a read/write interface. Example of usage:

// mutable vectors get a full-featured "manager":
geo::Point_t p { 1.0, 2.0, 3.0 };
auto px
= geo::vect::bindCoord(p, geo::vect::coordManager<geo::Point_t>(0U));
px *= 5.0;
std::cout << p << " has now x=" << px() << std::endl;

will print something like:

(5,2,3) has now x=5

For a constant vector, the returned manager exposes a read-only interface. Example of usage:

// constant vectors get a "reader" (read-only manager):
geo::Vector_t v { 1.0, 2.0, 3.0 };
(v, geo::vect::coordManager<geo::Vector_t const>(1U));
std::cout << v << " has y=" << vy() << std::endl;

will print something like:

{1,2,3) has y=2

Note that the use in these examples, coord() is preferred.

Definition at line 1676 of file geo_vectors_utils.h.

std::void_t< T > n
auto const & get(AssnsNode< L, R, D > const &r)
Definition: AssnsNode.h:115
template<typename Vector >
constexpr auto geo::vect::coordManager ( unsigned int  n,
Vector v 
)

Returns an object that can be bound to a vector to manage one of its coordinates.

Template Parameters
Vectortype of vector to get a manager for (constantness matters)
Parameters
nindex of the coordinate (0: X, 1: Y, 2: Z, 3: T)
va vector of type Vector (ignored)
Returns
a coordinate manager, undefined if index is invalid
See also
geo::vect::coordManager(unsigned int)

An alias of geo::vect::coordManager(unsigned int).

template<typename Vector >
constexpr auto geo::vect::coordManagers ( )

Returns an array with all coordinate managers for a type of vector.

Definition at line 1689 of file geo_vectors_utils.h.

1689  {
1690  using PlainVector = std::remove_reference_t<Vector>;
1691  return
1692  details::CoordManagersImpl<PlainVector, dimension<PlainVector>()>::get();
1693 } // geo::vect::coordManagers()
template<typename Vector >
constexpr auto geo::vect::coordManagers ( Vector &&  )

Definition at line 1696 of file geo_vectors_utils.h.

1697  { return coordManagers<Vector>(); }
template<typename Vector >
constexpr auto geo::vect::coordReaders ( )

Returns an array with all coordinate readers for a type of vector.

Definition at line 1701 of file geo_vectors_utils.h.

1701  {
1702  using ConstVector = std::add_const_t<std::remove_reference_t<Vector>>;
1703  return
1704  details::CoordManagersImpl<ConstVector, dimension<ConstVector>()>::get();
1705 } // geo::vect::coordReaders()
template<typename Vector >
constexpr auto geo::vect::coordReaders ( Vector &&  )

Definition at line 1708 of file geo_vectors_utils.h.

1709  { return coordReaders<Vector>(); }
template<typename Vector >
Vector geo::vect::cross ( Vector const &  a,
Vector const &  b 
)

Return cross product of two vectors.

Definition at line 985 of file geo_vectors_utils.h.

985 { return a.Cross(b); }
const double a
static bool * b
Definition: config.cpp:1043
template<typename Vector >
constexpr unsigned int geo::vect::dimension ( )

Returns the dimension of the specified vector type.

Definition at line 569 of file geo_vectors_utils.h.

569 { return details::dimension<Vector>(); }
template<typename Vector >
constexpr unsigned int geo::vect::dimension ( Vector &&  )

Definition at line 571 of file geo_vectors_utils.h.

571 { return dimension<Vector>(); }
template<typename Vector >
constexpr auto geo::vect::dot ( Vector const &  a,
Vector const &  b 
)

Return cross product of two vectors.

Definition at line 989 of file geo_vectors_utils.h.

989 { return a.Dot(b); }
const double a
static bool * b
Definition: config.cpp:1043
template<typename Vector , typename Coords >
unsigned int geo::vect::fillCoords ( Coords &  dest,
Vector const &  src 
)

Fills a coordinate array with the coordinates of a vector.

Template Parameters
Vectortype of vector being copied from
Coordstype of coordinate array to be filled
Parameters
srcthe vector to read the coordinates from
destthe array to be filled
Returns
the number of coordinates filled (that's Vector's dimension)
See also
geo::vect::makeFromCoords()

The Coords array type is expected to provide a indexing operator returning a r-value, that is coords[i] can be assigned to.

Definition at line 2056 of file geo_vectors_utils.h.

2056  {
2057  // this is simpler than makeFromCoords() because doesn't attempt constexpr
2058  for (std::size_t i = 0; i < geo::vect::dimension(src); ++i)
2059  dest[i] = geo::vect::coord(src, i);
2060  return geo::vect::dimension(src);
2061 } // geo::vect::fillCoords()
auto coord(Vector &v, unsigned int n) noexcept
Returns an object to manage the coordinate n of a vector.
constexpr unsigned int dimension()
Returns the dimension of the specified vector type.
template<typename Vector >
constexpr std::array< std::size_t, geo::vect::dimension< Vector >)> geo::vect::indices ( )

Returns a sequence of indices valid for a vector of the specified type.

Definition at line 1655 of file geo_vectors_utils.h.

1656 {
1657  return details::makeIndexSeq<std::size_t, dimension<Vector>()>();
1658 }
template<typename Vector >
constexpr auto geo::vect::indices ( Vector const &  ) -> decltype(indices<Vector>())

Definition at line 1661 of file geo_vectors_utils.h.

1662  { return indices<Vector>(); }
template<typename Vector >
bool geo::vect::isfinite ( Vector const &  v)

Returns whether all components of the vector are finite.

Definition at line 1758 of file geo_vectors_utils.h.

1759  { return details::isfiniteImpl(v, details::makeVectorIndices<Vector>()); }
bool isfiniteImpl(Point const &point, std::index_sequence< I... >)
template<typename Vector >
auto geo::vect::iterateCoords ( Vector const &  v)

Returns an object for ranged-for iteration on coordinates.

Template Parameters
Vectortype of vector to iterate through
Parameters
vvector whose coordinates will be iterated
Returns
an object suitable for range-for loop

Example:

geo::Vector_t v{ 3.0, 4.0, 5.0 };
for (auto c: geo::vect::iterateCoords(v)) std::cout << c << ' ';

will print 3 4 5.

Definition at line 1068 of file geo_vectors_utils.h.

1069  { return util::span(vector_cbegin(v), vector_cend(v)); }
span(IterB &&b, IterE &&e, Adaptor &&adaptor) -> span< decltype(adaptor(std::forward< IterB >(b))), decltype(adaptor(std::forward< IterE >(e))) >
auto vector_cend(Vector const &v)
Returns a const-iterator pointing after the last coordinate of v.
auto vector_cbegin(Vector const &v)
Returns a const-iterator pointing to the first coordinate of v.
template<typename Vector >
auto geo::vect::mag2 ( Vector const &  v)

Return norm of the specified vector.

Definition at line 993 of file geo_vectors_utils.h.

993 { return v.Mag2(); }
template<>
auto geo::vect::mag2< TVector2 > ( TVector2 const &  v)
inline

Definition at line 115 of file geo_vectors_utils_TVector.h.

115 { return v.Mod2(); }
template<typename Vector , typename Coords >
constexpr Vector geo::vect::makeFromCoords ( Coords &&  coords)

Creates a Vector object with coordinates from coords.

Template Parameters
Vectorthe type of vector to be created
Coordstype of object holding the value of the needed coordinates
Parameters
coordsobject holding the value of the needed coordinates
Returns
a newly created Vector object with coordinates from coords

To create a vector of dimension N, the first N values are extracted from coords using Coords::operator[](std::size_t). For example:

constexpr std::array<float, 5U> data { 2.0, 5.0, 7.0, 11.0, 15.5 };
constexpr auto p = geo::vect::makeFromCoords<geo::Point_t>(data);
auto v = geo::vect::makeFromCoords<geo::Vector_t>(data.data() + 1);

will set p as constexpr geo::Point_t {2.0, 5.0, 7.0 }, ignoring the additional data. Likewise, it will set v to geo::Vector_t{ 5.0, 7.0, 11.0 }. In both cases, the coordinates are implicitly converted from float into the scalar type of the target vectors (in both cases, double).

Template Parameters
Vectorthe type of vector to be created
Coordstype of object holding the value of the needed coordinates
Parameters
coordsobject holding the value of the needed coordinates
Returns
a newly created Vector object with coordinates from coords
See also
geo::vect::fillCoords()

To create a vector of dimension N, the first N values are extracted from coords using Coords::operator[](std::size_t). For example:

constexpr std::array<float, 5U> data { 2.0, 5.0, 7.0, 11.0, 15.5 };
constexpr auto p = geo::vect::makeFromCoords<geo::Point_t>(data);
auto v = geo::vect::makeFromCoords<geo::Vector_t>(data.data() + 1);

will set p as constexpr geo::Point_t {2.0, 5.0, 7.0 }, ignoring the additional data. Likewise, it will set v to geo::Vector_t{ 5.0, 7.0, 11.0 }. In both cases, the coordinates are implicitly converted from float into the scalar type of the target vectors (in both cases, double).

Definition at line 1667 of file geo_vectors_utils.h.

1667  {
1668  using namespace geo::vect::details;
1669  return makeFromCoordsImpl<Vector>
1670  (constexpr_forward<Coords>(coords), makeVectorIndices<Vector>());
1671 } // geo::vect::makeFromCoords()
template<typename Coords >
GENVECTOR_CONSTEXPR::geo::Point_t geo::vect::makePointFromCoords ( Coords &&  coords)

Creates a geo::Point_t from its coordinates (see makeFromCoords()).

Definition at line 1306 of file geo_vectors_utils.h.

1307  { return makeFromCoords<::geo::Point_t>(std::forward<Coords>(coords)); }
template<typename Coords >
GENVECTOR_CONSTEXPR::geo::Vector_t geo::vect::makeVectorFromCoords ( Coords &&  coords)

Creates a geo::Vector_t from its coordinates (see makeFromCoords()).

Definition at line 1311 of file geo_vectors_utils.h.

1312  { return makeFromCoords<::geo::Vector_t>(std::forward<Coords>(coords)); }
template<typename BeginIter , typename EndIter >
geo::Point_t geo::vect::middlePoint ( BeginIter  begin,
EndIter  end 
)

Returns the middle of the specified points.

Template Parameters
BeginItertype of iterator to a point type compatible with add()
EndItertype of end iterator
Parameters
beginiterator to the first point to be averaged
enditerator after the last point to be averaged
Returns
an object of type Point_t with the value of the middle point

Example of usage:

std::vector<geo::Point_t> points {
geo::Point_t(1., 2., 3.),
geo::Point_t(2., 4., 6.),
geo::Point_t(3., 6., 9.)
};
auto mp = geo::vect::middlePoint(points.begin(), points.end());

The variable mp of the example will be of type geo::Point_t.

Definition at line 1239 of file geo_vectors_utils.h.

1240  { return middlePointAs<geo::Point_t>(begin, end); }
decltype(auto) begin(ROOT::Math::LorentzVector< CoordSystem > const &v)
decltype(auto) end(ROOT::Math::LorentzVector< CoordSystem > const &v)
template<typename Point >
Point geo::vect::middlePoint ( std::initializer_list< Point points)

Returns the middle of the specified points.

Template Parameters
Pointcartesian-represented point type with 3-component constructor and X(), Y() and Z() accessors.
Parameters
pointsthe list of points to be included
Returns
the value of the middle point

Example of usage:

({ geo::Point_t(1., 2., 3.), geo::Point_t(3., 6., 9.) });

The variable mp will contain the middle point between the two specified in the initializer list.

Definition at line 1259 of file geo_vectors_utils.h.

1260  {
1261  constexpr auto Dim = geo::vect::dimension<Point>();
1262  return MiddlePointAccumulatorDim<Dim>(points.begin(), points.end())
1263  .template middlePointAs<Point>();
1264  }
template<typename Point , typename BeginIter , typename EndIter >
Point geo::vect::middlePointAs ( BeginIter  begin,
EndIter  end 
)

Returns the middle of the specified points.

Template Parameters
Pointcartesian-represented point type with 3-component constructor
BeginItertype of iterator to a point type compatible with add()
EndItertype of end iterator
Parameters
beginiterator to the first point to be averaged
enditerator after the last point to be averaged
Returns
an object of type Point with the value of the middle point

Example of usage:

std::vector<geo::Point_t> points {
geo::Point_t(1., 2., 3.),
geo::Point_t(2., 4., 6.),
geo::Point_t(3., 6., 9.)
};
auto mp = geo::vect::middlePointAs<geo::Vector_t>(points.begin(), points.end());

The variable mp of the example will be of type geo::Vector_t (converted component by components from a geo::Point_t).

Definition at line 1210 of file geo_vectors_utils.h.

1211  {
1212  constexpr auto Dim = geo::vect::dimension<Point>();
1213  return MiddlePointAccumulatorDim<Dim>(begin, end)
1214  .template middlePointAs<Point>();
1215  }
decltype(auto) begin(ROOT::Math::LorentzVector< CoordSystem > const &v)
decltype(auto) end(ROOT::Math::LorentzVector< CoordSystem > const &v)
template<typename Vector >
auto geo::vect::mixedProduct ( Vector const &  a,
Vector const &  b,
Vector const &  c 
)

Return "mixed" product of three vectors: $ \vec{a} \times \vec{b} \cdot \vec{c} $

Definition at line 1002 of file geo_vectors_utils.h.

1003  { return dot(cross(a, b), c); }
constexpr auto dot(Vector const &a, Vector const &b)
Return cross product of two vectors.
const double a
static bool * b
Definition: config.cpp:1043
Vector cross(Vector const &a, Vector const &b)
Return cross product of two vectors.
template<typename Vector >
auto geo::vect::norm ( Vector const &  v)

Return norm of the specified vector.

Definition at line 997 of file geo_vectors_utils.h.

997 { return v.Mag(); }
template<>
auto geo::vect::norm ( geo::Vector_t const &  v)
inline

Definition at line 1334 of file geo_vectors_utils.h.

1334 { return v.R(); }
template<typename Vector >
Vector geo::vect::normalize ( Vector const &  v)

Returns a vector parallel to v and with norm 1.

Definition at line 981 of file geo_vectors_utils.h.

981 { return v.Unit(); }
template<typename Vector >
CoordConstIterator<Vector> geo::vect::operator+ ( typename CoordConstIterator< Vector >::difference_type  n,
CoordConstIterator< Vector > const &  v 
)

Definition at line 1038 of file geo_vectors_utils.h.

1042  { return v + n; }
std::void_t< T > n
template<typename Vector , typename Scalar >
void geo::vect::round0 ( Vector v,
Scalar  tol 
)

Returns a vector with all components rounded if close to 0.

Definition at line 1165 of file geo_vectors_utils.h.

1165 { v = rounded0(v, tol); }
auto const tol
Definition: SurfXYZTest.cc:16
Vector rounded0(Vector const &v, Scalar tol)
Returns a vector with all components rounded if close to 0.
template<typename Vector , typename Scalar >
void geo::vect::round01 ( Vector v,
Scalar  tol 
)

Returns a vector with all components rounded if close to 0, -1 or +1.

Definition at line 972 of file geo_vectors_utils.h.

972 { v = rounded01(v, tol); }
auto const tol
Definition: SurfXYZTest.cc:16
Vector rounded01(Vector const &v, Scalar tol)
Returns a vector with all components rounded if close to 0, -1 or +1.
template<typename Vector , typename Scalar >
Vector geo::vect::rounded0 ( Vector const &  v,
Scalar  tol 
)

Returns a vector with all components rounded if close to 0.

Definition at line 1157 of file geo_vectors_utils.h.

1158  {
1159  return transformCoords
1160  (v, [tol](auto c){ return extra::roundValue0(c, tol); });
1161  }
auto const tol
Definition: SurfXYZTest.cc:16
constexpr T roundValue0(T value, T tol)
Returns value, rounded to 0 if closer than tol.
Vector transformCoords(Vector const &v, Pred &&pred)
Returns a new vector applying a predicate to each component.
template<typename Vector , typename Scalar >
Vector geo::vect::rounded01 ( Vector const &  v,
Scalar  tol 
)

Returns a vector with all components rounded if close to 0, -1 or +1.

Definition at line 964 of file geo_vectors_utils.h.

965  {
966  return transformCoords
967  (v, [tol](auto c){ return extra::roundValue01(c, tol); });
968  }
auto const tol
Definition: SurfXYZTest.cc:16
Vector transformCoords(Vector const &v, Pred &&pred)
Returns a new vector applying a predicate to each component.
constexpr T roundValue01(T value, T tol)
Returns value, rounded to 0, -1 or +1 if closer than tol.
template<typename Vector >
auto geo::vect::Tcoord ( Vector v)

Returns an object to manage the coordinate T of the vector v.

Template Parameters
Vectorthe type of vector to be managed
Parameters
vthe vector with the coordinate T to be managed
Returns
an object to manage the coordinate T of v

The type Vector needs to have a double T() const method and a auto SetT(auto) method, where the argument is the type of the managed coordinate and the return value is unspecified.

Definition at line 850 of file geo_vectors_utils.h.

851  { return bindCoord<Vector>(v, TcoordManager<Vector>); }
template<typename Point >
::geo::Point_t geo::vect::toPoint ( Point const &  p)

Convert the specified point into a geo::Point_t.

Definition at line 1280 of file geo_vectors_utils.h.

1281  { return geo::vect::convertTo<::geo::Point_t>(p); }
p
Definition: test.py:223
template<typename Vector >
TVector3 geo::vect::toTVector3 ( Vector const &  v)

Converts a vector into a TVector3.

Definition at line 43 of file geo_vectors_utils_TVector.h.

43 { return convertTo<TVector3>(v); }
template<typename Vector >
::geo::Vector_t geo::vect::toVector ( Vector const &  v)

Convert the specified vector into a geo::Vector_t.

Definition at line 1285 of file geo_vectors_utils.h.

1286  { return geo::vect::convertTo<::geo::Vector_t>(v); }
template<typename Vector , typename Pred >
Vector geo::vect::transformCoords ( Vector const &  v,
Pred &&  pred 
)

Returns a new vector applying a predicate to each component.

Template Parameters
Vectortype of the vector in input (and output)
Predtype of unary predicate to be applied
Parameters
vthe vector to be transformed
predthe predicate to be applied
Returns
a vector equivelent to { pred(x), pred(y), ... }

The predicate is a "functor" type, taking as the single argument the coordinate to be transformed, and returning the transformed value of it.

Definition at line 1748 of file geo_vectors_utils.h.

1748  {
1749  details::CoordinateArray_t<Vector> values;
1750  unsigned int i = 0;
1751  for (auto c: bindCoordReaders(v)) values[i++] = pred(c());
1752  return makeFromCoords<Vector>(values);
1753 } // geo::vect::transformCoords()
constexpr auto bindCoordReaders(Vector const &v)
Q_UINT16 values[128]
template<typename Vector >
auto geo::vect::vector_cbegin ( Vector const &  v)

Returns a const-iterator pointing to the first coordinate of v.

Definition at line 1046 of file geo_vectors_utils.h.

1047  { return CoordConstIterator(v, 0); }
template<typename Vector >
auto geo::vect::vector_cend ( Vector const &  v)

Returns a const-iterator pointing after the last coordinate of v.

Definition at line 1051 of file geo_vectors_utils.h.

1052  { return CoordConstIterator(v, geo::vect::dimension(v)); }
constexpr unsigned int dimension()
Returns the dimension of the specified vector type.
template<typename Vector >
auto geo::vect::Xcoord ( Vector v)

Returns an object to manage the coordinate X of the vector v.

Template Parameters
Vectorthe type of vector to be managed
Parameters
vthe vector with the coordinate X to be managed
Returns
an object to manage the coordinate X of v

The type Vector needs to have a double X() const method and a auto SetX(auto) method, where the argument is the type of the managed coordinate and the return value is unspecified.

Definition at line 808 of file geo_vectors_utils.h.

809  { return bindCoord(v, XcoordManager<Vector>); }
auto bindCoord(Vector &v, CoordManager_t< Vector > helper) -> details::BoundCoordManager< CoordManager_t< Vector >, Vector >
Binds the specified vector to the coordinate manager.
template<typename Vector >
auto geo::vect::Ycoord ( Vector v)

Returns an object to manage the coordinate Y of the vector v.

Template Parameters
Vectorthe type of vector to be managed
Parameters
vthe vector with the coordinate Y to be managed
Returns
an object to manage the coordinate Y of v

The type Vector needs to have a double Y() const method and a auto SetY(auto) method, where the argument is the type of the managed coordinate and the return value is unspecified.

Definition at line 822 of file geo_vectors_utils.h.

823  { return bindCoord<Vector>(v, YcoordManager<Vector>); }
template<typename Vector >
auto geo::vect::Zcoord ( Vector v)

Returns an object to manage the coordinate Z of the vector v.

Template Parameters
Vectorthe type of vector to be managed
Parameters
vthe vector with the coordinate Z to be managed
Returns
an object to manage the coordinate Z of v

The type Vector needs to have a double Z() const method and a auto SetZ(auto) method, where the argument is the type of the managed coordinate and the return value is unspecified.

Definition at line 836 of file geo_vectors_utils.h.

837  { return bindCoord<Vector>(v, ZcoordManager<Vector>); }

Variable Documentation

template<typename Vector >
constexpr auto geo::vect::TcoordManager = details::makeCoordManager(&Vector::T, &Vector::SetT)
static

An object that can be bound to a vector to manage its T coordinate.

See also
geo::vect::XcoordManager

Definition at line 697 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::TcoordManager = details::makeCoordManager(&Vector::T, &Vector::SetT)
static

An object that can be bound to a vector to manage its T coordinate.

See also
geo::vect::XcoordManager

Definition at line 728 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::TcoordManager< Vector const > = details::makeCoordReader(&Vector::T)
static

An object that can be bound to a vector to manage its T coordinate.

See also
geo::vect::XcoordManager

Definition at line 703 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::TcoordManager< Vector const > = details::makeCoordReader(&Vector::T)
static

An object that can be bound to a vector to manage its T coordinate.

See also
geo::vect::XcoordManager

Definition at line 734 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::XcoordManager = details::makeCoordManager(&Vector::X, &Vector::SetX)
static

Object that can be bound to a vector to manage its X coordinate.

Template Parameters
Vectortype of vector to get a manager for (mutable type required)

The manager exposes a read/write interface. Example of usage:

// mutable vectors get a full-featured "manager":
geo::Point_t p { 1.0, 2.0, 3.0 };
auto px
= geo::vect::bindCoord(p, geo::vect::XcoordManager<geo::Point_t>);
px *= 5.0;
std::cout << p << " has now x=" << px() << std::endl;

will print something like:

(5,2,3) has now x=5

Note that the use in the example, Xcoord() is preferred.

Definition at line 642 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::XcoordManager = details::makeCoordManager(&Vector::X, &Vector::SetX)
static

Object that can be bound to a vector to manage its X coordinate.

Template Parameters
Vectortype of vector to get a manager for (mutable type required)

The manager exposes a read/write interface. Example of usage:

// mutable vectors get a full-featured "manager":
geo::Point_t p { 1.0, 2.0, 3.0 };
auto px
= geo::vect::bindCoord(p, geo::vect::XcoordManager<geo::Point_t>);
px *= 5.0;
std::cout << p << " has now x=" << px() << std::endl;

will print something like:

(5,2,3) has now x=5

Note that the use in the example, Xcoord() is preferred.

Definition at line 673 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::XcoordManager< Vector const > = details::makeCoordReader(&Vector::X)
static

Object that can be bound to a vector to access its X coordinate.

Template Parameters
Vectortype of vector to get a manager for (constant type required)

The manager exposes a read-only interface. Example of usage:

// constant vectors get a "reader" (read-only manager):
geo::Vector_t v { 1.0, 2.0, 3.0 };
(v, geo::vect::XcoordManager<geo::Vector_t const>);
std::cout << v << " has x=" << vx() << std::endl;

will print something like:

(1,2,3) has x=1

Note that the use in the example, Xcoord() is preferred.

Definition at line 667 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::XcoordManager< Vector const > = details::makeCoordReader(&Vector::X)
static

Object that can be bound to a vector to access its X coordinate.

Template Parameters
Vectortype of vector to get a manager for (constant type required)

The manager exposes a read-only interface. Example of usage:

// constant vectors get a "reader" (read-only manager):
geo::Vector_t v { 1.0, 2.0, 3.0 };
(v, geo::vect::XcoordManager<geo::Vector_t const>);
std::cout << v << " has x=" << vx() << std::endl;

will print something like:

(1,2,3) has x=1

Note that the use in the example, Xcoord() is preferred.

Definition at line 698 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto const geo::vect::YcoordManager = details::makeCoordManager(&Vector::Y, &Vector::SetY)
static

An object that can be bound to a vector to manage its Y coordinate.

See also
geo::vect::XcoordManager

Definition at line 673 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto const geo::vect::YcoordManager = details::makeCoordManager(&Vector::Y, &Vector::SetY)
static

An object that can be bound to a vector to manage its Y coordinate.

See also
geo::vect::XcoordManager

Definition at line 704 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::YcoordManager< Vector const > = details::makeCoordReader(&Vector::Y)
static

An object that can be bound to a vector to manage its Y coordinate.

See also
geo::vect::XcoordManager

Definition at line 679 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::YcoordManager< Vector const > = details::makeCoordReader(&Vector::Y)
static

An object that can be bound to a vector to manage its Y coordinate.

See also
geo::vect::XcoordManager

Definition at line 710 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::ZcoordManager = details::makeCoordManager(&Vector::Z, &Vector::SetZ)
static

An object that can be bound to a vector to manage its Z coordinate.

See also
geo::vect::XcoordManager

Definition at line 685 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::ZcoordManager = details::makeCoordManager(&Vector::Z, &Vector::SetZ)
static

An object that can be bound to a vector to manage its Z coordinate.

See also
geo::vect::XcoordManager

Definition at line 716 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::ZcoordManager< Vector const > = details::makeCoordReader(&Vector::Z)
static

An object that can be bound to a vector to manage its Z coordinate.

See also
geo::vect::XcoordManager

Definition at line 691 of file geo_vectors_utils.h.

template<typename Vector >
constexpr auto geo::vect::ZcoordManager< Vector const > = details::makeCoordReader(&Vector::Z)
static

An object that can be bound to a vector to manage its Z coordinate.

See also
geo::vect::XcoordManager

Definition at line 722 of file geo_vectors_utils.h.