diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc index 8b16c2cce992fd7bf61675d315a00ca30178d581..94a6e856493bdff7cd1999faab939d85d8e2a9a4 100644 --- a/modules/io/src/mol/pdb_writer.cc +++ b/modules/io/src/mol/pdb_writer.cc @@ -136,7 +136,8 @@ void write_atom(std::ostream& ostr, FormattedLine& line, } else { for (std::vector<String>::const_iterator i=names.begin(), e=names.end(); i!=e; ++i) { - p=atom.GetAltPos(*i); + geom::Mat4 tf=atom.GetEntity().GetTransformationMatrix(); + p=geom::Vec3(tf*geom::Vec4(atom.GetAltPos(*i))); line(30, 50).Clear(); if (i->size()>1) { diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc index df8ff5295dc686bbcf12c281b649a66a7218ff0c..5d78e69846fa17b84633279b314b847453675b14 100644 --- a/modules/io/tests/test_io_pdb.cc +++ b/modules/io/tests/test_io_pdb.cc @@ -364,6 +364,31 @@ BOOST_AUTO_TEST_CASE(write_conect) "testfiles/pdb/conect-out.pdb")); } +BOOST_AUTO_TEST_CASE(alt_loc_tf) +{ + String fname("testfiles/pdb/alt-loc.pdb"); + // this scope is required to force the writer stream to be closed before + // opening the file again in compare_files. Avoids a race condition. + mol::EntityHandle ent=mol::CreateEntity(); + PDBReader reader(fname); + reader.Import(ent); + String out_name("testfiles/pdb/alt-loc-tf-out.pdb"); + { + PDBWriter writer(out_name); + geom::Mat4 shift; + shift.PasteTranslation(geom::Vec3(10,20,30)); + ent.RequestXCSEditor().ApplyTransform(shift); + writer.Write(ent); + } + PDBReader r2(out_name); + mol::EntityHandle ent2=mol::CreateEntity(); + r2.Import(ent2); + mol::ResidueHandle res1=ent2.FindResidue("A", mol::ResNum(1)); + mol::AtomHandle a1=res1.FindAtom("N"); + BOOST_CHECK_EQUAL(res1.GetAltAtomPos(a1, "A"), geom::Vec3(26,84,30)); + BOOST_CHECK_EQUAL(res1.GetAltAtomPos(a1, "B"), geom::Vec3(18,-108,30)); +} + BOOST_AUTO_TEST_CASE(res_name_too_long) { std::stringstream out;