8 #ifndef IMPATOM_BOND_DECORATORS_H
9 #define IMPATOM_BOND_DECORATORS_H
11 #include "atom_config.h"
12 #include <IMP/core/internal/graph_base.h>
13 #include "internal/bond_helpers.h"
21 #include <IMP/internal/IndexingIterator.h>
22 IMPATOM_BEGIN_NAMESPACE
48 return IMP::core::internal::graph_is_edge(p,
49 internal::get_bond_data().graph_);
53 enum Type {UNKNOWN=-1,
54 NONBIOLOGICAL, SINGLE=1, DOUBLE=2, TRIPLE=3, HYDROGEN,
63 Bonded get_bonded(
unsigned int i)
const ;
66 internal::get_bond_data().type_,
Int,
Int,
70 internal::get_bond_data().order_,
74 internal::get_bond_data().length_,
Float,
77 internal::get_bond_data().stiffness_,
82 return internal::get_bond_data().length_;
92 class IMPATOMEXPORT Bonded:
public Decorator
95 typedef Bond result_type;
98 GetBond(Particle* d): d_(d){}
99 Bond operator()(
unsigned int i)
const;
100 bool operator==(
const GetBond &o)
const {
105 typedef Bonded result_type;
108 GetBonded(Particle* d): d_(d){}
109 Bonded operator()(
unsigned int i)
const;
110 bool operator==(
const GetBonded &o)
const {
117 static bool particle_is_instance(
Particle *p) {
118 return IMP::core::internal::graph_is_node(p,
119 internal::get_bond_data().graph_);
122 static Bonded setup_particle(Particle *p) {
123 graph_initialize_node(p, internal::get_bond_data().graph_);
128 unsigned int get_number_of_bonds()
const {
129 return graph_get_number_of_edges(get_particle(),
130 internal::get_bond_data().graph_);
139 Particle *p= graph_get_edge(get_particle(), i,
140 internal::get_bond_data().graph_);
154 Bonded get_bonded(
unsigned int i)
const {
155 Particle *p= graph_get_edge(get_particle(), i,
156 internal::get_bond_data().graph_);
158 if (bd.get_bonded(0) == *
this)
return bd.get_bonded(1);
159 else return bd.get_bonded(0);
168 typedef IMP::internal::IndexingIterator<GetBond> BondIterator;
171 BondIterator bonds_begin()
const {
172 return BondIterator(GetBond(get_particle()), 0);
174 BondIterator bonds_end()
const {
175 return BondIterator(GetBond(get_particle()), get_number_of_bonds());
183 class BondedIterator;
185 typedef IMP::internal::IndexingIterator<GetBonded> BondedIterator;
188 BondedIterator bondeds_begin()
const {
189 return BondedIterator(GetBonded(get_particle()), 0);
191 BondedIterator bondeds_end()
const {
192 return BondedIterator(GetBonded(get_particle()), get_number_of_bonds());
202 inline Bonded Bond::get_bonded(
unsigned int i)
const
204 Particle *p= graph_get_node(get_particle(), i,
205 internal::get_bond_data().graph_);
210 inline Bond Bonded::GetBond::operator()(
unsigned int i)
212 return Bonded(d_).get_bond(i);
214 inline Bonded Bonded::GetBonded::operator()(
unsigned int i)
216 return Bonded(d_).get_bonded(i);
251 bd.set_length(length);
255 if (stiffness >=0) bd.set_stiffness(stiffness);
271 if (o.get_length() > 0) bd.set_length(o.get_length());
272 bd.get_particle()->set_name(std::string(
"bond ")+
273 a.get_particle()->get_name()
274 +
" and " + b.get_particle()->get_name());
275 if (o.get_stiffness() >=0) bd.set_stiffness(o.get_stiffness());
307 IMP_PARTICLE_GEOMETRY(Bond, Bond,{
313 epi1.get_coordinates());
318 IMPATOM_END_NAMESPACE