mirror of https://github.com/CGAL/cgal
246 lines
6.3 KiB
C++
246 lines
6.3 KiB
C++
/* Copyright 2004
|
|
Stanford University
|
|
|
|
This file is part of the DSR PDB Library.
|
|
|
|
The DSR PDB Library is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
the Free Software Foundation; either version 2.1 of the License, or (at your
|
|
option) any later version.
|
|
|
|
The DSR PDB Library is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
along with the DSR PDB Library; see the file LICENSE.LGPL. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
#ifndef DSR_PDB_ATOM_H
|
|
#define DSR_PDB_ATOM_H
|
|
#include <CGAL/PDB/basic.h>
|
|
#include <CGAL/PDB/Point.h>
|
|
#include <CGAL/Tools/Label.h>
|
|
#include <CGAL/PDB/Transform.h>
|
|
#include <boost/iterator/transform_iterator.hpp>
|
|
#include <string>
|
|
CGAL_PDB_BEGIN_NAMESPACE
|
|
//! A class repesenting an atom.
|
|
class Atom {
|
|
public:
|
|
typedef Label<Atom> Index;
|
|
|
|
//! The type (element) of an atom. The currently supported types are C,N,H,O,S, INVALID
|
|
enum Type {INVALID=0, C,N,H,O, S, P, FE, PT};
|
|
|
|
//! Construct and invalid atom
|
|
inline Atom(): type_(INVALID){}
|
|
|
|
//inline Atom_label label() const;
|
|
//! Cartesian coordinates (x,y,z) for the atom.
|
|
CGAL_GETSET(Point, point, coordinates_);
|
|
|
|
/*inline Point &cartesian_coords() {
|
|
return coordinates_;
|
|
}*/
|
|
|
|
//inline bool operator<(const Atom &o) const;
|
|
inline bool operator==(const Atom& al) const;
|
|
inline bool operator!=(const Atom& al) const;
|
|
//! The PDB occupancy field.
|
|
CGAL_GETSET(float, occupancy, occupancy_);
|
|
|
|
//! The PDB temperature factor field.
|
|
CGAL_GETSET(float, temperature_factor, temp_factor_);
|
|
|
|
//! The PDB segment ID char
|
|
CGAL_GETSET(std::string, segment_id, segID_);
|
|
|
|
//! The PDB element field
|
|
CGAL_GETSET(std::string, element, element_);
|
|
|
|
//! The PDB charge field.
|
|
CGAL_GETSET(std::string, charge, charge_);
|
|
|
|
//! The type of the atoms (basically what element).
|
|
CGAL_GETSET(Type, type, type_);
|
|
|
|
//! Returns the van der Waals radius of the atom.
|
|
/*! Values take from the wikipedia so beware.
|
|
*/
|
|
CGAL_GET(double, radius, return radii_[type_]);
|
|
|
|
|
|
//! This is a label which identifies an Atom uniquely within some scale.
|
|
/*!
|
|
The uniqueness is only valid if working within the object which assigned the indices,
|
|
and if nothing has changed since the corresponding index_atoms() function was called.
|
|
*/
|
|
CGAL_GET(Index, index, return index_);
|
|
|
|
//! note const
|
|
void set_index(Index i) const {index_=i;}
|
|
|
|
static Type string_to_type(const char *c);
|
|
|
|
void swap_with(Atom &o) {
|
|
CGAL_ISWAP(type_);
|
|
CGAL_ISWAP(coordinates_);
|
|
CGAL_ISWAP(occupancy_);
|
|
CGAL_ISWAP(temp_factor_);
|
|
CGAL_ISWAP(segID_);
|
|
CGAL_ISWAP(element_);
|
|
CGAL_ISWAP(charge_);
|
|
CGAL_ISWAP(index_);
|
|
}
|
|
private:
|
|
Type type_;
|
|
Point coordinates_;
|
|
float occupancy_, temp_factor_;
|
|
std::string segID_, element_, charge_;
|
|
static double radii_[];
|
|
mutable Index index_;
|
|
};
|
|
|
|
|
|
CGAL_SWAP(Atom);
|
|
|
|
/*inline bool Atom::operator<(const Atom &o) const {
|
|
if (index_ < o.index_) return true;
|
|
else if (index_ > o.index_) return false;
|
|
else return type_ < o.type_;
|
|
}*/
|
|
|
|
inline bool Atom::operator==(const Atom &o) const {
|
|
return type_== o.type_ && coordinates_ == o.coordinates_;
|
|
}
|
|
|
|
inline bool Atom::operator!=(const Atom &o) const {
|
|
return !operator==(o);
|
|
}
|
|
|
|
|
|
|
|
//! Assign unique indices to all atoms in the sequence, starting at optional start value
|
|
/*!
|
|
This returns the next unused index.
|
|
*/
|
|
template <class It>
|
|
inline int index_atoms(It b, It e, int start=0) {
|
|
for (; b != e; ++b) {
|
|
b->atom().set_index(Atom::Index(start++));
|
|
}
|
|
return start;
|
|
}
|
|
|
|
|
|
|
|
|
|
//! Take an Atom and return the Atom::point()
|
|
/*!
|
|
*/
|
|
struct Point_from_atom {
|
|
typedef Point result_type;
|
|
|
|
const result_type& operator()(const Atom& a) const {
|
|
return a.point();
|
|
}
|
|
};
|
|
|
|
//! Returns an interator which takes an Atom and return the coordinates
|
|
/*!
|
|
The iterator value_type should be an Atom.
|
|
|
|
*/
|
|
template <class It>
|
|
boost::transform_iterator<Point_from_atom, It>
|
|
make_point_iterator(It it) {
|
|
return boost::make_transform_iterator(it, Point_from_atom());
|
|
}
|
|
|
|
//! Take an Atom and return the Atom::index()
|
|
/*!
|
|
*/
|
|
struct Index_from_atom {
|
|
typedef Atom::Index result_type;
|
|
|
|
const result_type& operator()(const Atom& a) const {
|
|
return a.index();
|
|
}
|
|
};
|
|
//! Returns an interator which takes an Atom and return the Atom::index()
|
|
/*!
|
|
The iterator value_type should be an Atom.
|
|
|
|
*/
|
|
template <class It>
|
|
boost::transform_iterator<Index_from_atom, It>
|
|
make_index_iterator(It it) {
|
|
return boost::make_transform_iterator(it, Index_from_atom());
|
|
}
|
|
|
|
//! Take an Atom and return the a K::Weighted_point
|
|
/*!
|
|
*/
|
|
template <class K>
|
|
struct Weighted_point_from_atom {
|
|
typedef typename K::Weighted_point result_type;
|
|
result_type operator()(const Atom &b) const {
|
|
typedef typename K::Bare_point BP;
|
|
return result_type(BP(b.point().x(),
|
|
b.point().y(),
|
|
b.point().z()),
|
|
b.radius()*b.radius());
|
|
}
|
|
};
|
|
|
|
//! Return an interator which takes an Atom and return the a K::Weighted_point
|
|
/*!
|
|
The iterator value_type should be an Atom.
|
|
*/
|
|
template <class It, class K>
|
|
boost::transform_iterator<Weighted_point_from_atom<K>, It>
|
|
make_weighted_point_iterator(It it, K) {
|
|
return boost::make_transform_iterator(it, Weighted_point_from_atom<K>());
|
|
}
|
|
|
|
//! Take an Atom and return the a K::Sphere_3
|
|
/*!
|
|
*/
|
|
template <class K>
|
|
struct Sphere_3_from_atom {
|
|
typedef typename K::Sphere_3 result_type;
|
|
result_type operator()(const Atom &b) const {
|
|
typedef typename K::Point_3 BP;
|
|
return result_type(BP(b.point().x(),
|
|
b.point().y(),
|
|
b.point().z()),
|
|
b.radius()*b.radius());
|
|
}
|
|
};
|
|
//! Take an Atom and return the a K::Sphere_3
|
|
/*!
|
|
*/
|
|
template <class It, class K>
|
|
boost::transform_iterator<Sphere_3_from_atom<K>, It>
|
|
make_sphere_3_iterator(It it, K) {
|
|
return boost::make_transform_iterator(it, Sphere_3_from_atom<K>());
|
|
}
|
|
|
|
|
|
//! Apply a transformation to the coordinates of an Atom
|
|
class Transform_atom {
|
|
Transform t_;
|
|
public:
|
|
Transform_atom(const Transform &t):t_(t){}
|
|
void operator()(Atom &a) const {
|
|
a.set_point(t_(a.point()));
|
|
}
|
|
};
|
|
|
|
|
|
CGAL_PDB_END_NAMESPACE
|
|
#endif
|