source: src/analysis_correlation.cpp@ a5551b

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 Candidate_v1.7.0 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since a5551b was a5551b, checked in by Frederik Heber <heber@…>, 16 years ago

Closed ticket #48 (AnalysisCorrelation...() take MoleculeListClass instead of molecule).

  • Property mode set to 100644
File size: 8.2 KB
Line 
1/*
2 * analysis.cpp
3 *
4 * Created on: Oct 13, 2009
5 * Author: heber
6 */
7
8#include <iostream>
9
10#include "analysis_correlation.hpp"
11#include "element.hpp"
12#include "molecule.hpp"
13#include "tesselation.hpp"
14#include "tesselationhelpers.hpp"
15#include "vector.hpp"
16#include "verbose.hpp"
17
18
19/** Calculates the pair correlation between given elements.
20 * Note given element order is unimportant (i.e. g(Si, O) === g(O, Si))
21 * \param *out output stream for debugging
22 * \param *molecules list of molecules structure
23 * \param *type1 first element or NULL (if any element)
24 * \param *type2 second element or NULL (if any element)
25 * \return Map of doubles with values the pair of the two atoms.
26 */
27PairCorrelationMap *PairCorrelation( ofstream * const out, MoleculeListClass * const &molecules, const element * const type1, const element * const type2 )
28{
29 PairCorrelationMap *outmap = NULL;
30 double distance = 0.;
31
32 if (molecules->ListOfMolecules.empty()) {
33 cerr << Verbose(1) <<"No molecule given." << endl;
34 return outmap;
35 }
36 outmap = new PairCorrelationMap;
37 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
38 if ((*MolWalker)->ActiveFlag) {
39 cerr << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
40 atom *Walker = (*MolWalker)->start;
41 while (Walker->next != (*MolWalker)->end) {
42 Walker = Walker->next;
43 *out << Verbose(3) << "Current atom is " << *Walker << "." << endl;
44 if ((type1 == NULL) || (Walker->type == type1)) {
45 for (MoleculeList::const_iterator MolOtherWalker = MolWalker; MolOtherWalker != molecules->ListOfMolecules.end(); MolOtherWalker++)
46 if ((*MolOtherWalker)->ActiveFlag) {
47 *out << Verbose(2) << "Current other molecule is " << *MolOtherWalker << "." << endl;
48 atom *OtherWalker = (*MolOtherWalker)->start;
49 while (OtherWalker->next != (*MolOtherWalker)->end) { // only go up to Walker
50 OtherWalker = OtherWalker->next;
51 *out << Verbose(3) << "Current otheratom is " << *OtherWalker << "." << endl;
52 if (Walker->nr < OtherWalker->nr)
53 if ((type2 == NULL) || (OtherWalker->type == type2)) {
54 distance = Walker->node->Distance(OtherWalker->node);
55 //*out << Verbose(1) <<"Inserting " << *Walker << " and " << *OtherWalker << endl;
56 outmap->insert ( pair<double, pair <atom *, atom*> > (distance, pair<atom *, atom*> (Walker, OtherWalker) ) );
57 }
58 }
59 }
60 }
61 }
62 }
63
64 return outmap;
65};
66
67/** Calculates the distance (pair) correlation between a given element and a point.
68 * \param *out output stream for debugging
69 * \param *molecules list of molecules structure
70 * \param *type element or NULL (if any element)
71 * \param *point vector to the correlation point
72 * \return Map of dobules with values as pairs of atom and the vector
73 */
74CorrelationToPointMap *CorrelationToPoint( ofstream * const out, MoleculeListClass * const &molecules, const element * const type, const Vector *point )
75{
76 CorrelationToPointMap *outmap = NULL;
77 double distance = 0.;
78
79 if (molecules->ListOfMolecules.empty()) {
80 *out << Verbose(1) <<"No molecule given." << endl;
81 return outmap;
82 }
83 outmap = new CorrelationToPointMap;
84 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
85 if ((*MolWalker)->ActiveFlag) {
86 *out << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
87 atom *Walker = (*MolWalker)->start;
88 while (Walker->next != (*MolWalker)->end) {
89 Walker = Walker->next;
90 *out << Verbose(3) << "Current atom is " << *Walker << "." << endl;
91 if ((type == NULL) || (Walker->type == type)) {
92 distance = Walker->node->Distance(point);
93 *out << Verbose(4) << "Current distance is " << distance << "." << endl;
94 outmap->insert ( pair<double, pair<atom *, const Vector*> >(distance, pair<atom *, const Vector*> (Walker, point) ) );
95 }
96 }
97 }
98
99 return outmap;
100};
101
102/** Calculates the distance (pair) correlation between a given element and a surface.
103 * \param *out output stream for debugging
104 * \param *molecules list of molecules structure
105 * \param *type element or NULL (if any element)
106 * \param *Surface pointer to Tesselation class surface
107 * \param *LC LinkedCell structure to quickly find neighbouring atoms
108 * \return Map of doubles with values as pairs of atom and the BoundaryTriangleSet that's closest
109 */
110CorrelationToSurfaceMap *CorrelationToSurface( ofstream * const out, MoleculeListClass * const &molecules, const element * const type, const Tesselation * const Surface, const LinkedCell *LC )
111{
112 CorrelationToSurfaceMap *outmap = NULL;
113 double distance = 0.;
114 class BoundaryTriangleSet *triangle = NULL;
115 Vector centroid;
116
117 if ((Surface == NULL) || (LC == NULL) || (molecules->ListOfMolecules.empty())) {
118 *out << Verbose(1) <<"No Tesselation, no LinkedCell or no molecule given." << endl;
119 return outmap;
120 }
121 outmap = new CorrelationToSurfaceMap;
122 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
123 if ((*MolWalker)->ActiveFlag) {
124 *out << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
125 atom *Walker = (*MolWalker)->start;
126 while (Walker->next != (*MolWalker)->end) {
127 Walker = Walker->next;
128 *out << Verbose(3) << "Current atom is " << *Walker << "." << endl;
129 if ((type == NULL) || (Walker->type == type)) {
130 triangle = Surface->FindClosestTriangleToPoint(out, Walker->node, LC );
131 if (triangle != NULL) {
132 distance = DistanceToTrianglePlane(out, Walker->node, triangle);
133 outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(distance, pair<atom *, BoundaryTriangleSet*> (Walker, triangle) ) );
134 }
135 }
136 }
137 }
138
139 return outmap;
140};
141
142/** Returns the start of the bin for a given value.
143 * \param value value whose bin to look for
144 * \param BinWidth width of bin
145 * \param BinStart first bin
146 */
147double GetBin ( const double value, const double BinWidth, const double BinStart )
148{
149 double bin =(double) (floor((value - BinStart)/BinWidth));
150 return (bin*BinWidth+BinStart);
151};
152
153
154/** Prints correlation (double, int) pairs to file.
155 * \param *file file to write to
156 * \param *map map to write
157 */
158void OutputCorrelation( ofstream * const file, const BinPairMap * const map )
159{
160 *file << "# BinStart\tCount" << endl;
161 for (BinPairMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
162 *file << runner->first << "\t" << runner->second << endl;
163 }
164};
165
166/** Prints correlation (double, (atom*,atom*) ) pairs to file.
167 * \param *file file to write to
168 * \param *map map to write
169 */
170void OutputPairCorrelation( ofstream * const file, const PairCorrelationMap * const map )
171{
172 *file << "# BinStart\tAtom1\tAtom2" << endl;
173 for (PairCorrelationMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
174 *file << runner->first << "\t" << *(runner->second.first) << "\t" << *(runner->second.second) << endl;
175 }
176};
177
178/** Prints correlation (double, int) pairs to file.
179 * \param *file file to write to
180 * \param *map map to write
181 */
182void OutputCorrelationToPoint( ofstream * const file, const CorrelationToPointMap * const map )
183{
184 *file << "# BinStart\tAtom::x[i]-point.x[i]" << endl;
185 for (CorrelationToPointMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
186 *file << runner->first;
187 for (int i=0;i<NDIM;i++)
188 *file << "\t" << (runner->second.first->node->x[i] - runner->second.second->x[i]);
189 *file << endl;
190 }
191};
192
193/** Prints correlation (double, int) pairs to file.
194 * \param *file file to write to
195 * \param *map map to write
196 */
197void OutputCorrelationToSurface( ofstream * const file, const CorrelationToSurfaceMap * const map )
198{
199 *file << "# BinStart\tTriangle" << endl;
200 for (CorrelationToSurfaceMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
201 *file << runner->first << "\t" << *(runner->second.second) << endl;
202 }
203};
204
Note: See TracBrowser for help on using the repository browser.