diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc index 6fa089e2c2721d70b813f199edc2886e12b35659..7178667b3bc57cf337defa972c4371d830ce3b19 100644 --- a/modules/io/src/mol/pdb_reader.cc +++ b/modules/io/src/mol/pdb_reader.cc @@ -695,10 +695,10 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num, occ=std::make_pair(true, Real(1.0)); temp=std::make_pair(true, Real(0.0)); if (line.length()>=60) { - charge=line.substr(54,6).ltrim().to_float(); + charge=line.substr(55,7).ltrim().to_float(); } - if (line.length()>=66) { - radius=line.substr(60, 6).ltrim().to_float(); + if (line.length()>=68) { + radius=line.substr(63,6).ltrim().to_float(); } } else { if (line.length()>=60) { diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc index 506345758233ec642be9c142d4104f3b178e7c99..17f891d57226ae479893a854f302008e16d7b231 100644 --- a/modules/io/src/mol/pdb_writer.cc +++ b/modules/io/src/mol/pdb_writer.cc @@ -130,8 +130,8 @@ void write_atom(std::ostream& ostr, FormattedLine& line, line(46, 8)=fmt::LPaddedFloat(p[2], 3); if (is_pqr) { - line(54, 6)=fmt::LPaddedFloat(atom.GetCharge(), 2); - line(60, 6)=fmt::LPaddedFloat(atom.GetRadius(), 2); + line(55, 7)=fmt::LPaddedFloat(atom.GetCharge(), 4); + line(63, 6)=fmt::LPaddedFloat(atom.GetRadius(), 4); } else { line(54, 6)=fmt::LPaddedFloat(atom.GetOccupancy(), 2); Real bfac=atom.GetBFactor(); @@ -351,6 +351,9 @@ PDBWriter::PDBWriter(const boost::filesystem::path& filename, charmm_style_(profile.dialect=="CHARMM"), is_pqr_(false), profile_(profile), filename_("") { + if (boost::iequals(".pqr", boost::filesystem::extension(filename))) { + is_pqr_=true; + } if (boost::iequals(".gz", boost::filesystem::extension(filename))) { out_.push(boost::iostreams::gzip_compressor()); } @@ -362,6 +365,9 @@ PDBWriter::PDBWriter(const String& filename, const IOProfile& profile): multi_model_(false), charmm_style_(profile.dialect=="CHARMM"), is_pqr_(false), profile_(profile), filename_(filename) { + if (boost::iequals(".pqr", boost::filesystem::extension(filename))) { + is_pqr_=true; + } if (boost::iequals(".gz", boost::filesystem::extension(filename))) { out_.push(boost::iostreams::gzip_compressor()); } diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc index 6a055b83fe0624cf9cb783162bc1028039b055ed..0056bd194eb54d6624482acfdb2eca1e1605c68e 100644 --- a/modules/io/tests/test_io_pdb.cc +++ b/modules/io/tests/test_io_pdb.cc @@ -855,4 +855,88 @@ BOOST_AUTO_TEST_CASE(write_charmm_ter) "testfiles/pdb/charmm_ter-out.pdb")); } +BOOST_AUTO_TEST_CASE(test_pqr_import_handler) +{ + String fname("testfiles/test_in.pqr"); + + mol::EntityHandle eh=mol::CreateEntity(); + EntityIOPDBHandler pdbh; + + BOOST_CHECK(EntityIOPDBHandler::ProvidesImport(fname)); + BOOST_CHECK(EntityIOPDBHandler::ProvidesImport("test_in.PQR")); + + BOOST_CHECK(EntityIOPDBHandler::ProvidesExport(fname)); + BOOST_CHECK(EntityIOPDBHandler::ProvidesExport("test_in.PQR")); + + pdbh.Import(eh,"testfiles/pdb/simple.pqr"); +} + + +BOOST_AUTO_TEST_CASE(test_pqr_read_atom) +{ + String fname("testfiles/pdb/simple.pqr"); + PDBReader reader(fname, IOProfile()); + mol::EntityHandle ent=mol::CreateEntity(); + reader.Import(ent); + BOOST_REQUIRE_EQUAL(ent.GetChainCount(), 1); + BOOST_REQUIRE_EQUAL(ent.GetResidueCount(), 5); + BOOST_REQUIRE_EQUAL(ent.GetAtomCount(), 91); + mol::AtomHandle a1=ent.FindAtom(" ", mol::ResNum(1), "N"); + BOOST_REQUIRE(a1.IsValid()); + BOOST_CHECK_EQUAL(a1.GetName(), "N"); + BOOST_CHECK_EQUAL(a1.GetResidue().GetName(), "MET"); + BOOST_CHECK_EQUAL(a1.GetResidue().GetChain().GetName(), " "); + + + BOOST_CHECK_EQUAL(a1.GetPos(), geom::Vec3(21.6, 35.3, 56.7)); + BOOST_CHECK_EQUAL(a1.GetElement(), ""); + BOOST_CHECK_EQUAL(a1.IsHetAtom(), false); + BOOST_CHECK_CLOSE(a1.GetCharge(), Real(-0.3755), Real(1e-4)); + BOOST_CHECK_CLOSE(a1.GetRadius(), Real(2.0005), Real(1e-4)); + + mol::AtomHandle a2=ent.FindAtom(" ", mol::ResNum(2), "CZ"); + BOOST_REQUIRE(a2.IsValid()); + BOOST_CHECK_EQUAL(a2.GetName(), "CZ"); + BOOST_CHECK_EQUAL(a2.GetResidue().GetName(), "ARG"); + BOOST_CHECK_EQUAL(a2.GetResidue().GetChain().GetName(), " "); + + BOOST_CHECK_EQUAL(a2.GetPos(), geom::Vec3(23.9, 28.7, 56.5)); + BOOST_CHECK_EQUAL(a2.GetElement(), ""); + BOOST_CHECK_EQUAL(a2.IsHetAtom(), false); + BOOST_CHECK_CLOSE(a2.GetCharge(), Real(0.2507), Real(1e-4)); + BOOST_CHECK_CLOSE(a2.GetRadius(), Real(1.7503), Real(1e-4)); +} + +BOOST_AUTO_TEST_CASE(test_pqr_write_atom) +{ + std::stringstream out; + PDBWriter writer(out, IOProfile()); + writer.SetIsPQR(true); + + mol::EntityHandle ent=mol::CreateEntity(); + mol::XCSEditor edi=ent.EditXCS(); + mol::ChainHandle ch=edi.InsertChain("A"); + mol::ResidueHandle r=edi.AppendResidue(ch, "GLY"); + + mol::AtomHandle a=edi.InsertAtom(r, "CA", geom::Vec3(32.0, -128.0, -2.5), "C"); + a.SetOccupancy(1.0); + a.SetBFactor(128.0); + a.SetCharge(-0.6543); + a.SetRadius(1.2345); + mol::AtomHandle a2=edi.InsertAtom(r, "CA", geom::Vec3(32.0, -128.0, -2.5), "C"); + a2.SetOccupancy(1.0); + a2.SetBFactor(128.0); + a2.SetCharge(0.1234); + a2.SetRadius(2.5432); + writer.Write(ent); + String s=out.str(); + BOOST_CHECK_EQUAL(s.substr(0, 54), + "ATOM 1 CA GLY A 1 32.000-128.000 -2.500"); + BOOST_CHECK_EQUAL(s.substr(54, 26), + " -0.6543 1.2345 C "); + + PDBWriter fwriter(String("testfiles/pdb/pqr_atom-out.pqr"), IOProfile()); + BOOST_CHECK_EQUAL(fwriter.IsPQR(), true); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/modules/io/tests/testfiles/pdb/simple.pqr b/modules/io/tests/testfiles/pdb/simple.pqr new file mode 100644 index 0000000000000000000000000000000000000000..57b48919b6f94b1ace9a91597b0c301b0b6adf23 --- /dev/null +++ b/modules/io/tests/testfiles/pdb/simple.pqr @@ -0,0 +1,100 @@ +REMARK 1 PQR file generated by PDB2PQR (Version 1.4.0) +REMARK 1 +REMARK 1 Forcefield Used: parse +REMARK 1 +REMARK 5 Gap in backbone detected between LEU A 3 and MET A 255! +REMARK 5 Gap in backbone detected between MET B 1 and SER B 256! +REMARK 5 +REMARK 6 Total charge on this protein: 1.0000 e +REMARK 6 +ATOM 1 N MET 1 21.600 35.300 56.700 -0.3755 2.0005 +ATOM 2 CA MET 1 20.601 35.494 57.793 0.3300 2.0000 +ATOM 3 C MET 1 19.654 34.300 57.789 0.5500 1.7000 +ATOM 4 O MET 1 18.447 34.456 57.595 -0.5500 1.4000 +ATOM 5 CB MET 1 19.789 36.783 57.639 0.0000 2.0000 +ATOM 6 CG MET 1 20.629 38.055 57.606 0.2650 2.0000 +ATOM 7 SD MET 1 21.638 38.325 59.084 -0.5300 1.8500 +ATOM 8 CE MET 1 23.233 37.697 58.529 0.2650 2.0000 +ATOM 9 HE1 MET 1 23.125 37.266 57.634 0.0000 0.0000 +ATOM 10 HE2 MET 1 23.881 38.455 58.461 0.0000 0.0000 +ATOM 11 HE3 MET 1 23.571 37.025 59.187 0.0000 0.0000 +ATOM 12 H2 MET 1 22.177 34.580 56.869 0.3300 0.0000 +ATOM 13 H3 MET 1 21.135 35.294 55.831 0.3300 0.0000 +ATOM 14 HG2 MET 1 21.223 38.027 56.761 0.0000 0.0000 +ATOM 15 HG3 MET 1 19.996 38.856 57.448 0.0000 0.0000 +ATOM 16 H MET 1 22.175 36.206 56.703 0.3300 0.0000 +ATOM 17 HA MET 1 21.099 35.502 58.665 0.0000 0.0000 +ATOM 18 HB3 MET 1 19.138 36.853 58.408 0.0000 0.0000 +ATOM 19 HB2 MET 1 19.255 36.733 56.783 0.0000 0.0000 +ATOM 20 N ARG 2 20.202 33.112 58.011 -0.4000 1.5000 +ATOM 21 CA ARG 2 19.396 31.903 58.033 -0.0000 2.0000 +ATOM 22 C ARG 2 18.608 31.739 59.328 0.5500 1.7000 +ATOM 23 O ARG 2 17.651 30.965 59.381 -0.5500 1.4000 +ATOM 24 CB ARG 2 20.284 30.681 57.801 0.0000 2.0000 +ATOM 25 CG ARG 2 20.665 30.488 56.342 0.0000 2.0000 +ATOM 26 CD ARG 2 21.557 29.281 56.154 0.3500 2.0000 +ATOM 27 NE ARG 2 22.931 29.557 56.551 -0.3500 1.5000 +ATOM 28 CZ ARG 2 23.900 28.700 56.500 0.2507 1.7503 +ATOM 29 NH1 ARG 2 23.640 27.417 56.130 -0.7000 1.5000 +ATOM 30 NH2 ARG 2 25.132 28.980 56.893 -0.7000 1.5000 +ATOM 31 HG3 ARG 2 21.156 31.294 56.019 0.0000 0.0000 +ATOM 32 HA ARG 2 18.738 31.934 57.260 0.0000 0.0000 +ATOM 33 HE ARG 2 23.157 30.486 56.860 0.4500 1.0000 +ATOM 34 HG2 ARG 2 19.838 30.356 55.799 0.0000 0.0000 +ATOM 35 HH22 ARG 2 25.859 28.300 56.895 0.4000 1.0000 +ATOM 36 HH21 ARG 2 25.336 29.925 57.170 0.4000 1.0000 +ATOM 37 H ARG 2 21.227 33.124 58.163 0.4000 1.0000 +ATOM 38 HD3 ARG 2 21.537 29.027 55.190 0.0000 0.0000 +ATOM 39 HD2 ARG 2 21.197 28.537 56.711 0.0000 0.0000 +ATOM 40 HH12 ARG 2 24.383 26.727 56.133 0.4000 1.0000 +ATOM 41 HH11 ARG 2 22.728 27.161 55.829 0.4000 1.0000 +ATOM 42 HB3 ARG 2 19.790 29.875 58.100 0.0000 0.0000 +ATOM 43 HB2 ARG 2 21.118 30.797 58.325 0.0000 0.0000 +ATOM 44 N LEU 3 19.003 32.473 60.366 -0.4000 1.5000 +ATOM 45 CA LEU 3 18.330 32.402 61.664 -0.0000 2.0000 +ATOM 46 C LEU 3 17.884 33.787 62.117 0.5500 1.7000 +ATOM 47 O LEU 3 17.853 34.091 63.308 -0.5500 1.4000 +ATOM 48 CB LEU 3 19.269 31.793 62.710 0.0000 2.0000 +ATOM 49 CG LEU 3 19.695 30.340 62.501 0.0000 2.0000 +ATOM 50 CD1 LEU 3 20.585 29.897 63.648 0.0000 2.0000 +ATOM 51 CD2 LEU 3 18.461 29.459 62.420 0.0000 2.0000 +ATOM 52 HD22 LEU 3 17.888 29.751 61.653 0.0000 0.0000 +ATOM 53 HD23 LEU 3 18.736 28.507 62.283 0.0000 0.0000 +ATOM 54 HD21 LEU 3 17.938 29.533 63.270 0.0000 0.0000 +ATOM 55 H LEU 3 19.817 33.091 60.179 0.4000 1.0000 +ATOM 56 HD13 LEU 3 20.084 29.973 64.512 0.0000 0.0000 +ATOM 57 HD12 LEU 3 20.863 28.945 63.510 0.0000 0.0000 +ATOM 58 HD11 LEU 3 21.400 30.478 63.686 0.0000 0.0000 +ATOM 59 HA LEU 3 17.516 31.820 61.570 0.0000 0.0000 +ATOM 60 HG LEU 3 20.197 30.269 61.643 0.0000 0.0000 +ATOM 61 HB3 LEU 3 18.811 31.845 63.597 0.0000 0.0000 +ATOM 62 HB2 LEU 3 20.102 32.347 62.730 0.0000 0.0000 +ATOM 63 N MET 255 29.709 5.069 60.642 -0.4000 1.5000 +ATOM 64 CA MET 255 28.701 5.164 59.592 -0.0000 2.0000 +ATOM 65 C MET 255 27.302 4.748 60.005 0.5500 1.7000 +ATOM 66 O MET 255 27.057 3.586 60.326 -0.5500 1.4000 +ATOM 67 CB MET 255 29.146 4.331 58.399 0.0000 2.0000 +ATOM 68 CG MET 255 30.558 4.642 57.948 0.2650 2.0000 +ATOM 69 SD MET 255 31.116 3.394 56.790 -0.5300 1.8500 +ATOM 70 CE MET 255 31.526 2.062 57.912 0.2650 2.0000 +ATOM 71 HG2 MET 255 30.571 5.563 57.524 0.0000 0.0000 +ATOM 72 HE1 MET 255 32.437 1.708 57.695 0.0000 0.0000 +ATOM 73 HE2 MET 255 31.518 2.401 58.854 0.0000 0.0000 +ATOM 74 HE3 MET 255 30.854 1.325 57.820 0.0000 0.0000 +ATOM 75 HB2 MET 255 29.096 3.355 58.642 0.0000 0.0000 +ATOM 76 HG3 MET 255 31.163 4.679 58.762 0.0000 0.0000 +ATOM 77 H MET 255 26.414 14.773 61.903 0.4000 1.0000 +ATOM 78 HA MET 255 28.661 6.140 59.286 0.0000 0.0000 +ATOM 79 HB3 MET 255 28.520 4.500 57.628 0.0000 0.0000 +ATOM 80 N SER 256 26.376 5.699 59.965 -0.4000 1.5000 +ATOM 81 CA SER 256 24.998 5.430 60.347 -0.0000 2.0000 +ATOM 82 C SER 256 24.040 5.839 59.231 0.1000 1.7000 +ATOM 83 O SER 256 24.543 6.294 58.186 -0.5500 1.4000 +ATOM 84 CB SER 256 24.664 6.188 61.642 0.0000 2.0000 +ATOM 85 OG SER 256 25.569 5.836 62.681 -0.4900 1.4000 +ATOM 86 OXT SER 256 22.811 5.701 59.408 -0.5500 1.4000 +ATOM 87 H SER 256 26.714 6.626 59.646 0.4000 1.0000 +ATOM 88 HA SER 256 24.898 4.440 60.490 0.0000 0.0000 +ATOM 89 HB3 SER 256 23.741 5.949 61.922 0.0000 0.0000 +ATOM 90 HB2 SER 256 24.734 7.163 61.468 0.0000 0.0000 +ATOM 91 HG SER 256 26.464 6.235 62.490 0.4900 1.0000