Exemplo n.º 1
0
        private static void CreateAtoms(NInchiStructure output, int numatoms, IntPtr intPtrAtoms)
        {
            var iatoms = (Inchi_Atom *)intPtrAtoms.ToPointer();

            for (int i = 0; i < numatoms; i++)
            {
                Inchi_Atom iatom = iatoms[i];
                var        natom = new NInchiAtom(iatom.X, iatom.Y, iatom.Z, new string(iatom.elname))
                {
                    Charge            = iatom.charge,
                    Radical           = (INCHI_RADICAL)iatom.radical,
                    ImplicitH         = iatom.num_iso_H[0],
                    ImplicitProtium   = iatom.num_iso_H[1],
                    ImplicitDeuterium = iatom.num_iso_H[2],
                    ImplicitTritium   = iatom.num_iso_H[3],
                    IsotopicMass      = iatom.isotopic_mass
                };
                output.Atoms.Add(natom);
            }
        }
Exemplo n.º 2
0
        private static void CreateBonds(NInchiStructure output, int numatoms, IntPtr intPtrAtoms)
        {
            var iatoms = (Inchi_Atom *)intPtrAtoms.ToPointer();

            for (int i = 0; i < numatoms; i++)
            {
                Inchi_Atom iatom    = iatoms[i];
                int        numbonds = iatom.num_bonds;
                if (numbonds > 0)
                {
                    var atO = output.Atoms[i];
                    for (int j = 0; j < numbonds; j++)
                    {
                        /* Bonds get recorded twice, so only pick one direction... */
                        if (iatom.neighbor[j] < i)
                        {
                            var atT   = output.Atoms[iatom.neighbor[j]];
                            var nbond = new NInchiBond(atO, atT, (INCHI_BOND_TYPE)iatom.bond_type[j], (INCHI_BOND_STEREO)iatom.bond_stereo[j]);
                            output.Bonds.Add(nbond);
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        static Set_inchi_Input_ InitInchiInput(NInchiInput input)
        {
            var natoms  = input.Atoms.Count;
            var nstereo = input.Stereos.Count;
            var nbonds  = input.Bonds.Count;

            if (natoms > MAX_ATOMS)
            {
                throw new ArgumentException("Too many atoms");
            }

            var atoms = new Inchi_Atom[natoms];
            {
                for (int i = 0; i < natoms; i++)
                {
                    var atom = input.Atoms[i];

                    Inchi_Atom iatom = new Inchi_Atom();
                    {
                        var elname = Encoding.ASCII.GetBytes(atom.ElementType);
                        for (int n = 0; n < elname.Length; n++)
                        {
                            iatom.elname[n] = (sbyte)elname[n];
                        }
                        iatom.elname[elname.Length] = 0;
                    }

                    iatom.X = atom.X;
                    iatom.Y = atom.Y;
                    iatom.Z = atom.Z;

                    iatom.charge  = (SByte)atom.Charge;
                    iatom.radical = (SByte)atom.Radical;

                    iatom.num_iso_H[0] = (SByte)atom.ImplicitH;
                    iatom.num_iso_H[1] = (SByte)atom.ImplicitProtium;
                    iatom.num_iso_H[2] = (SByte)atom.ImplicitDeuterium;
                    iatom.num_iso_H[3] = (SByte)atom.ImplicitTritium;

                    iatom.isotopic_mass = (Int16)atom.IsotopicMass;

                    iatom.num_bonds = 0;

                    atoms[i] = iatom;
                }
            }

            {
                for (int i = 0; i < nbonds; i++)
                {
                    var bond       = input.Bonds[i];
                    var atomO      = bond.OriginAtom;
                    var atomT      = bond.TargetAtom;
                    var bondType   = bond.BondType;
                    var bondStereo = bond.BondStereo;

                    var iaO = input.Atoms.IndexOf(atomO);
                    var iaT = input.Atoms.IndexOf(atomT);

                    var iatom    = atoms[iaO];
                    int numbonds = atoms[iaO].num_bonds;
                    if (numbonds == MAXVAL)
                    {
                        throw new ArgumentException("Too many bonds from one atom; maximum: " + MAXVAL);
                    }
                    iatom.neighbor[numbonds]    = (Int16)iaT;
                    iatom.bond_type[numbonds]   = (SByte)bondType;
                    iatom.bond_stereo[numbonds] = (SByte)bondStereo;
                    iatom.num_bonds++;
                    atoms[iaO] = iatom;
                }
            }

            var stereos = new Inchi_Stereo0D[nstereo];
            {
                for (var i = 0; i < input.Stereos.Count; i++)
                {
                    var stereo = input.Stereos[i];

                    var istereo = stereos[i];

                    var cat  = stereo.CentralAtom;
                    var nat0 = stereo.Neighbors[0];
                    var nat1 = stereo.Neighbors[1];
                    var nat2 = stereo.Neighbors[2];
                    var nat3 = stereo.Neighbors[3];

                    istereo.central_atom = (Int16)input.Atoms.IndexOf(cat);
                    istereo.neighbor[0]  = (Int16)input.Atoms.IndexOf(nat0);
                    istereo.neighbor[1]  = (Int16)input.Atoms.IndexOf(nat1);
                    istereo.neighbor[2]  = (Int16)input.Atoms.IndexOf(nat2);
                    istereo.neighbor[3]  = (Int16)input.Atoms.IndexOf(nat3);
                    istereo.type         = (SByte)stereo.StereoType;
                    istereo.parity       = (SByte)stereo.Parity;

                    stereos[i] = istereo;
                }
            }

            var pre = new Set_inchi_Input_
            {
                atoms   = atoms,
                stereos = stereos
            };

            return(pre);
        }