Skip to content

Commit

Permalink
Fix to align and displace values output by pathtools
Browse files Browse the repository at this point in the history
Previously, pathtools ignored the align and displace values that the user provided in input pdb files when outputting the finalized path.
These values are now output in this updated version of the tool
  • Loading branch information
Gareth Aneurin Tribello committed Aug 6, 2024
1 parent e93ff70 commit 7201111
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
7 changes: 6 additions & 1 deletion src/generic/DumpPDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class DumpPDB :
std::string fmt;
std::string file;
std::string description;
std::vector<double> beta, occupancy;
std::vector<std::string> argnames;
std::vector<AtomNumber> pdb_atom_indices;
void buildArgnames();
Expand All @@ -70,6 +71,8 @@ void DumpPDB::registerKeywords( Keywords& keys ) {
keys.add("compulsory","STRIDE","0","the frequency with which the atoms should be output");
keys.add("compulsory","FILE","the name of the file on which to output these quantities");
keys.add("compulsory","FMT","%f","the format that should be used to output real numbers");
keys.add("compulsory","OCCUPANCY","1.0","vector of values to output in the occupancy column of the pdb file");
keys.add("compulsory","BETA","1.0","vector of values to output in the beta column of the pdb file");
keys.add("optional","DESCRIPTION","the title to use for your PDB output");
keys.add("optional","ATOM_INDICES","the indices of the atoms in your PDB output");
keys.add("optional","ARG_NAMES","the names of the arguments that are being output");
Expand All @@ -94,6 +97,8 @@ DumpPDB::DumpPDB(const ActionOptions&ao):
for(unsigned i=0; i<indices.size(); ++i) log.printf("%d ", pdb_atom_indices[i].serial() );
log.printf("\n");
if( pdb_atom_indices.size()!=atom_args[0]->getShape()[1]/3 ) error("mismatch between size of matrix containing positions and vector of atom indices");
beta.resize( atom_args[0]->getShape()[1]/3 ); occupancy.resize( atom_args[0]->getShape()[1]/3 );
parseVector("OCCUPANCY", occupancy ); parseVector("BETA", beta );
}
log.printf(" printing configurations to PDB file to file named %s \n", file.c_str() );
parseVector("ARG_NAMES",argnames); if( argnames.size()==0 ) buildArgnames();
Expand Down Expand Up @@ -172,7 +177,7 @@ void DumpPDB::update() {
pos[0]=getPntrToArgument(atomarg)->get(npos*(3*i+0) + k);
pos[1]=getPntrToArgument(atomarg)->get(npos*(3*i+1) + k);
pos[2]=getPntrToArgument(atomarg)->get(npos*(3*i+2) + k);
printAtom( opdbf, pdb_atom_indices[k].serial(), pos, 1.0, 1.0 );
printAtom( opdbf, pdb_atom_indices[k].serial(), pos, occupancy[k], beta[k] );
}
}
opdbf.printf("END\n");
Expand Down
14 changes: 12 additions & 2 deletions src/mapping/PathTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,12 @@ int PathTools::main(FILE* in, FILE*out,Communicator& pc) {
std::string pinput="DUMPPDB STRIDE=1 DESCRIPTION=PATH FILE=" + ofilename + " FMT=" + ofmt;
if( argstr.size()>0 ) {
pinput += " ARG=" + argstr[0]; for(unsigned i=1; i<argstr.size(); ++i ) pinput += "," + argstr[i];
} else { std::string num; Tools::convert( indices[0].serial(), num ); pinput += " ATOMS=data ATOM_INDICES=" + num; for(unsigned i=1; i<indices.size(); ++i ) { Tools::convert( indices[i].serial(), num ); pinput += "," + num; } }
} else {
std::string num; Tools::convert( indices[0].serial(), num ); pinput += " ATOMS=data ATOM_INDICES=" + num; for(unsigned i=1; i<indices.size(); ++i ) { Tools::convert( indices[i].serial(), num ); pinput += "," + num; }
std::string anum, dnum; Tools::convert( alig[0], anum ); Tools::convert( disp[0], dnum );
pinput += " OCCUPANCY=" + anum; for(unsigned i=1; i<alig.size(); ++i) { Tools::convert( alig[i], anum ); pinput += "," + anum; }
pinput += " BETA=" + dnum; for(unsigned i=1; i<disp.size(); ++i) { Tools::convert( disp[i], dnum ); pinput += "," + dnum; }
}
const char* pcinp=pinput.c_str(); plmd.cmd("readInputLine",pcinp);
Action* paction = plmd.getActionSet()[plmd.getActionSet().size()-1].get();
paction->update();
Expand Down Expand Up @@ -271,11 +276,13 @@ int PathTools::main(FILE* in, FILE*out,Communicator& pc) {
}

