Exemplo n.º 1
0
        public bool ParseLine(MoleculeDefinition molecule, string line)
        {
            string freqLineRegex   = " Frequencies --[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)";
            string pointsLineRegex = "[ ]+ \\d+[ ]+ \\d+[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)";

            int blockSize = 7 + molecule.Atoms.Count;
            //var regexCoordLine = "[ ]+(\\d+)[ ]+(\\d+)[ ]+(\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)[ ]+(-?\\d+.\\d+)";

            bool isLookingForActualInput = index > InitialLines.Length - 1;

            if (isLookingForActualInput)
            {
                if (line.Count() == 0)
                {
                    index = 0;
                    return(false);
                }
                else
                {
                    if (freqIndex == 2)
                    {
                        var match = Regex.Match(line, freqLineRegex);
                        CurrentModes.Clear();
                        for (var i = 1; i <= 3; i++)
                        {
                            var freq = float.Parse(match.Groups [i].Value);
                            var mode = new VibrationalModeDefinition();
                            mode.Wavenumber = freq;
                            CurrentModes.Add(mode);
                        }
                    }
                    if (freqIndex >= 7)
                    {
                        var match = Regex.Match(line, pointsLineRegex);
                        for (var i = 0; i <= 2; i++)
                        {
                            Debug.Log(line);
                            Debug.Log(match.Success);
                            var x = float.Parse(match.Groups [1 + i * 3].Value);
                            var y = float.Parse(match.Groups [2 + i * 3].Value);
                            var z = float.Parse(match.Groups [3 + i * 3].Value);
                            CurrentModes [i].Displacements.Add(new Vector3(x, y, z));
                        }
                    }
                    freqIndex++;
                    if (freqIndex == blockSize)
                    {
                        freqIndex = 0;
                        molecule.VibrationalModes.AddRange(CurrentModes);
                        CurrentModes.Clear();
                    }
                }
                return(true);
            }
            else
            {
                string desiredLine = InitialLines [index];
                if (line.Equals(desiredLine))
                {
                    index++;
                    //if (index == InitialLines.Length) {
                    //	molecule.Atoms.Clear ();
                    //}
                    return(true);
                }
                index = 0;
                return(false);
            }
        }
Exemplo n.º 2
0
    public override void OnImportAsset(AssetImportContext ctx)
    {
        var  lines            = File.ReadAllLines(ctx.assetPath);
        bool vibFreqMode      = false;
        int  currentModeIndex = 0;

        var molecule = ScriptableObject.CreateInstance <MoleculeDefinition> ();

        var elementData = AssetDatabase.FindAssets("t:Element");


        foreach (var line in lines)
        {
            if (line == "VIBFREQ")
            {
                vibFreqMode = true;
            }

            if (vibFreqMode)
            {
                var matchFreq = Regex.Match(line, "^ +(\\d+.\\d+) +[\\w\\?\\+\\-\\'\\\"]+ *$");
                if (matchFreq.Success)
                {
                    var mode = new VibrationalModeDefinition();
                    mode.Wavenumber = float.Parse(matchFreq.Groups [1].Value.Trim());
                    molecule.VibrationalModes.Add(mode);
                    Debug.Log("Found Vibrational Frequency");
                }
                else if (molecule.VibrationalModes.Count > 0)
                {
                    var matchNumbers = Regex.Matches(line, "(?: +-?\\d+.\\d+)");
                    if (matchNumbers.Count > 0)
                    {
                        for (int i = 0; i < matchNumbers.Count / 3; i++)
                        {
                            molecule.VibrationalModes [currentModeIndex].Displacements.Add(new Vector3(
                                                                                               float.Parse(matchNumbers[3 * i].Groups[0].Value.Trim()),
                                                                                               float.Parse(matchNumbers[3 * i + 1].Groups[0].Value.Trim()),
                                                                                               float.Parse(matchNumbers[3 * i + 2].Groups[0].Value.Trim())
                                                                                               ));
                            if (molecule.VibrationalModes [currentModeIndex].Displacements.Count == molecule.Atoms.Count)
                            {
                                currentModeIndex++;
                            }
                        }
                    }
                    else
                    {
                        vibFreqMode = false;
                    }
                }
            }
            else
            {
                var match = Regex.Match(line, "^ (\\d)  ([- ]\\d+.\\d+)  ([- ]\\d+.\\d+)  ([- ]\\d+.\\d+)$");
                if (!match.Success)
                {
                    continue;
                }

                // Found an atom
                var atomicNumber = int.Parse(match.Groups [1].Value.Trim());



                var x = float.Parse(match.Groups [2].Value.Trim());
                var y = float.Parse(match.Groups [3].Value.Trim());
                var z = float.Parse(match.Groups [4].Value.Trim());
                molecule.Atoms.Add(new AtomDefinition()
                {
                    Position = new Vector3(x, y, z),
                    Element  = elementData.Select(e => AssetDatabase.LoadAssetAtPath <Element>(AssetDatabase.GUIDToAssetPath(e))).Where(e => e != null && e.AtomicNumber == atomicNumber).FirstOrDefault()
                });
            }
        }

        ctx.AddObjectToAsset("Data", molecule);
        ctx.SetMainObject(molecule);
    }
Exemplo n.º 3
0
 public VibrationalMode(Molecule molecule, VibrationalModeDefinition def)
 {
     this.Molecule      = molecule;
     this.Wavenumber    = def.Wavenumber;
     this.Displacements = def.Displacements;
 }