Skip to content
Snippets Groups Projects
Commit 29c331bc authored by Valerio Mariani's avatar Valerio Mariani
Browse files

Sequence separation support for lddt + multiple chain warning

parent 284a63e9
No related branches found
No related tags found
No related merge requests found
......@@ -53,6 +53,9 @@ EntityHandle load(const String& file, const IOProfile& profile)
reader.Import(ent);
conop::Conopology& conop_inst=conop::Conopology::Instance();
conop_inst.ConnectAll(conop_inst.GetBuilder(), ent);
if (ent.GetChainList().size()!=1) {
std::cout << "WARNING: File " << file << "has more than one chain" << std::endl;
}
return ent;
}
std::cerr << "ERROR: '" << file << "' does not contain any ATOM records. "
......@@ -78,6 +81,7 @@ void usage()
std::cerr << " -a <value> tolerance in stddevs for angles" << std::endl;
std::cerr << " -m <value> clashing distance for unknwon atom types" << std::endl;
std::cerr << " -r <value> distance inclusion radius" << std::endl;
std::cerr << " -i <value> sequence separation" << std::endl;
std::cerr << " -e print version" << std::endl;
}
......@@ -108,6 +112,7 @@ int main (int argc, char **argv)
Real bond_tolerance = 8.0;
Real angle_tolerance = 8.0;
Real radius=15.0;
int sequence_separation = 0;
// creates the required loading profile
IOProfile profile;
......@@ -128,6 +133,7 @@ int main (int argc, char **argv)
("bond_tolerance,b", po::value<Real>(), "tolerance in stddev for bonds")
("angle_tolerance,a", po::value<Real>(), "tolerance in stddev for angles")
("inclusion_radius,r", po::value<Real>(), "distance inclusion radius")
("sequence_separation,i", po::value<int>(), "sequence separation")
("files", po::value< std::vector<String> >(), "input file(s)")
("reference",po::value<String>(),"reference(s)")
;
......@@ -197,7 +203,10 @@ int main (int argc, char **argv)
if (vm.count("inclusion_radius")) {
radius=vm["inclusion_radius"].as<Real>();
}
if (vm.count("sequence_separation")) {
sequence_separation=vm["sequence_separation"].as<int>();
}
std::vector<Real> cutoffs;
cutoffs.push_back(0.5);
cutoffs.push_back(1.0);
......@@ -231,7 +240,7 @@ int main (int argc, char **argv)
}
ref_list.push_back(ref.CreateFullView());
}
glob_dist_list = CreateDistanceListFromMultipleReferences (ref_list,cutoffs,radius);
glob_dist_list = CreateDistanceListFromMultipleReferences (ref_list,cutoffs,sequence_separation,radius);
}
files.pop_back();
......@@ -243,6 +252,7 @@ int main (int argc, char **argv)
std::cout << "Stereo-chemical and steric clash checks: Off " << std::endl;
}
std::cout << "Inclusion Radius: " << radius << std::endl;
std::cout << "Sequence separation: " << sequence_separation << std::endl;
if (structural_checks) {
std::cout << "Parameter filename: " << parameter_filename << std::endl;
std::cout << "Tolerance in stddevs for bonds: " << bond_tolerance << std::endl;
......@@ -334,7 +344,7 @@ int main (int argc, char **argv)
// computes the lddt score
String label="localldt";
std::pair<int,int> total_ov=alg::LocalDistDiffTest(v, glob_dist_list, cutoffs, label);
std::pair<int,int> total_ov=alg::LocalDistDiffTest(v, glob_dist_list, cutoffs, sequence_separation, label);
Real lddt = static_cast<Real>(total_ov.first)/(static_cast<Real>(total_ov.second) ? static_cast<Real>(total_ov.second) : 1);
std::cout << "Global LDDT score: " << lddt << std::endl;
std::cout << "(" << std::fixed << total_ov.first << " conserved distances in the model out of " << total_ov.second << " checked)" << std::endl;
......
......@@ -79,7 +79,7 @@ std::pair<bool,Real> within_tolerance(Real mdl_dist, std::pair<Real,Real>& value
// helper function
std::pair<long int, long int> calc_overlap1(const ResidueRDMap& res_distance_list, const ResNum& rnum,
ChainView mdl_chain,
ChainView mdl_chain, int sequence_separation,
std::vector<Real>& tol_list, bool only_fixed,
bool swap,std::vector<std::pair<long int, long int> >& overlap_list, bool log )
{
......@@ -94,7 +94,7 @@ std::pair<long int, long int> calc_overlap1(const ResidueRDMap& res_distance_lis
AtomView av1=mdl_res ? mdl_res.FindAtom(name) : AtomView();
if (only_fixed) {
if (first_atom.GetResNum()==second_atom.GetResNum()) {
if (std::abs(first_atom.GetResNum().GetNum()-second_atom.GetResNum().GetNum())<sequence_separation) {
continue;
}
if (swappable(second_atom.GetResidueName(), second_atom.GetAtomName())) {
......@@ -102,7 +102,7 @@ std::pair<long int, long int> calc_overlap1(const ResidueRDMap& res_distance_lis
}
}
if (!only_fixed) {
if (first_atom.GetResNum()<=second_atom.GetResNum()) {
if (first_atom.GetResNum().GetNum()<=(second_atom.GetResNum().GetNum()+sequence_separation)) {
continue;
}
}
......@@ -232,7 +232,7 @@ std::pair<Real, Real> calc_overlap2(const seq::ConstSequenceHandle& ref_seq,
// for each residue with multiple possible nomenclature conventions, checks which choice (switched or not)
// of atom nomenclature gives the highest lddt score then changes the naming convention of the input
// entity view accordingly
void check_and_swap(const GlobalRDMap& glob_dist_list, const EntityView& mdl, std::vector<Real> cutoff_list, std::vector<std::pair<long int, long int> > overlap_list)
void check_and_swap(const GlobalRDMap& glob_dist_list, const EntityView& mdl, std::vector<Real> cutoff_list, int sequence_separation, std::vector<std::pair<long int, long int> > overlap_list)
{
ChainView mdl_chain=mdl.GetChainList()[0];
XCSEditor edi=mdl.GetHandle().EditXCS(BUFFERED_EDIT);
......@@ -249,11 +249,11 @@ void check_and_swap(const GlobalRDMap& glob_dist_list, const EntityView& mdl, st
if (!(rname=="GLU" || rname=="ASP" || rname=="VAL" || rname=="TYR" || rname=="PHE" || rname=="LYS" || rname=="ARG")) {
continue;
}
std::pair<Real, Real> ov1=calc_overlap1(i->second, rnum,mdl_chain,
std::pair<Real, Real> ov1=calc_overlap1(i->second, rnum,mdl_chain, sequence_separation,
cutoff_list, true,
false, overlap_list,false);
std::pair<Real, Real> ov2=calc_overlap1(i->second, rnum, mdl_chain,
std::pair<Real, Real> ov2=calc_overlap1(i->second, rnum, mdl_chain, sequence_separation,
cutoff_list, true,
true, overlap_list,false);
......@@ -472,7 +472,7 @@ GlobalRDMap CreateDistanceList(const EntityView& ref,Real max_dist)
return dist_list;
}
GlobalRDMap CreateDistanceListFromMultipleReferences(const std::vector<EntityView>& ref_list, std::vector<Real>& cutoff_list, Real max_dist)
GlobalRDMap CreateDistanceListFromMultipleReferences(const std::vector<EntityView>& ref_list, std::vector<Real>& cutoff_list, int sequence_separation, Real max_dist)
{
int ref_counter=0;
ExistenceMap ex_map;
......@@ -482,7 +482,7 @@ GlobalRDMap CreateDistanceListFromMultipleReferences(const std::vector<EntityVie
for (std::vector<EntityView>::const_iterator ref_list_it=ref_list.begin()+1;ref_list_it!=ref_list.end();++ref_list_it) {
EntityView ref = *ref_list_it;
std::vector<std::pair<long int, long int> > overlap_list(ref.GetResidueCount(), std::pair<long int, long int>(0, 0));
check_and_swap(glob_dist_list,ref,cutoff_list,overlap_list);
check_and_swap(glob_dist_list,ref,cutoff_list,sequence_separation,overlap_list);
GlobalRDMap new_dist_list=CreateDistanceList(ref,max_dist);
merge_distance_lists(glob_dist_list,new_dist_list,ex_map,ref,ref_counter);
update_existence_map (ex_map,ref,ref_counter);
......@@ -514,7 +514,7 @@ void PrintGlobalRDMap(const GlobalRDMap& glob_dist_list){
std::pair<long int,long int> LocalDistDiffTest(const EntityView& mdl, const GlobalRDMap& glob_dist_list,
std::vector<Real> cutoff_list, const String& local_lddt_property_string)
std::vector<Real> cutoff_list, int sequence_separation, const String& local_lddt_property_string)
{
if (!mdl.GetResidueCount()) {
LOG_WARNING("model structures doesn't contain any residues");
......@@ -525,14 +525,14 @@ std::pair<long int,long int> LocalDistDiffTest(const EntityView& mdl, const Glob
return std::make_pair<long int,long int>(0,0);
}
std::vector<std::pair<long int, long int> > overlap_list(mdl.GetResidueCount(), std::pair<long int, long int>(0, 0));
check_and_swap(glob_dist_list,mdl,cutoff_list,overlap_list);
check_and_swap(glob_dist_list,mdl,cutoff_list,sequence_separation,overlap_list);
ChainView mdl_chain=mdl.GetChainList()[0];
overlap_list.clear();
std::pair<long int, long int> total_ov(0, 0);
for (GlobalRDMap::const_iterator i=glob_dist_list.begin(), e=glob_dist_list.end(); i!=e; ++i) {
ResNum rn = i->first;
if (i->second.size()!=0) {
std::pair<long int, long int> ov1=calc_overlap1(i->second, rn, mdl_chain, cutoff_list,
std::pair<long int, long int> ov1=calc_overlap1(i->second, rn, mdl_chain, sequence_separation, cutoff_list,
false, false, overlap_list,true);
total_ov.first+=ov1.first;
total_ov.second+=ov1.second;
......@@ -557,7 +557,8 @@ Real LocalDistDiffTest(const EntityView& mdl, const EntityView& target, Real cut
std::vector<Real> cutoffs;
cutoffs.push_back(cutoff);
GlobalRDMap glob_dist_list = CreateDistanceList(target,max_dist);
std::pair<long int,long int> total_ov = LocalDistDiffTest(mdl, glob_dist_list, cutoffs, local_lddt_property_string);
int sequence_separation = 0;
std::pair<long int,long int> total_ov = LocalDistDiffTest(mdl, glob_dist_list, cutoffs, sequence_separation, local_lddt_property_string);
return static_cast<Real>(total_ov.first)/(static_cast<Real>(total_ov.second) ? static_cast<Real>(total_ov.second) : 1);
}
......@@ -612,7 +613,7 @@ Real LocalDistDiffTest(const ost::seq::AlignmentHandle& aln,
return total_ov.first/(total_ov.second ? total_ov.second : 1);
}
Real LDDTHA(EntityView& v, const GlobalRDMap& global_dist_list)
Real LDDTHA(EntityView& v, const GlobalRDMap& global_dist_list, int sequence_separation)
{
std::vector<Real> cutoffs;
cutoffs.push_back(0.5);
......@@ -620,10 +621,11 @@ Real LDDTHA(EntityView& v, const GlobalRDMap& global_dist_list)
cutoffs.push_back(2.0);
cutoffs.push_back(4.0);
String label="locallddt";
std::pair<long int,long int> total_ov=alg::LocalDistDiffTest(v, global_dist_list, cutoffs, label);
std::pair<long int,long int> total_ov=alg::LocalDistDiffTest(v, global_dist_list, cutoffs, sequence_separation, label);
return static_cast<Real>(total_ov.first)/(static_cast<Real>(total_ov.second) ? static_cast<Real>(total_ov.second) : 1);
}
// debugging code
/*
Real OldStyleLDDTHA(EntityView& v, const GlobalRDMap& global_dist_list)
{
......
......@@ -95,7 +95,8 @@ typedef std::map<UniqueAtomIdentifier,int> ExistenceMap;
/// int properties named <string>_conserved and <string>_total.
std::pair<long int,long int> DLLEXPORT_OST_MOL_ALG LocalDistDiffTest(const EntityView& mdl,
const GlobalRDMap& dist_list,
std::vector<Real> cutoff_list,
std::vector<Real> cutoff_list,
int sequence_separation = 0,
const String& local_ldt_property_string="");
/// \brief Calculates the Local Distance Difference Score for a given model with respect to a given target
......@@ -131,7 +132,7 @@ Real DLLEXPORT_OST_MOL_ALG LocalDistDiffTest(const ost::seq::AlignmentHandle& al
///
/// Computes the Local Distance Difference High-Accuracy Test (with threshold 0.5,1,2 and 4 Angstrom)
/// Requires a list of distances to check and a model for which the score is computed
Real DLLEXPORT_OST_MOL_ALG LDDTHA(EntityView& v, const GlobalRDMap& global_dist_list);
Real DLLEXPORT_OST_MOL_ALG LDDTHA(EntityView& v, const GlobalRDMap& global_dist_list, int sequence_separation=0);
/// \brief Creates a list of distances to check during a Local Difference Distance Test
///
......@@ -144,7 +145,7 @@ GlobalRDMap CreateDistanceList(const EntityView& ref,Real max_dist);
/// than the inclusion radius in all structures in which the two atoms are present, it will be included in the list
/// However, if the distance is longer than the inclusion radius in at least one of the structures, it
/// will not be considered a local interaction and will be exluded from the list
GlobalRDMap CreateDistanceListFromMultipleReferences(const std::vector<EntityView>& ref_list,std::vector<Real>& cutoff_list, Real max_dist);
GlobalRDMap CreateDistanceListFromMultipleReferences(const std::vector<EntityView>& ref_list,std::vector<Real>& cutoff_list, int sequence_separation, Real max_dist);
/// \brief Prints all distances in a global distance list to standard output
void PrintGlobalRDMap(const GlobalRDMap& glob_dist_list);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment