本文整理汇总了C++中Molecule::frame方法的典型用法代码示例。如果您正苦于以下问题:C++ Molecule::frame方法的具体用法?C++ Molecule::frame怎么用?C++ Molecule::frame使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Molecule
的用法示例。
在下文中一共展示了Molecule::frame方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: measure_pbc2onc
// Compute matrix that transforms coordinates from an arbitrary PBC cell
// into an orthonormal unitcell. Since the cell origin is not stored by VMD
// you have to specify it.
int measure_pbc2onc(MoleculeList *mlist, int molid, int frame, const float origin[3], Matrix4 &transform) {
int orig_ts, max_ts;
Molecule *mol = mlist->mol_from_id(molid);
if( !mol )
return MEASURE_ERR_NOMOLECULE;
// get current frame number and make sure there are frames
if((orig_ts = mol->frame()) < 0)
return MEASURE_ERR_NOFRAMES;
// get the max frame number and determine frame range
max_ts = mol->numframes()-1;
if (frame==-2) frame = orig_ts;
else if (frame>max_ts || frame==-1) frame = max_ts;
Timestep *ts = mol->get_frame(frame);
Matrix4 AA, BB, CC;
ts->get_transforms(AA, BB, CC);
// Construct the cell spanning vectors
float cell[9];
cell[0] = AA.mat[12];
cell[1] = AA.mat[13];
cell[2] = AA.mat[14];
cell[3] = BB.mat[12];
cell[4] = BB.mat[13];
cell[5] = BB.mat[14];
cell[6] = CC.mat[12];
cell[7] = CC.mat[13];
cell[8] = CC.mat[14];
get_transform_to_orthonormal_cell(cell, origin, transform);
return MEASURE_NOERR;
}
示例2: measure_pbc_neighbors
int measure_pbc_neighbors(MoleculeList *mlist, AtomSel *sel, int molid,
int frame, const Matrix4 *alignment,
const float *center, const float *cutoff, const float *box,
ResizeArray<float> *extcoord_array,
ResizeArray<int> *indexmap_array) {
int orig_ts, max_ts;
if (!box && !cutoff[0] && !cutoff[1] && !cutoff[2]) return MEASURE_NOERR;
Molecule *mol = mlist->mol_from_id(molid);
if( !mol )
return MEASURE_ERR_NOMOLECULE;
// get current frame number and make sure there are frames
if((orig_ts = mol->frame()) < 0)
return MEASURE_ERR_NOFRAMES;
// get the max frame number and determine current frame
max_ts = mol->numframes()-1;
if (frame==-2) frame = orig_ts;
else if (frame>max_ts || frame==-1) frame = max_ts;
Timestep *ts = mol->get_frame(frame);
if (!ts) return MEASURE_ERR_NOMOLECULE;
// Get the displacement vectors (in form of translation matrices)
Matrix4 Tpbc[3][2];
ts->get_transforms(Tpbc[0][1], Tpbc[1][1], Tpbc[2][1]);
// Assign the negative cell translation vectors
Tpbc[0][0] = Tpbc[0][1];
Tpbc[1][0] = Tpbc[1][1];
Tpbc[2][0] = Tpbc[2][1];
Tpbc[0][0].inverse();
Tpbc[1][0].inverse();
Tpbc[2][0].inverse();
// Construct the cell spanning vectors
float cell[9];
cell[0] = Tpbc[0][1].mat[12];
cell[1] = Tpbc[0][1].mat[13];
cell[2] = Tpbc[0][1].mat[14];
cell[3] = Tpbc[1][1].mat[12];
cell[4] = Tpbc[1][1].mat[13];
cell[5] = Tpbc[1][1].mat[14];
cell[6] = Tpbc[2][1].mat[12];
cell[7] = Tpbc[2][1].mat[13];
cell[8] = Tpbc[2][1].mat[14];
float len[3];
len[0] = sqrtf(dot_prod(&cell[0], &cell[0]));
len[1] = sqrtf(dot_prod(&cell[3], &cell[3]));
len[2] = sqrtf(dot_prod(&cell[6], &cell[6]));
//printf("len={%.3f %.3f %.3f}\n", len[0], len[1], len[2]);
int i;
float minlen = len[0];
if (len[1] && len[1]<minlen) minlen = len[1];
if (len[2] && len[2]<minlen) minlen = len[2];
minlen--;
// The algorithm works only for atoms in adjacent neighbor cells.
if (!box && (cutoff[0]>=len[0] || cutoff[1]>=len[1] || cutoff[2]>=len[2])) {
return MEASURE_ERR_BADCUTOFF;
}
bool bigrim = 1;
float corecell[9];
float diag[3];
float origin[3];
memset(origin, 0, 3*sizeof(float));
Matrix4 M_norm;
if (box) {
// Get the matrix M_norm that transforms all atoms inside the
// unit cell into the normalized unitcell spanned by
// {1/len[0] 0 0} {0 1/len[1] 0} {0 0 1/len[2]}.
bigrim = 1;
float vtmp[3];
vec_add(vtmp, &cell[0], &cell[3]);
vec_add(diag, &cell[6], vtmp);
//printf("diag={%.3f %.3f %.3f}\n", diag[0], diag[1], diag[2]);
// Finally we need to apply the translation of the cell origin
vec_copy(origin, center);
vec_scaled_add(origin, -0.5, &cell[0]);
vec_scaled_add(origin, -0.5, &cell[3]);
vec_scaled_add(origin, -0.5, &cell[6]);
vec_negate(origin, origin);
//printf("origin={%.3f %.3f %.3f}\n", origin[0], origin[1], origin[2]);
} else if (2.0f*cutoff[0]<minlen && 2.0f*cutoff[1]<minlen && 2.0f*cutoff[2]<minlen) {
// The cutoff must not be larger than half of the smallest cell dimension
// otherwise we would have to use a less efficient algorithm.
// Get the matrix M_norm that transforms all atoms inside the
// corecell into the orthonormal unitcell spanned by {1 0 0} {0 1 0} {0 0 1}.
// The corecell ist the pbc cell minus cutoffs for each dimension.
vec_scale(&corecell[0], (len[0]-cutoff[0])/len[0], &cell[0]);
vec_scale(&corecell[3], (len[1]-cutoff[1])/len[1], &cell[3]);
//.........这里部分代码省略.........