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
RevLine 
[c4d4df]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"
[a5551b]16#include "verbose.hpp"
[c4d4df]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
[a5551b]22 * \param *molecules list of molecules structure
[c4d4df]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 */
[a5551b]27PairCorrelationMap *PairCorrelation( ofstream * const out, MoleculeListClass * const &molecules, const element * const type1, const element * const type2 )
[c4d4df]28{
29 PairCorrelationMap *outmap = NULL;
30 double distance = 0.;
31
[a5551b]32 if (molecules->ListOfMolecules.empty()) {
33 cerr << Verbose(1) <<"No molecule given." << endl;
[c4d4df]34 return outmap;
35 }
36 outmap = new PairCorrelationMap;
[a5551b]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 }
[c4d4df]59 }
[a5551b]60 }
[c4d4df]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
[a5551b]69 * \param *molecules list of molecules structure
[c4d4df]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 */
[a5551b]74CorrelationToPointMap *CorrelationToPoint( ofstream * const out, MoleculeListClass * const &molecules, const element * const type, const Vector *point )
[c4d4df]75{
76 CorrelationToPointMap *outmap = NULL;
77 double distance = 0.;
78
[a5551b]79 if (molecules->ListOfMolecules.empty()) {
80 *out << Verbose(1) <<"No molecule given." << endl;
[c4d4df]81 return outmap;
82 }
83 outmap = new CorrelationToPointMap;
[a5551b]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 }
[c4d4df]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
[a5551b]104 * \param *molecules list of molecules structure
[c4d4df]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 */
[a5551b]110CorrelationToSurfaceMap *CorrelationToSurface( ofstream * const out, MoleculeListClass * const &molecules, const element * const type, const Tesselation * const Surface, const LinkedCell *LC )
[c4d4df]111{
112 CorrelationToSurfaceMap *outmap = NULL;
113 double distance = 0.;
114 class BoundaryTriangleSet *triangle = NULL;
115 Vector centroid;
116
[a5551b]117 if ((Surface == NULL) || (LC == NULL) || (molecules->ListOfMolecules.empty())) {
118 *out << Verbose(1) <<"No Tesselation, no LinkedCell or no molecule given." << endl;
[c4d4df]119 return outmap;
120 }
121 outmap = new CorrelationToSurfaceMap;
[a5551b]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 }
[c4d4df]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 */
[776b64]147double GetBin ( const double value, const double BinWidth, const double BinStart )
[c4d4df]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 */
[a5551b]158void OutputCorrelation( ofstream * const file, const BinPairMap * const map )
[c4d4df]159{
160 *file << "# BinStart\tCount" << endl;
[776b64]161 for (BinPairMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
[c4d4df]162 *file << runner->first << "\t" << runner->second << endl;
163 }
164};
[b1f254]165
166/** Prints correlation (double, (atom*,atom*) ) pairs to file.
167 * \param *file file to write to
168 * \param *map map to write
169 */
[a5551b]170void OutputPairCorrelation( ofstream * const file, const PairCorrelationMap * const map )
[b1f254]171{
172 *file << "# BinStart\tAtom1\tAtom2" << endl;
[776b64]173 for (PairCorrelationMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
[b1f254]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 */
[a5551b]182void OutputCorrelationToPoint( ofstream * const file, const CorrelationToPointMap * const map )
[b1f254]183{
184 *file << "# BinStart\tAtom::x[i]-point.x[i]" << endl;
[776b64]185 for (CorrelationToPointMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
[b1f254]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 */
[a5551b]197void OutputCorrelationToSurface( ofstream * const file, const CorrelationToSurfaceMap * const map )
[b1f254]198{
199 *file << "# BinStart\tTriangle" << endl;
[776b64]200 for (CorrelationToSurfaceMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
[b1f254]201 *file << runner->first << "\t" << *(runner->second.second) << endl;
202 }
203};
204
Note: See TracBrowser for help on using the repository browser.