Beispiel #1
0
        /// <summary>
        /// load all parameters and symmetry operators
        /// </summary>
        public static void LoadSymOps(string symOpsFile)
        {
            symOps = new SymOps();
            XmlSerializer xmlSerializer    = new XmlSerializer(typeof(SymOps));
            FileStream    symOpsFileStream = new FileStream(symOpsFile, FileMode.Open);

            symOps = (SymOps)xmlSerializer.Deserialize(symOpsFileStream);
        }
Beispiel #2
0
        private void FindDuplicateSpaceGroups(ref SymOps symOpList)
        {
            Dictionary <string, List <string> > sameSgHash = new Dictionary <string, List <string> > ();
            string spaceGroup1 = "";
            string spaceGroup2 = "";

            for (int i = 0; i < symOpList.SymOpsInSpaceGroupList.Length - 1; i++)
            {
                spaceGroup1 = symOpList.SymOpsInSpaceGroupList[i].spaceGroup;
                for (int j = i + 1; j < symOpList.SymOpsInSpaceGroupList.Length; j++)
                {
                    spaceGroup2 = symOpList.SymOpsInSpaceGroupList[j].spaceGroup;
                    if (AreTwoSgStringsSame(symOpList.SymOpsInSpaceGroupList[i], symOpList.SymOpsInSpaceGroupList[j]))
                    {
                        // add spacegroup2 to the list of duplicate space group of sgMatrices1
                        if (sameSgHash.ContainsKey(spaceGroup1))
                        {
                            sameSgHash[spaceGroup1].Add(spaceGroup2);
                        }
                        else
                        {
                            List <string> sgList = new List <string> ();
                            sgList.Add(spaceGroup2);
                            sameSgHash.Add(spaceGroup1, sgList);
                        }

                        // add spacegroup1 to duplicate space group list of sg2
                        if (sameSgHash.ContainsKey(spaceGroup2))
                        {
                            sameSgHash[spaceGroup2].Add(spaceGroup1);
                        }
                        else
                        {
                            List <string> sgList = new List <string> ();
                            sgList.Add(spaceGroup1);
                            sameSgHash.Add(spaceGroup2, sgList);
                        }
                    }
                }
            }
            foreach (SpaceGroupSymmetryMatrices sgMatrices in symOpList.SymOpsInSpaceGroupList)
            {
                if (sameSgHash.ContainsKey(sgMatrices.spaceGroup))
                {
                    foreach (string sgString in sameSgHash[sgMatrices.spaceGroup])
                    {
                        sgMatrices.sameSgListString += (sgString + ";");
                    }
                    sgMatrices.sameSgListString = sgMatrices.sameSgListString.TrimEnd(';');
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// load all parameters and symmetry operators
        /// </summary>
        public static void LoadSymOps()
        {
            if (!File.Exists(symOpsFile))
            {
                throw new Exception("Symmetry operators file not exist");
            }
            symOps = new SymOps();
            XmlSerializer xmlSerializer    = new XmlSerializer(typeof(SymOps));
            FileStream    symOpsFileStream = new FileStream(symOpsFile, FileMode.Open);

            symOps = (SymOps)xmlSerializer.Deserialize(symOpsFileStream);
            symOpsFileStream.Close();
        }
Beispiel #4
0
        public void ParseSymOpsFile(string fileName)
        {
            SymOps symOpList = new SymOps();

            string line     = "";
            int    symOpNum = 0;
            int    dimNum   = 3;
            int    vectNum  = 2;

            SpaceGroupSymmetryMatrices sgSymMatrices = null;

            StreamReader fileReader = new StreamReader(fileName);

            string preSg     = "";
            string currentSg = "";

            while ((line = fileReader.ReadLine()) != null)
            {
                // skip notation
                line = line.Trim();
                if (line == "" ||
                    line.ToLower().IndexOf("space_group") > -1 ||
                    line.ToLower().IndexOf("loop") > -1)
                {
                    continue;
                }
                // skip comments
                if (line[0] == '#')
                {
                    continue;
                }
                // remove space
                currentSg = line.Substring(line.IndexOf("'") + 1, line.LastIndexOf("'") - line.IndexOf("'") - 1);
                line      = line.Substring(line.LastIndexOf("'") + 1, line.Length - line.LastIndexOf("'") - 1).Trim();
                // start new space group,
                // add previous one
                if (currentSg != preSg)
                {
                    // add symmetry operations of a space group
                    if (sgSymMatrices != null)
                    {
                        symOpList.Add(sgSymMatrices);
                    }
                    sgSymMatrices            = new SpaceGroupSymmetryMatrices();
                    sgSymMatrices.spaceGroup = currentSg;
                }

                SymOpMatrix symOpMatrix = new SymOpMatrix();
                string[]    fields      = ParseHelper.SplitPlus(line, ' ');
                symOpMatrix.symmetryOpNum = fields[0];

                symOpNum = Convert.ToInt32(fields[0]);
                symOpMatrix.symmetryString = symOpNum.ToString() + "_555";
                // set 3*3 matrix
                int i = 1;
                for (; i < 10; i++)
                {
                    symOpMatrix.Add((int)Math.Floor((double)(i - 1) / (double)dimNum), (i - 1) % dimNum, Convert.ToDouble(fields[i]));
                }
                // set matrix vector
                string denominator = "";
                string nominator   = "";
                int    dim         = 0;
                for (; i < fields.Length; i += vectNum)
                {
                    denominator = fields[i];
                    nominator   = fields[i + 1];
                    if (nominator == "0")
                    {
                        symOpMatrix.Add(dim, 3, 0);
                    }
                    else
                    {
                        symOpMatrix.Add(dim, 3, Convert.ToDouble(denominator) / Convert.ToDouble(nominator));
                    }
                    dim++;
                }
                // format full symmetry string from symmetry matrix
                symOpMatrix.fullSymmetryString = symOpMatrix.ToFullSymString();
                sgSymMatrices.Add(symOpMatrix);
                symOpMatrix = new SymOpMatrix();
                preSg       = currentSg;
            }
            if (sgSymMatrices != null)
            {
                // add the last space group
                symOpList.Add(sgSymMatrices);
            }
            FindDuplicateSpaceGroups(ref symOpList);
            XmlSerializer xmlSerializer = new XmlSerializer(symOpList.GetType());
            TextWriter    symOpWriter   = new StreamWriter("symOps.xml", false);

            xmlSerializer.Serialize(symOpWriter, symOpList);
            symOpWriter.Close();
        }