From dbdf6721134eb282b4a14caabcbc9ed45fe10754 Mon Sep 17 00:00:00 2001 From: Gerardo Tauriello <gerardo.tauriello@unibas.ch> Date: Wed, 20 Sep 2017 15:16:20 +0200 Subject: [PATCH] SCHWED-1740: test multi-loop handling for SidechainReconstructor --- modelling/src/sidechain_reconstructor.hh | 6 +- modelling/tests/data/1crn_sc_test.pdb | 275 ------------------ .../tests/test_sidechain_reconstructor.cc | 80 ++++- 3 files changed, 70 insertions(+), 291 deletions(-) diff --git a/modelling/src/sidechain_reconstructor.hh b/modelling/src/sidechain_reconstructor.hh index abe8be22..6c1a4ac0 100644 --- a/modelling/src/sidechain_reconstructor.hh +++ b/modelling/src/sidechain_reconstructor.hh @@ -41,7 +41,7 @@ class SidechainReconstructor { public: SidechainReconstructor(bool keep_sidechains = true, - bool build_disulfids = true, + bool build_disulfids = true, bool optimize_subrotamers = false, Real remodel_cutoff = 20, Real rigid_frame_cutoff = 0, @@ -63,8 +63,8 @@ public: Reconstruct(uint start_resnum, uint num_residues, uint chain_idx = 0) const; SidechainReconstructionDataPtr - Reconstruct(const std::vector<uint>& start_resnums, - const std::vector<uint>& num_residues, + Reconstruct(const std::vector<uint>& start_resnums, + const std::vector<uint>& num_residues, const std::vector<uint>& chain_indices) const; // options as in SidechainEnvListener (only used if no listener there yet!) diff --git a/modelling/tests/data/1crn_sc_test.pdb b/modelling/tests/data/1crn_sc_test.pdb index e05c7c36..fd1c58c1 100644 --- a/modelling/tests/data/1crn_sc_test.pdb +++ b/modelling/tests/data/1crn_sc_test.pdb @@ -1,275 +1,3 @@ -HEADER PLANT PROTEIN 30-APR-81 1CRN -TITLE WATER STRUCTURE OF A HYDROPHOBIC PROTEIN AT ATOMIC RESOLUTION. -TITLE 2 PENTAGON RINGS OF WATER MOLECULES IN CRYSTALS OF CRAMBIN -COMPND MOL_ID: 1; -COMPND 2 MOLECULE: CRAMBIN; -COMPND 3 CHAIN: A; -COMPND 4 ENGINEERED: YES -SOURCE MOL_ID: 1; -SOURCE 2 ORGANISM_SCIENTIFIC: CRAMBE HISPANICA SUBSP. ABYSSINICA; -SOURCE 3 ORGANISM_TAXID: 3721; -SOURCE 4 STRAIN: SUBSP. ABYSSINICA -KEYWDS PLANT SEED PROTEIN, PLANT PROTEIN -EXPDTA X-RAY DIFFRACTION -AUTHOR W.A.HENDRICKSON,M.M.TEETER -REVDAT 7 11-JUL-12 1CRN 1 SCALE1 VERSN HEADER -REVDAT 6 24-FEB-09 1CRN 1 VERSN -REVDAT 5 16-APR-87 1CRN 1 HEADER -REVDAT 4 04-MAR-85 1CRN 1 REMARK -REVDAT 3 30-SEP-83 1CRN 1 REVDAT -REVDAT 2 03-DEC-81 1CRN 1 SHEET -REVDAT 1 28-JUL-81 1CRN 0 -JRNL AUTH M.M.TEETER -JRNL TITL WATER STRUCTURE OF A HYDROPHOBIC PROTEIN AT ATOMIC -JRNL TITL 2 RESOLUTION: PENTAGON RINGS OF WATER MOLECULES IN CRYSTALS OF -JRNL TITL 3 CRAMBIN. -JRNL REF PROC.NATL.ACAD.SCI.USA V. 81 6014 1984 -JRNL REFN ISSN 0027-8424 -JRNL PMID 16593516 -JRNL DOI 10.1073/PNAS.81.19.6014 -REMARK 1 -REMARK 1 REFERENCE 1 -REMARK 1 AUTH W.A.HENDRICKSON,M.M.TEETER -REMARK 1 TITL STRUCTURE OF THE HYDROPHOBIC PROTEIN CRAMBIN DETERMINED -REMARK 1 TITL 2 DIRECTLY FROM THE ANOMALOUS SCATTERING OF SULPHUR -REMARK 1 REF NATURE V. 290 107 1981 -REMARK 1 REFN ISSN 0028-0836 -REMARK 1 REFERENCE 2 -REMARK 1 AUTH M.M.TEETER,W.A.HENDRICKSON -REMARK 1 TITL HIGHLY ORDERED CRYSTALS OF THE PLANT SEED PROTEIN CRAMBIN -REMARK 1 REF J.MOL.BIOL. V. 127 219 1979 -REMARK 1 REFN ISSN 0022-2836 -REMARK 2 -REMARK 2 RESOLUTION. 1.50 ANGSTROMS. -REMARK 3 -REMARK 3 REFINEMENT. -REMARK 3 PROGRAM : PROLSQ -REMARK 3 AUTHORS : KONNERT,HENDRICKSON -REMARK 3 -REMARK 3 DATA USED IN REFINEMENT. -REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 1.50 -REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : NULL -REMARK 3 DATA CUTOFF (SIGMA(F)) : NULL -REMARK 3 COMPLETENESS FOR RANGE (%) : NULL -REMARK 3 NUMBER OF REFLECTIONS : NULL -REMARK 3 -REMARK 3 FIT TO DATA USED IN REFINEMENT. -REMARK 3 CROSS-VALIDATION METHOD : NULL -REMARK 3 FREE R VALUE TEST SET SELECTION : NULL -REMARK 3 R VALUE (WORKING + TEST SET) : NULL -REMARK 3 R VALUE (WORKING SET) : NULL -REMARK 3 FREE R VALUE : NULL -REMARK 3 FREE R VALUE TEST SET SIZE (%) : NULL -REMARK 3 FREE R VALUE TEST SET COUNT : NULL -REMARK 3 -REMARK 3 FIT/AGREEMENT OF MODEL WITH ALL DATA. -REMARK 3 R VALUE (WORKING + TEST SET, NO CUTOFF) : NULL -REMARK 3 R VALUE (WORKING SET, NO CUTOFF) : NULL -REMARK 3 FREE R VALUE (NO CUTOFF) : NULL -REMARK 3 FREE R VALUE TEST SET SIZE (%, NO CUTOFF) : NULL -REMARK 3 FREE R VALUE TEST SET COUNT (NO CUTOFF) : NULL -REMARK 3 TOTAL NUMBER OF REFLECTIONS (NO CUTOFF) : NULL -REMARK 3 -REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT. -REMARK 3 PROTEIN ATOMS : 327 -REMARK 3 NUCLEIC ACID ATOMS : 0 -REMARK 3 HETEROGEN ATOMS : 0 -REMARK 3 SOLVENT ATOMS : 0 -REMARK 3 -REMARK 3 B VALUES. -REMARK 3 FROM WILSON PLOT (A**2) : NULL -REMARK 3 MEAN B VALUE (OVERALL, A**2) : NULL -REMARK 3 OVERALL ANISOTROPIC B VALUE. -REMARK 3 B11 (A**2) : NULL -REMARK 3 B22 (A**2) : NULL -REMARK 3 B33 (A**2) : NULL -REMARK 3 B12 (A**2) : NULL -REMARK 3 B13 (A**2) : NULL -REMARK 3 B23 (A**2) : NULL -REMARK 3 -REMARK 3 ESTIMATED COORDINATE ERROR. -REMARK 3 ESD FROM LUZZATI PLOT (A) : NULL -REMARK 3 ESD FROM SIGMAA (A) : NULL -REMARK 3 LOW RESOLUTION CUTOFF (A) : NULL -REMARK 3 -REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES. -REMARK 3 DISTANCE RESTRAINTS. RMS SIGMA -REMARK 3 BOND LENGTH (A) : NULL ; NULL -REMARK 3 ANGLE DISTANCE (A) : NULL ; NULL -REMARK 3 INTRAPLANAR 1-4 DISTANCE (A) : NULL ; NULL -REMARK 3 H-BOND OR METAL COORDINATION (A) : NULL ; NULL -REMARK 3 -REMARK 3 PLANE RESTRAINT (A) : NULL ; NULL -REMARK 3 CHIRAL-CENTER RESTRAINT (A**3) : NULL ; NULL -REMARK 3 -REMARK 3 NON-BONDED CONTACT RESTRAINTS. -REMARK 3 SINGLE TORSION (A) : NULL ; NULL -REMARK 3 MULTIPLE TORSION (A) : NULL ; NULL -REMARK 3 H-BOND (X...Y) (A) : NULL ; NULL -REMARK 3 H-BOND (X-H...Y) (A) : NULL ; NULL -REMARK 3 -REMARK 3 CONFORMATIONAL TORSION ANGLE RESTRAINTS. -REMARK 3 SPECIFIED (DEGREES) : NULL ; NULL -REMARK 3 PLANAR (DEGREES) : NULL ; NULL -REMARK 3 STAGGERED (DEGREES) : NULL ; NULL -REMARK 3 TRANSVERSE (DEGREES) : NULL ; NULL -REMARK 3 -REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS. RMS SIGMA -REMARK 3 MAIN-CHAIN BOND (A**2) : NULL ; NULL -REMARK 3 MAIN-CHAIN ANGLE (A**2) : NULL ; NULL -REMARK 3 SIDE-CHAIN BOND (A**2) : NULL ; NULL -REMARK 3 SIDE-CHAIN ANGLE (A**2) : NULL ; NULL -REMARK 3 -REMARK 3 OTHER REFINEMENT REMARKS: NULL -REMARK 4 -REMARK 4 1CRN COMPLIES WITH FORMAT V. 3.30, 13-JUL-11 -REMARK 100 -REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY BNL. -REMARK 200 -REMARK 200 EXPERIMENTAL DETAILS -REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION -REMARK 200 DATE OF DATA COLLECTION : NULL -REMARK 200 TEMPERATURE (KELVIN) : NULL -REMARK 200 PH : NULL -REMARK 200 NUMBER OF CRYSTALS USED : NULL -REMARK 200 -REMARK 200 SYNCHROTRON (Y/N) : NULL -REMARK 200 RADIATION SOURCE : NULL -REMARK 200 BEAMLINE : NULL -REMARK 200 X-RAY GENERATOR MODEL : NULL -REMARK 200 MONOCHROMATIC OR LAUE (M/L) : NULL -REMARK 200 WAVELENGTH OR RANGE (A) : NULL -REMARK 200 MONOCHROMATOR : NULL -REMARK 200 OPTICS : NULL -REMARK 200 -REMARK 200 DETECTOR TYPE : NULL -REMARK 200 DETECTOR MANUFACTURER : NULL -REMARK 200 INTENSITY-INTEGRATION SOFTWARE : NULL -REMARK 200 DATA SCALING SOFTWARE : NULL -REMARK 200 -REMARK 200 NUMBER OF UNIQUE REFLECTIONS : NULL -REMARK 200 RESOLUTION RANGE HIGH (A) : NULL -REMARK 200 RESOLUTION RANGE LOW (A) : NULL -REMARK 200 REJECTION CRITERIA (SIGMA(I)) : NULL -REMARK 200 -REMARK 200 OVERALL. -REMARK 200 COMPLETENESS FOR RANGE (%) : NULL -REMARK 200 DATA REDUNDANCY : NULL -REMARK 200 R MERGE (I) : NULL -REMARK 200 R SYM (I) : NULL -REMARK 200 <I/SIGMA(I)> FOR THE DATA SET : NULL -REMARK 200 -REMARK 200 IN THE HIGHEST RESOLUTION SHELL. -REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : NULL -REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : NULL -REMARK 200 COMPLETENESS FOR SHELL (%) : NULL -REMARK 200 DATA REDUNDANCY IN SHELL : NULL -REMARK 200 R MERGE FOR SHELL (I) : NULL -REMARK 200 R SYM FOR SHELL (I) : NULL -REMARK 200 <I/SIGMA(I)> FOR SHELL : NULL -REMARK 200 -REMARK 200 DIFFRACTION PROTOCOL: NULL -REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: NULL -REMARK 200 SOFTWARE USED: NULL -REMARK 200 STARTING MODEL: NULL -REMARK 200 -REMARK 200 REMARK: NULL -REMARK 280 -REMARK 280 CRYSTAL -REMARK 280 SOLVENT CONTENT, VS (%): 32.16 -REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 1.81 -REMARK 280 -REMARK 280 CRYSTALLIZATION CONDITIONS: NULL -REMARK 290 -REMARK 290 CRYSTALLOGRAPHIC SYMMETRY -REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 1 21 1 -REMARK 290 -REMARK 290 SYMOP SYMMETRY -REMARK 290 NNNMMM OPERATOR -REMARK 290 1555 X,Y,Z -REMARK 290 2555 -X,Y+1/2,-Z -REMARK 290 -REMARK 290 WHERE NNN -> OPERATOR NUMBER -REMARK 290 MMM -> TRANSLATION VECTOR -REMARK 290 -REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS -REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM -REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY -REMARK 290 RELATED MOLECULES. -REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000 -REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000 -REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000 -REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 0.00000 -REMARK 290 SMTRY2 2 0.000000 1.000000 0.000000 9.32500 -REMARK 290 SMTRY3 2 0.000000 0.000000 -1.000000 0.00000 -REMARK 290 -REMARK 290 REMARK: NULL -REMARK 300 -REMARK 300 BIOMOLECULE: 1 -REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM -REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN -REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON -REMARK 300 BURIED SURFACE AREA. -REMARK 350 -REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN -REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE -REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS -REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND -REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN. -REMARK 350 -REMARK 350 BIOMOLECULE: 1 -REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: MONOMERIC -REMARK 350 APPLY THE FOLLOWING TO CHAINS: A -REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 -REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 -REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 -REMARK 400 -REMARK 400 COMPOUND -REMARK 400 THE SECONDARY STRUCTURE SPECIFICATIONS ARE THOSE DEFINED -REMARK 400 IN REFERENCE 1 ABOVE AND DEPEND ON PARTICULAR DEFINITIONS -REMARK 400 THAT MAY AFFECT THE DETERMINATION OF END POINTS. PLEASE -REMARK 400 CONSULT THE PRIMARY REFERENCE AND EXAMINE STRUCTURAL -REMARK 400 DETAILS SUCH AS HYDROGEN BONDING AND CONFORMATION ANGLES -REMARK 400 WHEN MAKING USE OF THE SPECIFICATIONS. -REMARK 500 -REMARK 500 GEOMETRY AND STEREOCHEMISTRY -REMARK 500 SUBTOPIC: COVALENT BOND ANGLES -REMARK 500 -REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES -REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE -REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN -REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). -REMARK 500 -REMARK 500 STANDARD TABLE: -REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1) -REMARK 500 -REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999 -REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996 -REMARK 500 -REMARK 500 M RES CSSEQI ATM1 ATM2 ATM3 -REMARK 500 ARG A 10 NE - CZ - NH2 ANGL. DEV. = -3.6 DEGREES -REMARK 500 TYR A 29 CB - CG - CD1 ANGL. DEV. = -4.7 DEGREES -REMARK 500 -REMARK 500 REMARK: NULL -DBREF 1CRN A 1 46 UNP P01542 CRAM_CRAAB 1 46 -SEQRES 1 A 46 THR THR CYS CYS PRO SER ILE VAL ALA ARG SER ASN PHE -SEQRES 2 A 46 ASN VAL CYS ARG LEU PRO GLY THR PRO GLU ALA ILE CYS -SEQRES 3 A 46 ALA THR TYR THR GLY CYS ILE ILE ILE PRO GLY ALA THR -SEQRES 4 A 46 CYS PRO GLY ASP TYR ALA ASN -HELIX 1 H1 ILE A 7 PRO A 19 13/10 CONFORMATION RES 17,19 13 -HELIX 2 H2 GLU A 23 THR A 30 1DISTORTED 3/10 AT RES 30 8 -SHEET 1 S1 2 THR A 1 CYS A 4 0 -SHEET 2 S1 2 CYS A 32 ILE A 35 -1 -SSBOND 1 CYS A 3 CYS A 40 1555 1555 2.00 -SSBOND 2 CYS A 4 CYS A 32 1555 1555 2.04 -SSBOND 3 CYS A 16 CYS A 26 1555 1555 2.05 -CRYST1 40.960 18.650 22.520 90.00 90.77 90.00 P 1 21 1 2 -ORIGX1 1.000000 0.000000 0.000000 0.00000 -ORIGX2 0.000000 1.000000 0.000000 0.00000 -ORIGX3 0.000000 0.000000 1.000000 0.00000 -SCALE1 0.024414 0.000000 0.000328 0.00000 -SCALE2 0.000000 0.053619 0.000000 0.00000 -SCALE3 0.000000 0.000000 0.044409 0.00000 ATOM 1 N THR A 1 17.047 14.099 3.625 1.00 13.79 N ATOM 2 CA THR A 1 16.967 12.784 4.338 1.00 10.80 C ATOM 3 C THR A 1 15.685 12.755 5.133 1.00 9.19 C @@ -282,14 +10,11 @@ ATOM 9 CA THR A 2 13.856 11.469 6.066 1.00 8.31 C ATOM 10 C THR A 2 14.164 10.785 7.379 1.00 5.80 C ATOM 11 O THR A 2 14.993 9.862 7.443 1.00 6.94 O ATOM 12 CB THR A 2 12.732 10.711 5.261 1.00 10.32 C -ATOM 13 OG1 THR A 2 13.308 9.439 4.926 1.00 12.81 O -ATOM 14 CG2 THR A 2 12.484 11.442 3.895 1.00 11.90 C ATOM 15 N CYS A 3 13.488 11.241 8.417 1.00 5.24 N ATOM 16 CA CYS A 3 13.660 10.707 9.787 1.00 5.39 C ATOM 17 C CYS A 3 12.269 10.431 10.323 1.00 4.45 C ATOM 18 O CYS A 3 11.393 11.308 10.185 1.00 6.54 O ATOM 19 CB CYS A 3 14.368 11.748 10.691 1.00 5.99 C -ATOM 20 SG CYS A 3 15.885 12.426 10.016 1.00 7.01 S ATOM 21 N CYS A 4 12.019 9.272 10.928 1.00 3.90 N ATOM 22 CA CYS A 4 10.646 8.991 11.408 1.00 4.24 C ATOM 23 C CYS A 4 10.654 8.793 12.919 1.00 3.72 C diff --git a/modelling/tests/test_sidechain_reconstructor.cc b/modelling/tests/test_sidechain_reconstructor.cc index 4f0f2e01..e6f9a9a2 100644 --- a/modelling/tests/test_sidechain_reconstructor.cc +++ b/modelling/tests/test_sidechain_reconstructor.cc @@ -42,13 +42,14 @@ SidechainReconstructorPtr GetScRec(const ost::mol::EntityHandle& test_ent) { return sc_rec; } -void CheckLoopRec(const SidechainReconstructorPtr sc_rec, - uint start_resnum, uint loop_length, uint num_residues) { - // reconstruct - SidechainReconstructionDataPtr sc_data; - sc_data = sc_rec->Reconstruct(start_resnum, loop_length); +// assume: single chain and res_idx = resnum-1 +void CheckRecData(SidechainReconstructionDataPtr sc_data, + const std::vector<uint>& start_resnums, + const std::vector<uint>& loop_lengths, + uint num_residues) { // check all_pos size BOOST_CHECK_EQUAL(sc_data->all_pos->GetNumResidues(), num_residues); + // check env_pos consistency const uint num_rec_residues = sc_data->env_pos->res_indices.size(); BOOST_CHECK_EQUAL(sc_data->env_pos->all_pos->GetNumResidues(), @@ -60,16 +61,32 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec, BOOST_CHECK_EQUAL(sc_data->env_pos->all_pos->GetAA(i), sc_data->all_pos->GetAA(res_idx)); } - // check loop - BOOST_CHECK_EQUAL(sc_data->loop_start_indices.size(), 1u); - BOOST_CHECK_EQUAL(sc_data->loop_lengths.size(), 1u); - BOOST_CHECK_EQUAL(sc_data->loop_lengths[0], loop_length); - for (uint i = 0; i < loop_length; ++i) { + + // generate expected data for loops -> set to be ok with flips + const uint num_loops = start_resnums.size(); + std::set<uint> exp_loop_lengths(loop_lengths.begin(), loop_lengths.end()); + std::set<uint> exp_res_indices; + for (uint i_loop = 0; i_loop < num_loops; ++i_loop) { + for (uint idx = 0; idx < loop_lengths[i_loop]; ++idx) { + exp_res_indices.insert(start_resnums[i_loop] + idx - 1); + } + } + // check loops + BOOST_CHECK_EQUAL(sc_data->loop_start_indices.size(), num_loops); + BOOST_CHECK_EQUAL(sc_data->loop_lengths.size(), num_loops); + std::set<uint> sc_loop_lengths(sc_data->loop_lengths.begin(), + sc_data->loop_lengths.end()); + BOOST_CHECK(sc_loop_lengths == exp_loop_lengths); + std::set<uint> sc_res_indices; + for (uint i_loop = 0; i_loop < num_loops; ++i_loop) { // all loop res. assumed to be contiguous - const uint start_idx = sc_data->loop_start_indices[0]; - const uint res_idx = sc_data->env_pos->res_indices[start_idx + i]; - BOOST_CHECK(res_idx == start_resnum + i - 1); + const uint start_idx = sc_data->loop_start_indices[i_loop]; + for (uint idx = 0; idx < sc_data->loop_lengths[i_loop]; ++idx) { + sc_res_indices.insert(sc_data->env_pos->res_indices[start_idx + idx]); + } } + BOOST_CHECK(sc_res_indices == exp_res_indices); + // check N-ter / C-ter info BOOST_CHECK_EQUAL(sc_data->env_pos->res_indices.size(), sc_data->is_n_ter.size()); @@ -82,6 +99,7 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec, BOOST_CHECK(is_nter == sc_data->is_n_ter[i]); BOOST_CHECK(is_cter == sc_data->is_c_ter[i]); } + // check rotamer_res_indices for (uint i = 0; i < sc_data->rotamer_res_indices.size(); ++i) { const uint i_res = sc_data->rotamer_res_indices[i]; @@ -89,6 +107,7 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec, const uint res_idx = sc_data->env_pos->res_indices[i_res]; BOOST_CHECK(!(sc_data->all_pos->IsAllSet(res_idx))); } + // check disulfid_bridges for (uint i = 0; i < sc_data->disulfid_bridges.size(); ++i) { const uint i_res1 = sc_data->disulfid_bridges[i].first; @@ -102,6 +121,29 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec, } } +void CheckLoopRec(const SidechainReconstructorPtr sc_rec, + uint start_resnum, uint loop_length, uint num_residues) { + // reconstruct + SidechainReconstructionDataPtr sc_data; + sc_data = sc_rec->Reconstruct(start_resnum, loop_length); + // DEBUG-OUT + // std::cout << "SRN: " << start_resnum << ", LL: " << loop_length + // << ", NR: " << num_residues + // << ", RIS: " << sc_data->env_pos->res_indices.size() + // << ", RRIS: " << sc_data->rotamer_res_indices.size() + // << ", DBS: " << sc_data->disulfid_bridges.size() << "\n"; + // turn into vector for check and to call other one + std::vector<uint> start_resnums(1, start_resnum); + std::vector<uint> loop_lengths(1, loop_length); + // check + CheckRecData(sc_data, start_resnums, loop_lengths, num_residues); + // call other one + std::vector<uint> chain_indices(1, 0); + sc_data = sc_rec->Reconstruct(start_resnums, loop_lengths, chain_indices); + // check + CheckRecData(sc_data, start_resnums, loop_lengths, num_residues); +} + void CheckEmptyLoop(const SidechainReconstructionDataPtr sc_data, uint num_residues) { // must all be valid and empty @@ -145,11 +187,23 @@ BOOST_AUTO_TEST_CASE(test_sidechain_reconstructor_loops) { std::vector<uint> chain_indices(1, 0); sc_data = sc_rec->Reconstruct(start_resnums, loop_lengths, chain_indices); CheckEmptyLoop(sc_data, num_residues); + + // try three loops (note: overlap resolution is tested with IdxHandler) + loop_lengths[0] = 3; + start_resnums.push_back(20); + start_resnums.push_back(30); + loop_lengths.push_back(2); + loop_lengths.push_back(1); + chain_indices.push_back(0); + chain_indices.push_back(0); + sc_data = sc_rec->Reconstruct(start_resnums, loop_lengths, chain_indices); + CheckRecData(sc_data, start_resnums, loop_lengths, num_residues); } BOOST_AUTO_TEST_CASE(test_sidechain_reconstructor_loops_crn) { // setup crn to test disulfid bridges ost::mol::EntityHandle test_ent = LoadTestStructure("data/1crn_sc_test.pdb"); + // -> sc missing for THR2 & CYS3, 3 disulfid bridges expected... uint num_residues = test_ent.GetResidueCount(); SidechainReconstructorPtr sc_rec = GetScRec(test_ent); -- GitLab