static Pdb PsfgenExt_AlignTo(Pdb pdb, Pdb alignto) { var dictpdb = pdb.atoms.SelectByName("CA").GroupChainIDResSeq(); var dictaln = alignto.atoms.SelectByName("CA").GroupChainIDResSeq(); List <Vector> coordpdb = new List <Vector>(); List <Vector> coordaln = new List <Vector>(); foreach (char ch in dictpdb.Keys) { if (dictaln.ContainsKey(ch) == false) { continue; } foreach (var resi in dictpdb[ch].Keys) { var atompdb = dictpdb[ch][resi]; if (atompdb.Count != 1) { throw new HException(string.Format(">1 number of CA in chain {0} resi {1} in atompdb", ch, resi)); } if (dictaln[ch].ContainsKey(resi) == false) { continue; } var atomaln = dictaln[ch][resi]; if (atomaln.Count != 1) { throw new HException(string.Format(">1 number of CA in chain {0} resi {1} in atomaln", ch, resi)); } HDebug.Assert(coordpdb.Count == coordaln.Count); coordpdb.Add(atompdb[0].coord); coordaln.Add(atomaln[0].coord); } } var trans = Align.MinRMSD.GetTrans(coordaln, coordpdb); Dictionary <Pdb.IAtom, Vector> newcoords = new Dictionary <Pdb.IAtom, Vector>(); foreach (var atom in pdb.atoms) { newcoords.Add(atom, trans.DoTransform(atom.coord)); } foreach (var atom in pdb.hetatms) { newcoords.Add(atom, trans.DoTransform(atom.coord)); } var npdb = pdb.CloneUpdateCoord(newcoords); return(npdb); }