00001
00002
00003
00004
00005 #ifndef BALL_STRUCTURE_SDGENERATOR_H
00006 #define BALL_STRUCTURE_SDGENERATOR_H
00007
00008 #ifndef BALL_DATATYPE_OPTIONS_H
00009 # include <BALL/DATATYPE/options.h>
00010 #endif
00011
00012 #ifndef BALL_STRUCTURE_RINGANALYSER_H
00013 # include <BALL/STRUCTURE/ringAnalyser.h>
00014 #endif
00015
00016 #ifndef BALL_KERNEL_PDBATOM_H
00017 # include <BALL/KERNEL/PDBAtom.h>
00018 #endif
00019
00020 #include <vector>
00021 #include <queue>
00022
00023 namespace BALL
00024 {
00025 class System;
00026 class Atom;
00027
00033 class BALL_EXPORT SDGenerator
00034 {
00035 public:
00036
00040 enum Property
00041 {
00042 FIRST_SDGENERATOR_PROPERTY = PDBAtom::NUMBER_OF_PROPERTIES+1,
00043 IN_RING,
00044 CORE_CHAIN,
00045 DEPOSITED,
00046 FXAS,
00047 EQAS,
00048 HEAD,
00049 EDGE,
00050 ASSEMBLED,
00051 ZIG,
00052 ZAG,
00053 INITIALIZED_HEAD_CFS,
00054 LAST_SDGENERATOR_PROPERTY
00055 };
00056
00060
00061 struct BALL_EXPORT Option
00062 {
00065 static const char* SHOW_HYDROGENS;
00066
00070 static const char* STANDARD_BOND_LENGTH;
00071 };
00072
00074 struct BALL_EXPORT Default
00075 {
00076 static const bool SHOW_HYDROGENS;
00077
00078 static const float STANDARD_BOND_LENGTH;
00079 };
00081
00085
00089 SDGenerator(bool show_hydrogens = false);
00090
00094 virtual ~SDGenerator();
00096
00100
00101 Options options;
00103
00109 void setDefaultOptions();
00111
00116 void generateSD(System& molecule_sys);
00117
00121 void clear();
00122
00123 protected:
00124
00127 class AtomComparator
00128 {
00129 public:
00130 bool operator() (Atom const* first, Atom const* second) const
00131 {
00132 Size first_value = first->getProperty("SDGenerator::PRIORITY").getUnsignedInt();
00133 Size second_value = second->getProperty("SDGenerator::PRIORITY").getUnsignedInt();
00134
00135 return first_value < second_value;
00136 }
00137 };
00138
00143 void prepare_();
00144
00149 void constructRingSystem_(Position current_ring_system);
00150
00151
00152 Angle getCFS_(Atom const* atom, bool hi);
00153
00154
00155 Angle computeCFS_(Vector3 const& input);
00156
00157
00158 void setCFS_(Atom* atom, Angle cfs, bool high);
00159
00160
00161 void pushCFS_(Atom* atom);
00162
00163
00164 Angle getBackupCFS_(Atom const*, bool hi);
00165
00166
00167 void computeCoreCFS_(RingAnalyser::Ring& ring, bool clockwise);
00168
00169
00170 Angle computeAngularSeparation_(Atom* seed);
00171
00172
00173 Angle computeAngularDemand_(Atom* seed);
00174
00175
00176 std::vector<Atom*> sequenceSubstituents_(Atom* seed);
00177
00180 void computeShelleyPriorities_();
00181
00184 void buildRegularPolygon_(RingAnalyser::Ring& ring, Position first_anchor_index, bool clockwise);
00185
00188 void buildOpenPolygon_(RingAnalyser::Ring& ring, Position first_anchor_index, Position second_anchor_index);
00189
00196 void attachCore_(Position current_ring, std::vector<RingAnalyser::Ring>& current_system, float x_start);
00197
00203 void attachTemplate_(Position current_ring, std::vector<RingAnalyser::Ring>& current_system);
00204
00210 void attachFused_(Position current_ring, std::vector<RingAnalyser::Ring>& current_system);
00211
00217 void attachBridged_(Position current_ring, std::vector<RingAnalyser::Ring>& current_system);
00218
00224 void attachSpiro_(Position current_ring, std::vector<RingAnalyser::Ring>& current_system);
00225
00227 void computeAdjacencyMatrix_(std::vector<Atom*>& chain, std::vector<bool>& result);
00228
00230 static bool compareChains_(const vector<Atom*>& x, const vector<Atom*>& y);
00231
00235 void treatChains_();
00236
00237
00238 void smoothCFSAngle_(Atom* seed);
00239
00240
00241 void placeSubstituent_(Atom* seed, Atom* head, Atom* next);
00242
00243
00244 void depositPFU_(Atom* seed_atom, Atom* next_neighbour);
00245
00246
00247 void checkOverlap_(Atom* atom);
00248
00249
00250 bool ringIsClockwise_(const RingAnalyser::Ring& ring, Index start_index = 0) const;
00251
00255 void assembleSD_();
00256
00257
00258 void findFloydWarshallPath_(std::vector<int>& path, std::vector<Index>& next, Size remaining_atoms, Position i, Position j, std::list<Index>& output);
00259
00261 RingAnalyser ring_analyser_;
00262
00264 std::list<std::list<Atom*> > chains_;
00265
00267 std::priority_queue<Atom*, std::vector<Atom*>, AtomComparator> redraw_queue_;
00268
00270 System* system_;
00271 };
00272
00273 }
00274
00275 #endif