Пример #1
0
        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);
        }