33 OptimalAlignment::OptimalAlignment(
const std::vector<double> & align,
const std::vector<double> & displace,
const std::vector<Vector> & p0,
const std::vector<Vector> & p1 ,
Log* &log )
48 if(p0.size() != p1.size()){
49 (this->
log)->printf(
"THE SIZE OF THE TWO FRAMES TO BE ALIGNED ARE DIFFERENT\n");
53 for (
unsigned i=0;i<align.size();i++ ){
54 if(align[i]!=displace[i] || align[i]!=1.0)
fast=
false;
114 #ifdef __INTEL_COMPILER
115 #pragma intel optimization_level 2
119 double tmp0,tmp1,walign,wdisplace,const1,ret;
120 unsigned i,k,l,
m,
n,o,oo,mm;
122 unsigned natoms=
p0.size();
133 for(i=0;i<natoms;i++){
139 vector<int> alignmap;
140 for(i=0;i<natoms;i++){
142 alignmap.push_back(i);
145 if (
align[i]<0.){cerr<<
"FOUND ALIGNMENT WEIGHT NEGATIVE!"<<endl;exit(0);};
149 vector<int> displacemap;
150 for(i=0;i<natoms;i++){
152 displacemap.push_back(i);
155 if (
displace[i]<0.){cerr<<
"FOUND ALIGNMENT WEIGHT NEGATIVE!"<<endl;exit(0);};
161 vector<Vector> array_n_3;
162 array_n_3.resize(natoms);
163 for(i=0;i<array_n_3.size();i++)array_n_3[i][0]=array_n_3[i][1]=array_n_3[i][2]=0.;
169 for(k=0;k<natoms;k++){
182 array_n_3[k][l]=tmp1;
195 for(k=0;k<natoms;k++){
198 tmp1 =2.*array_n_3[k][l]*
displace[k]/wdisplace ;
200 const1=2.*
align[k]/(walign*wdisplace);
203 for(oo=0;oo<displacemap.size();oo++){
205 tmp1 -=const1*array_n_3[o][l]*
displace[o];
209 for(mm=0;mm<displacemap.size();mm++){
215 int ind=n*3*3*natoms+o*3*natoms+l*natoms+k;
218 tmp0*=-const1*array_n_3[
m][
n];
231 bool do_frameref_der=
true;
249 for(k=0;k<natoms;k++){
256 for(mm=0;mm<displacemap.size();mm++){
262 int ind=n*3*3*natoms+o*3*natoms+l*natoms+k;
265 tmp0*=-const1*array_n_3[
m][
n];
275 tmp1+=-tmp0*2.*
displace[k]/wdisplace;
279 for(mm=0;mm<displacemap.size();mm++){
285 tmp1 += tmp0*2.*
align[k]/(walign*wdisplace);
297 for(
unsigned i=0;i<natoms;i++){
315 log->
printf(
"Entering rmsd finite difference test system\n ");
316 log->
printf(
"RMSD OR MSD: %s\n",(rmsd)?
"rmsd":
"msd");
317 log->
printf(
"-------------------------------------------\n");
318 log->
printf(
"TEST1: derivative of the value (derr_dr0/derr_dr1)\n");
320 double step=1.e-8,olderr,
delta,err;
321 vector<Vector> fakederivatives;
322 fakederivatives.resize(
p0.size());
343 log->
printf(
"INITIAL ERROR VALUE: %e\n",olderr);
348 for(
unsigned j=0;j<3;j++){
349 for(
unsigned i=0;i<
derrdp0.size();i++){
351 delta=(rnd.
RandU01()-0.5)*2*step;
359 log->
printf(
"TESTING: X %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,
derrdp0[i][j],(err-olderr)/delta,
derrdp0[i][j]-(err-olderr)/delta,
displace[i],
align[i]);
break;
361 log->
printf(
"TESTING: Y %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,
derrdp0[i][j],(err-olderr)/delta,
derrdp0[i][j]-(err-olderr)/delta,
displace[i],
align[i]);
break;
363 log->
printf(
"TESTING: Z %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,
derrdp0[i][j],(err-olderr)/delta,
derrdp0[i][j]-(err-olderr)/delta,
displace[i],
align[i]);
break;
370 for(
unsigned j=0;j<3;j++){
371 for(
unsigned i=0;i<
derrdp1.size();i++){
373 delta=(rnd.
RandU01()-0.5)*2*step;
381 log->
printf(
"TESTING: X %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,
derrdp1[i][j],(err-olderr)/delta,
derrdp1[i][j]-(err-olderr)/delta,
displace[i],
align[i]);
break;
383 log->
printf(
"TESTING: Y %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,
derrdp1[i][j],(err-olderr)/delta,
derrdp1[i][j]-(err-olderr)/delta,
displace[i],
align[i]);
break;
385 log->
printf(
"TESTING: Z %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,
derrdp1[i][j],(err-olderr)/delta,
derrdp1[i][j]-(err-olderr)/delta,
displace[i],
align[i]);
break;
std::vector< double > dmatdp1
double weightedFindiffTest(bool rmsd)
double calculate(bool rmsd, std::vector< Vector > &derivatives)
this does the real calculation
void assignP0(const std::vector< Vector > &p0)
assignment of the running frame p0
std::vector< Vector > p0
position of one frame (generally the MD)
void assignP1(const std::vector< Vector > &p1)
assignment to the reference frame p1
void assignDisplace(const std::vector< double > &displace)
std::vector< Vector > p1
position of the reference frames
Class containing the log stream.
std::vector< Vector > p1reset
position resetted wrt coms p1
Kearsley * mykearsley
a pointer to the object that performs the optimal alignment via quaternions
std::vector< Vector > derrdp1
derivatives: derivative of the error respect p1
std::vector< double > align
alignment vector: a double that says if the atom has to be used in reset COM and makeing the alignmen...
void assignP0(const std::vector< Vector > &p0)
switch the assignment of the structure p0 (e.g. at each md step)
double calculate(bool rmsd)
int printf(const char *fmt,...)
Formatted output with explicit format - a la printf.
VectorGeneric< n > delta(const VectorGeneric< n > &v1, const VectorGeneric< n > &v2)
std::vector< Vector > p0reset
position resetted wrt coms p0
double weightedAlignment(bool rmsd)
this should perform the weighted alignment
void assignAlign(const std::vector< double > &align)
void assignP1(const std::vector< Vector > &p1)
derivatives: derivative of the error respect p1
std::vector< double > displace
displacement vector : a double that says if the coordinate should be used in calculating the RMSD/MSD...
bool fast
a bool that decides to make the fast version (alignment vec= displacement vec) or the slower case ...
std::vector< Vector > derrdp0
derivatives of the error respect to the p0 (MD running frame)
std::vector< Vector > derrdp1
derivatives of the error respect to the p1 (static frame, do not remove: useful for SM) ...
~OptimalAlignment()
the destructor: delete kearsley
void assignAlign(const std::vector< double > &align)
transfer the alignment vector
std::vector< double > dmatdp0
derivative of the rotation matrix note the dimension 3x3 x 3 x N
Tensor rotmat0on1
rotation matrices p0 on p1 and reverse (p1 over p0)
std::vector< Vector > derrdp0
derivatives: derivative of the error respect p0
Log * log
the pointer to the logfile