// Now create the metric object
std::vector<double> alig, disp;
if( mtype=="OPTIMAL-FAST" || mtype=="OPTIMAL" || mtype=="SIMPLE" ) {
std::string trinput = "endT: TRANSPOSE ARG=end";
const char* tinp=trinput.c_str(); plmd.cmd("readInputLine",tinp);
PDB pdb; pdb.read(istart,false,0.1);
std::vector<double> alig( pdb.getOccupancy() ), disp( pdb.getBeta() );
alig.resize( pdb.getOccupancy().size() ); disp.resize( pdb.getBeta().size() );
for(unsigned i=0; i<alig.size(); ++i) { alig[i] = pdb.getOccupancy()[i]; disp[i]= pdb.getBeta()[i]; }
std::string minput = "d: RMSD_VECTOR DISPLACEMENT SQUARED UNORMALIZED TYPE=" + mtype + " ARG=endT,start";
// Get the align values
std::string anum; Tools::convert( alig[0], anum ); minput += " ALIGN=" + anum;
Expand Down Expand Up @@ -354,6 +361,9 @@ int PathTools::main(FILE* in, FILE*out,Communicator& pc) {
}
const char* icinp=inpt.c_str(); plmd.cmd("readInputLine",icinp); std::string num; Tools::convert( indices[0].serial(), num );
pinput += " ATOMS=atom_data ATOM_INDICES=" + num; for(unsigned i=1; i<indices.size(); ++i ) { Tools::convert( indices[i].serial(), num ); pinput += "," + num; }
std::string anum, dnum; Tools::convert( alig[0], anum ); Tools::convert( disp[0], dnum );
pinput += " OCCUPANCY=" + anum; for(unsigned i=1; i<alig.size(); ++i) { Tools::convert( alig[i], anum ); pinput += "," + anum; }
pinput += " BETA=" + dnum; for(unsigned i=1; i<disp.size(); ++i) { Tools::convert( disp[i], dnum ); pinput += "," + dnum; }
}
const char* pcinp=pinput.c_str(); plmd.cmd("readInputLine",pcinp);
Action* paction = plmd.getActionSet()[plmd.getActionSet().size()-1].get();
Expand Down

1 comment on commit 7201111

@PlumedBot
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found broken examples in automatic/ANGLES.tmp
Found broken examples in automatic/ANN.tmp
Found broken examples in automatic/CAVITY.tmp
Found broken examples in automatic/CLASSICAL_MDS.tmp
Found broken examples in automatic/CLUSTER_DIAMETER.tmp
Found broken examples in automatic/CLUSTER_DISTRIBUTION.tmp
Found broken examples in automatic/CLUSTER_PROPERTIES.tmp
Found broken examples in automatic/CONSTANT.tmp
Found broken examples in automatic/CONTACT_MATRIX.tmp
Found broken examples in automatic/CONTACT_MATRIX_PROPER.tmp
Found broken examples in automatic/COORDINATIONNUMBER.tmp
Found broken examples in automatic/DFSCLUSTERING.tmp
Found broken examples in automatic/DISTANCE_FROM_CONTOUR.tmp
Found broken examples in automatic/EDS.tmp
Found broken examples in automatic/EMMI.tmp
Found broken examples in automatic/ENVIRONMENTSIMILARITY.tmp
Found broken examples in automatic/FIND_CONTOUR.tmp
Found broken examples in automatic/FIND_CONTOUR_SURFACE.tmp
Found broken examples in automatic/FIND_SPHERICAL_CONTOUR.tmp
Found broken examples in automatic/FOURIER_TRANSFORM.tmp
Found broken examples in automatic/FUNCPATHGENERAL.tmp
Found broken examples in automatic/FUNCPATHMSD.tmp
Found broken examples in automatic/FUNNEL.tmp
Found broken examples in automatic/FUNNEL_PS.tmp
Found broken examples in automatic/GHBFIX.tmp
Found broken examples in automatic/GPROPERTYMAP.tmp
Found broken examples in automatic/HBOND_MATRIX.tmp
Found broken examples in automatic/INCLUDE.tmp
Found broken examples in automatic/INCYLINDER.tmp
Found broken examples in automatic/INENVELOPE.tmp
Found broken examples in automatic/INTERPOLATE_GRID.tmp
Found broken examples in automatic/LOCAL_AVERAGE.tmp
Found broken examples in automatic/MAZE_OPTIMIZER_BIAS.tmp
Found broken examples in automatic/MAZE_RANDOM_ACCELERATION_MD.tmp
Found broken examples in automatic/MAZE_SIMULATED_ANNEALING.tmp
Found broken examples in automatic/MAZE_STEERED_MD.tmp
Found broken examples in automatic/METATENSOR.tmp
Found broken examples in automatic/MULTICOLVARDENS.tmp
Found broken examples in automatic/OUTPUT_CLUSTER.tmp
Found broken examples in automatic/PAMM.tmp
Found broken examples in automatic/PCA.tmp
Found broken examples in automatic/PCAVARS.tmp
Found broken examples in automatic/PIV.tmp
Found broken examples in automatic/PLUMED.tmp
Found broken examples in automatic/PYCVINTERFACE.tmp
Found broken examples in automatic/PYTHONFUNCTION.tmp
Found broken examples in automatic/Q3.tmp
Found broken examples in automatic/Q4.tmp
Found broken examples in automatic/Q6.tmp
Found broken examples in automatic/QUATERNION.tmp
Found broken examples in automatic/SIZESHAPE_POSITION_LINEAR_PROJ.tmp
Found broken examples in automatic/SIZESHAPE_POSITION_MAHA_DIST.tmp
Found broken examples in automatic/SPRINT.tmp
Found broken examples in automatic/TETRAHEDRALPORE.tmp
Found broken examples in automatic/TORSIONS.tmp
Found broken examples in automatic/WHAM_WEIGHTS.tmp
Found broken examples in AnalysisPP.md
Found broken examples in CollectiveVariablesPP.md
Found broken examples in MiscelaneousPP.md

Please sign in to comment.