*/
#include <string>
#include <vector>
+#include <iostream>
+#include <omp.h>
+
+
#include <gromacs/trajectoryanalysis.h>
+#include "new_fit.h"
using namespace gmx;
std::string fnDist_;
double cutoff_;
Selection refsel_;
- SelectionList sel_;
AnalysisNeighborhood nb_;
AnalysisData data_;
AnalysisDataAverageModulePointer avem_;
+
+
+ Selection selec;
+ std::vector< std::pair< int, int > > fitting_pairs;
+ std::vector< std::vector < RVec > > trajectory;
+ std::vector< int > noise;
+ std::vector< int > index;
+ const long double epsi = 0.15;
+ const long double fitting_prec = 0.0000001;
+ int frames = 0;
+
+
};
settings->setHelpText(desc);
- options->addOption(FileNameOption("o")
+ /*options->addOption(FileNameOption("o")
.filetype(eftPlot).outputFile()
.store(&fnDist_).defaultBasename("avedist")
.description("Average distances from reference group"));
options->addOption(SelectionOption("reference")
.store(&refsel_).required()
- .description("Reference group to calculate distances from"));
+ .description("Reference group to calculate distances from"));*/
options->addOption(SelectionOption("select")
- .storeVector(&sel_).required().multiValue()
- .description("Groups to calculate distances to"));
+ .store(&selec).required()
+ .description("Atoms that are considered as part of the excluded volume"));
- options->addOption(DoubleOption("cutoff").store(&cutoff_)
+ /* options->addOption(DoubleOption("cutoff").store(&cutoff_)
.description("Cutoff for distance calculation (0 = no cutoff)"));
- settings->setFlag(TrajectoryAnalysisSettings::efRequireTop);
+ settings->setFlag(TrajectoryAnalysisSettings::efRequireTop);*/
}
+//domains -s '/home/toluk/Рабочий стол/reca_rd_2008/reca_rd.md.non-sol.tpr' -f '/home/toluk/Рабочий стол/reca_rd_2008/reca_rd.md.non-sol.xtc' -select 'name CA' -dt 100
void
AnalysisTemplate::initAnalysis(const TrajectoryAnalysisSettings &settings,
const TopologyInformation & /*top*/)
{
- nb_.setCutoff(cutoff_);
-
- data_.setColumnCount(0, sel_.size());
-
- avem_.reset(new AnalysisDataAverageModule());
- data_.addModule(avem_);
-
- if (!fnDist_.empty())
- {
- AnalysisDataPlotModulePointer plotm(
- new AnalysisDataPlotModule(settings.plotSettings()));
- plotm->setFileName(fnDist_);
- plotm->setTitle("Average distance");
- plotm->setXAxisIsTime();
- plotm->setYLabel("Distance (nm)");
- data_.addModule(plotm);
+ std::cout << "select start\n";
+ index.resize(0);
+ ConstArrayRef< int > atomind = selec.atomIndices();
+ for (ConstArrayRef< int >::iterator ai = atomind.begin(); (ai < atomind.end()); ai++) {
+ index.push_back(*ai);
}
+ std::cout << "select finish\n";
}
AnalysisTemplate::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
TrajectoryAnalysisModuleData *pdata)
{
- AnalysisDataHandle dh = pdata->dataHandle(data_);
- const Selection &refsel = pdata->parallelSelection(refsel_);
-
- AnalysisNeighborhoodSearch nbsearch = nb_.initSearch(pbc, refsel);
- dh.startFrame(frnr, fr.time);
- for (size_t g = 0; g < sel_.size(); ++g)
- {
- const Selection &sel = pdata->parallelSelection(sel_[g]);
- int nr = sel.posCount();
- real frave = 0.0;
- for (int i = 0; i < nr; ++i)
- {
- SelectionPosition p = sel.position(i);
- frave += nbsearch.minimumDistance(p.x());
- }
- frave /= nr;
- dh.setPoint(g, frave);
+ std::cout << "trajectory start\n";
+ trajectory.resize(frames + 1);
+ trajectory[frames].resize(index.size());
+ for (int i = 0; i < index.size(); i++) {
+ trajectory[frames][i] = fr.x[index[i]];
}
- dh.finishFrame();
+ frames++;
+ std::cout << "trajectory finish\n";
}
void
AnalysisTemplate::finishAnalysis(int /*nframes*/)
{
+ std::cout << "analys start\n";
+ for (int i = 0; i < index.size(); i++) {
+ fitting_pairs.push_back(std::make_pair (i, i));
+ }
+ long double noise_mid = 9000;
+ while (noise_mid > epsi) {
+ for (int i = 1; i < frames; i++) {
+ new_fit(trajectory[0], trajectory[i], fitting_pairs, index.size(), fitting_prec);
+ for (int j = 0; j < fitting_pairs.size(); j++) {
+ noise[fitting_pairs[j].first] += norm(trajectory[0][fitting_pairs[j].first] - trajectory[i][fitting_pairs[j].first]);
+ }
+ }
+ noise_mid = 0;
+ for (int i = 0; i < fitting_pairs.size(); i++) {
+ noise[fitting_pairs[i].first] /= (frames - 1);
+ noise_mid += noise[fitting_pairs[i].first];
+ }
+ noise_mid /= fitting_pairs.size();
+ for (int i = 0; i < fitting_pairs.size(); i++) {
+ if (noise[fitting_pairs[i].first] > noise_mid) {
+ fitting_pairs.erase(fitting_pairs.begin() + i);
+ i--;
+ }
+ }
+ }
+ std::cout << "analys finish\n";
}
void
AnalysisTemplate::writeOutput()
{
- // We print out the average of the mean distances for each group.
- for (size_t g = 0; g < sel_.size(); ++g)
- {
- fprintf(stderr, "Average mean distance for '%s': %.3f nm\n",
- sel_[g].name(), avem_->average(0, g));
+ std::cout << "output start\n";
+ for (int i = 0; i < fitting_pairs.size(); i++) {
+ std::cout << fitting_pairs[i].first << " ";
}
+ std::cout << "output finish\n";
}
/*! \brief